A propriedade CSS scroll-initial-target oferece uma maneira declarativa, somente CSS, de trazer um elemento descendente específico para a área visível do contêiner de rolagem assim que ele é renderizado. Antes, os desenvolvedores dependiam de JavaScript (Element.scrollIntoView()) ou identificadores de fragmento do URL (#item-id), que têm limitações e são difíceis de implementar.
Como implementar
Para implementar isso:
- Garanta um contêiner de rolagem: o elemento de destino precisa estar dentro de um contêiner de rolagem (um elemento com overflow que permite a rolagem, como
overflow: auto). Pode ser qualquer elemento ancestral, incluindo o elemento raiz<html>. - Segmentar o item: aplique
scroll-initial-target: nearestao elemento descendente específico que você quer mostrar.
Exemplo de código: feed de mídia vertical
Neste exemplo, um feed começa rolando até um item "em destaque" específico, em vez de ir para o topo da lista.
/**
* TARGET: The item that should be visible on initial load.
*/
.item.target {
scroll-initial-target: nearest;
}
Implementação estratégica e práticas recomendadas
- RECOMENDAMOS usar
scroll-initial-targetpara experiências de "início no meio", como um calendário que começa no dia atual ou uma galeria que começa em uma imagem específica. - NÃO confunda isso com o foco de acessibilidade. Essa propriedade move apenas a janela de visualização visual, não o foco do teclado. Você precisa gerenciar manualmente o
element.focus()se o destino for o ponto de partida para usuários de teclado. - NÃO use essa propriedade se precisar de uma animação de rolagem suave no carregamento. Ela é discreta e define a posição instantaneamente durante a fase de layout.
- NÃO defina
scroll-initial-targetem vários elementos no mesmo contêiner rolável. Se vários elementos especificaremscroll-initial-target: nearest, o navegador vai selecionar o que aparecer primeiro na ordem da árvore do DOM. - FORNEÇA as dimensões da mídia. Como a posição de rolagem é calculada durante o layout inicial, verifique se as imagens ou os vídeos têm
aspect-ratioouheight/widthfixos para evitar que o destino mude após o carregamento da mídia. - CONSIDERE a hierarquia de precedência: um fragmento do URL (por exemplo,
example.com/#top) e a propriedadescroll-startno nível do contêiner têm precedência sobrescroll-initial-target.
Estratégia de fallback
Para navegadores que ainda não são compatíveis com a API, use um substituto de JavaScript. Use o evento DOMContentLoaded para garantir que o navegador role o elemento para visualização assim que a análise do HTML for concluída, proporcionando uma experiência mais rápida do que esperar que todas as imagens e recursos sejam carregados. Como alternativa, colocar o script no final do elemento <body> também é aceitável e evita a necessidade de um listener de eventos.
/**
* Progressive Enhancement Fallback
*/
document.addEventListener("DOMContentLoaded", () => {
// Check for native CSS support
if (!CSS.supports("scroll-initial-target", "nearest")) {
const feedTarget = document.querySelector(".item.target");
if (feedTarget) {
// 'block: center' ensures the featured media is centered in view
feedTarget.scrollIntoView({ behavior: "instant", block: "center" });
}
}
});