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