SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
08.12.2024

Atraso no Renderização do Safari no iPad Durante a Rolagem

Resposta Rápida

Para superar os desafios de elementos desaparecendo e do atraso durante a rolagem no Safari do iPad, utilize a contenção CSS (contain: paint). Esse método restringe as áreas que precisam ser repintadas. Use-o juntamente com a aceleração GPU (transform: translateZ(0)) para obter animações suaves. Também é essencial lidar com os eventos de rolagem de forma a evitar que o JavaScript fique sobrecarregado com atividades desnecessárias.

.elemento-rolavel {
  contain: paint;
  transform: translateZ(0); /* como ativar o modo turbo */
}

Lembre-se de testar quaisquer alterações feitas para prevenir problemas potenciais.

Forçando a Aceleração GPU

Ativar a aceleração GPU pode melhorar significativamente a suavidade das animações e a responsividade de aplicações web. Usar transform: translate3d(0,0,0) ou transform: translateZ(0) solicita ao navegador que realize cálculos de posicionamento na GPU, que é ideal para essa tarefa.

.elemento {
  transform: translateZ(0); /* chamando a GPU para ajudar */
}

Monitore o Desempenho da Sua Aplicação

O uso descuidado de transformações pode degradar o desempenho e causar problemas com z-index. Tudo deve ser feito com sabedoria: aplique transformações onde elas realmente ofereçam vantagens.

Use Animações Direcionadas

É preferível aproveitar propriedades de layout dentro de animações e @keyframes para provocar a repintura somente quando realmente necessário. Dessa forma, você pode maximizar os benefícios das transformações sem afetar adversamente a página inteira.

@keyframes repintura-direcionada {
  from { transform: translate3d(0, 0, 0); }
  to { transform: translate3d(0, 0, 0); }
}
.elemento {
  animation: repintura-direcionada 1s infinite;
}

Visualização

Veja como o comportamento do elemento se apresenta durante a rolagem:

Estado Inicial: [👁️‍🗨️ Elemento 1, 👁️‍🗨️ Elemento 2, 👁️‍🗨️ Elemento 3]
Durante a Rolagem: [🌀 Elemento 1 (desaparecendo), 👁️‍🗨️ Elemento 2, 🌀 Elemento 3 (desaparecendo)]
Após a Rolagem: [⏳ Elemento 1 (reiniciando), 👁️‍🗨️ Elemento 2, ⏳ Elemento 3 (reiniciando)]

Pode-se dizer que estamos jogando um jogo de boliche com o motor físico do iOS: os elementos desaparecem e reaparecem durante a rolagem.

Resolvendo Atrasos de Renderização

O conhecido -webkit-overflow-scrolling: touch oferece uma rolagem suave, mas pode criar um problema: o Safari não renderiza elementos que estão fora da tela. Para realmente resolver esse problema, utilize a contenção CSS juntamente com a aceleração GPU.

.elemento {
  contain: paint;
  transform: translateZ(0); /* uma combinação comprovada */
}

Use Transformações com Sabedoria

O uso excessivo de translate3d pode causar falhas e problemas com z-index, semelhante à confusão na saída de um teatro lotado. Aplique transform de forma consciente e conforme a intenção. Lembre-se, tudo com moderação.

Consulte Recursos Aprofundados

Para entender melhor esses métodos, visite os links fornecidos. O material número quatro é particularmente recomendado, pois discute métodos para melhorar o desempenho por meio da aceleração de hardware CSS.

Materiais Úteis

  1. will-change - CSS: Folhas de Estilo em Cascata | MDN — A propriedade will-change avisa os navegadores sobre mudanças futuras nos atributos dos elementos.
  2. Desenvolvendo Conteúdo Web para Safari — Recomendações oficiais da Apple para otimizar conteúdo web para iOS.
  3. Projetando Sites para iPhone X | WebKit — Sobre como otimizar a velocidade de rolagem em dispositivos iOS.
  4. Janela: método requestAnimationFrame() - Web API | MDN — O método requestAnimationFrame para atualizações visuais suaves.
  5. Desempenho de Renderização | Artigos | web.dev — Melhores práticas para melhorar a velocidade de renderização.
  6. z-index - CSS: Folhas de Estilo em Cascata | MDN — Gerenciando sobreposição de conteúdo usando z-index.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!