Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ao lidarmos com suporte a atributos específicos na tag viewport, principalmente aqueles relacionados à experiência de interação com o teclado virtual, nos deparamos com limitações de compatibilidade. Um caso clássico é o suporte ao valor resizes-content no atributo interactive-widget que foi introduzido na versão 108 do Chrome, e também aparenta estar em testes no Firefox. Entretanto, no iOS Safari, até a versão 17.4, essa funcionalidade ainda não é suportada, o que gera um impacto direto na experiência do usuário.
O valor resizes-content tem a proposta de fazer o navegador 'empurrar' o conteúdo da página para cima quando o teclado virtual é ativado, ao invés de sobrepor o teclado na tela. Essa abordagem é especialmente desejável para layouts que precisam manter elementos visíveis ou acessíveis durante a digitação, sem que o teclado cubra partes importantes da interface.
No entanto, no ambiente iOS Safari, o comportamento padrão é que o navegador não ajusta automaticamente o layout dessa maneira. Além disso, manipulações tradicionais, como ajustar dinamicamente a altura do documento ao detectar o evento de resize do visualViewport, encontram dificuldades, pois o Safari realiza ajustes internos que impedem um controle preciso. Essa magia do Safari cria um cenário onde soluções simples de polyfill se tornam ineficazes, uma vez que o próprio navegador gerencia a extensão do documento de formas não previsíveis. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Antes de tentar uma solução, é importante verificar se o navegador realmente suporta o recurso. Uma abordagem é checar a propriedade navigator.virtualKeyboard.overlaysContent, que indica se o teclado se sobrepõe ao conteúdo, porém, no Safari, essa propriedade não é suportada. Assim, a estratégia passa a ser detectar suportes específicos ou comportamentos de fallback, como testar mudanças na altura do visualViewport ou na propriedade innerHeight do window.
Apesar das limitações, uma estratégia possível é criar um evento de escuta para mudanças na altura do viewport e, com base nisso, ajustar o layout manualmente. Um exemplo prático seria:
function ajustarLayout() {
document.documentElement.style.setProperty('--viewport-height', window.visualViewport.height + 'px'). } Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
if (window.visualViewport) {
window.visualViewport.addEventListener('resize', ajustarLayout). // Inicializa o layout
ajustarLayout(). } A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Porém, como mencionado, o Safari faz ajustes internos que podem invalidar essa abordagem, especialmente ao abrir o teclado perto do limite da página. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Outra alternativa é manipular o comportamento do scroll ou do foco para tentar forçar o layout desejado, como focar o elemento de entrada antes de ajustar a altura, ou usar um elemento auxiliar de scroll para dar a sensação de movimento da página. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Essas soluções, contudo, não são perfeitas e podem introduzir efeitos colaterais, como saltos de scroll ou movimentos não naturais na interface. Além disso, elas podem precisar de ajustes específicos para diferentes layouts ou tamanhos de tela. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Para um controle mais estável, o ideal seria monitorar continuamente o comportamento do teclado e ajustar a UI com animações suaves, usando requestAnimationFrame para evitar repetições excessivas. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Por fim, é importante avaliar se o esforço de implementar um polyfill vale a pena frente ao impacto na experiência do usuário, ou se é melhor aceitar o comportamento padrão do Safari e orientar o usuário a ajustar sua interação. A decisão fica mais saudável quando o time consegue medir o impacto depois. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Logo, a recomendação é testar exaustivamente essas abordagens e manter uma comunicação clara na interface, informando que nem todos os browsers suportam essa funcionalidade de forma nativa. Assim, evitamos frustrações e garantimos uma experiência mais consistente dentro das limitações existentes. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Carregando comentários...