-
Notifications
You must be signed in to change notification settings - Fork 1
Menu Mobile Simples
Para fazer esse menu mobile simples você precisa de pelo menos 3 estruturas:
-
.side-menu: o menu em si; -
.page-wrapper: todo o restante do site; -
.menu-toggle: um botão para mostrar e esconder o menu.
<!-- Side Menu -->
<nav class="side-menu">
<ul>
<li><a class="item" href="#">Item 1</a></li>
<li><a class="item" href="#">Item 2</a></li>
<li><a class="item" href="#">Item 3</a></li>
<li><a class="item" href="#">Item 4</a></li>
</ul>
</nav>
<!-- Page Wrapper -->
<div class="page-wrapper">
<header class="fixed-header">
<h1 class="logo">Site Name</h1>
<!-- Menu Toggle -->
<a class="menu-toggle" href="#">
<i class="fa fa-bars" aria-hidden="true"></i>
</a>
</header>
<div>
<h2>This is the page content</h2>
<p>Everything else should come here.</p>
</div>
</div> <!-- / Page Wrapper -->É possível fazer isso de pelo menos duas maneiras bem parecidas:
-
O
.side-menufica escondido por trás do conteúdo principal da página, o.page-wrapper. Ao clicar no botão, o conteúdo da página é movido para um dos lados até revelar completamente o menu. -
O
.side-menufica é movido para a esquerda até sair de vista utilizandotransform: translate3d(). Ao clicar no botão, o conteúdo da página se move da mesma forma que no caso anterior, mas o menu também se move na mesma direção para ser revelado.
Vamos fazer das duas formas, que são bem parecidas. A estrutura HTML e JS é a mesma.
O CSS é a parte mais extensa na criação do menu.
Vamos começar com o primeiro tipo de menu. Os estilos essenciais para o funcionamento dele são:
body {
overflow-x: hidden;
}
.page-wrapper {
position: relative;
background: white;
z-index: 1;
}
.side-menu {
position: absolute;
top: 0;
left: 0;
overflow-y: auto;
height: 100%;
width: 250px;
}O que está acontecendo aqui é o seguinte:
Em body:
- Utilizamos
overflow-x: hiddenpara impossibilitar a rolagem acidental para os lados (rolar para os lados nunca é agradável). Como o menu vai empurrar o conteúdo para o lado, uma barra de rolagem apareceria sem essa propriedade.
Em .page-wrapper:
- A posião de
.page-wrapperérelativepara que possamos aplicar oz-index. Ele pode ser qualquer valor, desde que seja maior que oz-indexdo.side-menu. - O fundo de cor branca deixa o menu lateral invisível. Afinal, ele está logo atrás do conteúdo principal da página!
Em .side-menu:
-
position: absolutefaz o menu sair do fluxo normal da página e pode ser manipulado com as propriedadestop,left, etc, que nesse caso estão fixando o menu no canto superior esquerdo. -
overflow-y: autofará uma barra de rolagem aparecer no eixo y, mas apenas quando necessário. Deixa o menu mais bonito se a rolagem não for necessária. -
height: 100%faz que o menu ocupe todo o espaço vertical abaixo dele, não só o que ele precisa, que é o padrão. -
widthdefine a largura do menu. Escolha o valor que permita uma boa visibilidade.
Agora vamos adicionar o CSS que fará o menu se mover:
.menu-active .page-wrapper {
transform: translate3d(250px, 0, 0);
}É bem simples:
- O
translate3dem.menu-active .page-wrappermoverá todo o conteúdo da página em250pxpara a direita, mostrando todo o menu, que também tem250px. Sim, esses dois valores precisam ser iguais.
body {
overflow-x: hidden;
}
.page-wrapper {
position: relative;
background: white;
}
.side-menu {
position: absolute;
top: 0;
left: 0;
overflow-y: auto;
height: 100%;
width: 250px;
transform: translate3d(-100%, 0, 0);
}O funcionamento aqui é bem similar ao anterior. As propriedades removidas em comparação com a forma anterior realmente não são necessárias aqui. Só há uma adição:
-
transform: translate3d(-100%, 0, 0)faz que o menu se mova 100% para a esquerda. Ou seja, ele é movido exatamente a distância necessária para sumir da tela.
O background continua porque com ele a animação parece ser mais suave.
Agora para o CSS que que fará tudo se mover:
.menu-active .page-wrapper {
transform: translate3d(250px, 0, 0);
}
.menu-active .side-menu {
transform: translate3d(0,0,0);
}Aqui temos uma adição:
- o
translate3dem.menu-active .side-menufaz o menu voltar à posição original, já que ele estava fora da tela por conta dotransformanterior;
Tudo terminado no CSS. Só falta adicionar o JS.
Agora para fazer o clique no botão .menu-toggle mostrar e esconder o menu precisaremos utilizar JavaScript, mas não se preocupe, é bastante simples.
var menuToggle = document.querySelector('.menu-toggle');
menuToggle.addEventListener('click', function(e) {
document.body.classList.toggle('menu-active');
e.preventDefault();
});Sim, é só isso. Esse código faz o seguinte:
- Captura o botão que ativa o menu (de classe
.menu-toggle); - Fica atento a qualquer clique no botão;
- Adiciona ou remove a classe
.menu-activeaobodyse ela estiver presente ou não.
Pronto, é só adicionar o CSS e o JS no HTML e ver tudo funcionando. Deve estar bem feio porque não há estilos para embelezar a página, mas se quiser ver um exemplo estilizado, é só ver esse pen.