Fixar o menu no topo da página é um recurso que é muito utilizado em sites e blogs, esse recurso permite deixar o menu sempre disponível para o usuário, para que não seja preciso rolar toda a página de volta ao topo para poder navegar pelo site ou blog.
Esse recurso não é complicado de fazer, pode-se conseguir esse efeito apenas com CSS, mas demonstrarei como fazer apenas com CSS e também com auxílio de JavaScript.
Fixar menu no topo - HTML e CSS
HTML
Primeiro vamos criar um HTML básico para demonstrar a funcionalidade.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="author" content="Everson da Luz">
<title>Fixar menu no topo - CSS</title>
</head>
<body>
<header class="header">
<nav class="menu">
<ul>
<li>
<a href="#">Home</a>
</li>
<li>
<a href="#">Sobre</a>
</li>
<li>
<a href="#">Produtos</a>
</li>
<li>
<a href="#">Contato</a>
</li>
</ul>
</nav>
</header>
<main class="main">
<section class="content">
<h1>Titulo da página</h1>
<p>
Lorem Ipsum is simply dummy text of the printing and typesetting industry.
Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,
when an unknown printer took a galley of type and scrambled it to make a type specimen book.
It has survived not only five centuries, but also the leap into electronic
typesetting, remaining essentially unchanged
</p>
</section>
</main>
<footer class="footer">
<p>Todos os direitos reservados</p>
</footer>
</body>
</html>
CSS
Vamos adicionar um estilo para deixar mais claro o exemplo.
* {
margin: 0;
padding: 0;
}
.header {
width: 100%;
}
.menu {
background-color: #666666;
text-align: center;
}
.menu ul li {
display: inline-block;
}
.menu ul li a {
display: block;
color: #FFFFFF;
padding: 30px 10px;
}
.main {
padding: 50px 0;
}
.content {
width: 80%;
margin: auto;
padding: 30px;
background-color: #eff0f1;
height: 1000px;
}
.content h1 {
margin-bottom: 30px;
}
.footer {
background-color: #eff0f1;
text-align: center;
padding: 50px 0;
}
Agora a única coisa que falta é deixar o menu fixo no topo da página,
e para isso, vou demonstrar como fazer utilizando o position: sticky
, position: fixed
, e também com JavaScript.
Utilizando position sticky
O valor sticky
da propriedade position
foi introduzido no CSS em meados de 2016.
E para essa finalidade ele é muito útil, pois, o valor sticky
funciona como um hibrido entre o
position: relative
e o position: fixed
, fazendo o elemento se comportar de forma relativa dentro do seu elemento pai
até que se role a página até alcançar o seu topo, e depois disso ele se torna fixo na tela.
Se quer saber mais o que é position: relative
e position: fixed
, e também sobre outros valores da propriedade position
,
acesse esse link position-css, nele eu explico com detalhes sobre cada valor da propriedade position
.
Voltando ao assunto, adicione o pedaço de trecho de código em seu CSS:
.header {
position: -webkit-sticky; /* Necessário para funcionar no Safari */
position: sticky;
top: 0;
}
Apenas isso já será o suficiente para deixar o menu fixo no topo,
o problema de fazer dessa forma é que até o momento da escrita desse artigo, o position: sticky
ainda não é suportado pelo IE e versões inferiores do Edge 15, e também, o Safari requer um prefixo -webkit-
para funcionar.
Utilizando position fixed
Outra forma de fixar o menu no topo apenas com CSS é utilizando o position: fixed
mantendo o menu sempre fixo no topo da página. Mas como os elementos definidos como position: fixed
ficam por cima de outros elementos, devemos colocar um pequeno espaço no topo da página
utilizando margin
ou padding
no elemento body
,
esse espaço pode ser exatamente a altura do menu. Adicione o seguinte trecho de código em seu CSS:
body {
padding-top: 80px; /* Altura do menu */
}
.header {
position: fixed;
top: 0;
}
Utilizando JavaScript
Para fixar o menu no topo utilizando JavaScript você deve saber a distância atual do menu em relação à página, e depois cada vez que a página for rolado, comparar se o top da página ultrapassou essa distância. Coloque a função a seguir em sua página:
window.onload = function(e) {
var offset = document.getElementsByClassName('header')[0].offsetTop;
var menu = document.getElementsByClassName('header')[0];
document.addEventListener('scroll', function() {
if (document.body.scrollTop > offset || document.documentElement.scrollTop > offset) {
menu.style.position = 'fixed';
} else {
menu.style.position = 'initial';
}
});
}
Apenas esse trecho de código JavaScript já é o suficiente, não precisa alterar seu CSS.
Conclusão
Optando por qualquer uma dessas formas você consegue obter o recurso de fixar o menu no topo. Vou deixar uma demonstração com o código completo de cada uma delas nos links abaixo.