Logo

dev-resources.site

for different kinds of informations.

Como criar uma sticky navigation apenas com CSS

Published at
12/12/2023
Categories
css
webdev
portugues
Author
dougsource
Categories
3 categories in total
css
open
webdev
open
portugues
open
Author
10 person written this
dougsource
open
Como criar uma sticky navigation apenas com CSS

Nota: apenas traduzi o texto abaixo e postei aqui.

Sticky navs são componentes de navegação que ficam no topo da página conforme você "scrolla" ela para baixo.

Por muito tempo, fazer com que a navegação "fixasse" exigia o uso de JavaScript para detectar quando a navegação iria passar do topo da página e, em seguida, adicionar uma "css class" para mudar para position: absolute.

Mas hoje você pode usar uma propriedade CSS simples para obter o mesmo efeito. Vejamos como isso funciona.

position: sticky

A propriedade CSS position: sticky diz ao navegador para deixar um elemento "scrolar" com o resto do document até chegar ao topo da página.

Depois disso, ele deve ficar lá e deixar o restante dos elementos da página "scrollar" atrás dele.

.sticky {
    position: -webkit-sticky;
    position: sticky;
    top: 0;
}
Enter fullscreen mode Exit fullscreen mode
<nav class="sticky">
    <ul>
        <li><a href="#a">Seção A</a></li>
        <li><a href="#b">Seção B</a></li>
        <li><a href="#c">Seção C</a></li>
        <li><a href="#d">Seção D</a></li>
    </ul>
</nav>
Enter fullscreen mode Exit fullscreen mode

Aqui está uma demonstração para você brincar.

Fico continuamente impressionado com a capacidade do CSS de substituir JavaScript complexo por propriedades "de uma linha". Mais disso, por favor!

Compatibilidade do navegador

A propriedade position: sticky funciona em todos os navegadores modernos, mas atualmente não pode ser usada em elementos thead ou tr no Chrome ou Edge (embora funcione nos elementos th).

Não tem suporte no IE 11 e anteriores e em alguns navegadores mobile mais básicos.

Alguns navegadores webkit exigem o prefixo -webkit- (position: -webkit-sticky), então você deve sempre incluí-lo por enquanto.

Como evitar que anchor links "scrolem" para trás de um header fixo

Um problema com sticky headers são os anchor links. Por default, eles se ajustam ao topo do document, atrás do sticky navigation menu.

Você mesmo pode ver nesta demonstração.

Hoje, quero falar sobre um "CSS one-liner" que você pode usar para corrigir isso.

A propriedade scroll-margin-top

A propriedade scroll-margin-top permite definir uma "top margin" que o navegador deve usar ao "snapping" um elemento "scrolado" no lugar.

Em nossa demonstração, cada "anchored element" também possui uma classe CSS .section.

<article class="section" id="a">
    <h2>Section A</h2>
</article>
Enter fullscreen mode Exit fullscreen mode
.section {
    color: #ffffff;
    height: 75vh;
    margin: 0;
}
Enter fullscreen mode Exit fullscreen mode

Adicionaremos a propriedade scroll-margin-top a ela e daremos a ela o valor 1em.

.section {
    color: #ffffff;
    height: 75vh;
    margin: 0;
    scroll-margin-top: 1em;
}
Enter fullscreen mode Exit fullscreen mode

Agora, quando o navegador pular para o anchor link, deixará uma margin de 1em no topo.

Esta margin se aplica apenas ao scroll snapping. O elemento ainda possui suas margens normais dentro do contexto do document.

Aqui está uma demonstração.

Compatibilidade do navegador

A propriedade scroll-margin-top funciona em todos os navegadores modernos, mas não tem suporte para IE.

Fonte

Newsletter de Go Make Things

portugues Article's
30 articles in total
Favicon
Validação e Sanitização em Aplicações Web
Favicon
Golang básico - Comparação de Igualdade
Favicon
Guia de React re-render: tudo, tudo de uma vez
Favicon
Go + hot reload
Favicon
Como animar o scrolling para anchor links com CSS
Favicon
Como criar uma sticky navigation apenas com CSS
Favicon
Como usar requestAnimationFrame() com vanilla JS
Favicon
Como atualizar a URL do navegador sem refresh a página usando a vanilla JS History API
Favicon
Por que utilizar um elemento form quando submit campos com JavaScript?
Favicon
Quando um framework é melhor que a manipulação nativa do DOM
Favicon
Recursão com vanilla JavaScript
Favicon
Como usar async e await com vanilla JavaScript
Favicon
Construindo um show/hide disclosure component acessível com vanilla JS
Favicon
Eu <3 cascade!
Favicon
Você provavelmente não precisa de um DOMContentLoaded event em seu Javacript
Favicon
Formas de escrever Immediately Invoked Function Expression (IIFE) no JavaScript
Favicon
Event delegation e múltiplos seletores com vanilla JS
Favicon
Usando a propriedade CSS currentColor para contruir componentes extensíveis
Favicon
CurrentColor e SVGs
Favicon
WTF é gzipping (e como é diferente da minificação)?
Favicon
Como eu estruturo meus projetos vanilla JS
Favicon
Uma alternativa vanilla JS para o método moment.js timeFromNow()
Favicon
Recriando o método lodash partition() em vanilla JS
Favicon
Recriando o método lodash inRange() em vanilla JS
Favicon
Recriando o método lodash pull() em vanilla JS
Favicon
Como converter segundos para minutos e horas em vanila JS
Favicon
Gerando números randômicos com vanila JS
Favicon
Obtendo os meses formatados com vanila JS
Favicon
Como ser um desenvolvedor mais produtivo
Favicon
Como construir um site que carregue em menos de um segundo

Featured ones: