Categorias
Projetos
CSS

Como fazer menu off canvas da maneira mais fácil

Como fazer menu off canvas da maneira mais fácil

Você entra em um site através de seu dispositivo móvel. Em um canto superior, vê 3 risquinhos que todo mundo chama “menu hambúrguer” — pessoalmente, prefiro um duplo, o que daria em 4 risquinhos, mas temos que respeitar as convenções.

Você clica nesse ícone semi estranhoso e um menu desliza, ocupando todo o espaço em tela! Parabéns: você acabou de acionar um menu off canvas!

Um off-canvas menu é o menu que fica fora da área útil do site ou viewport (“off” do “canvas”) e, através de algum trigger que o irá acionar, aparece em tela, trazendo conteúdos importantes de navegação e, não raramente, outros tipos de interação e/ou informações.

Dentre as muuuitas maneiras de se conseguir um menu off canvas com CSS, neste tutorial você irá aprender a mais fácil delas. A que vai garantir um menu offcanvas rápido, elegante e profissa com pouquíssimas linhas de código.

HTML

Evidentemente, haverá muito mais código HTML em seu site do que o necessário para se fazer um menu off-canvas. Mas foquemos no essencial para em prol da didática.

Neste rumo, o código HTML para o menu off canvas é tão simples quanto:

<button class="c-button js-offcanvas-trigger">Menu</button>
<div class="c-offcanvas-menu js-offcanvas-menu">
Conte&uacute;do do menu off-canvas...
</div>

Quer dizer, só o que é preciso é do conteúdo do menu, propriamente dito, e um acionador/trigger qualquer para fazer com que a interação aconteça.

CSS

Novamente, em prol da objetividade do tutorial, omitamos o código necessário para estilizar o botão acionador do menu. Você pode fazê-lo como quiser (ou demandar o projeto) que não fará muita diferença.

O que realmente importa, aqui, é como o elemento c-offcanvas-menu deve ser estilizado para que cumpra:

  • Ocupar toda a dimensão da viewport (largura e altura)
  • Ficar visível ou invisível sob demanda
  • Estar sempre à disposição, independentemente do scroll da página

Para tanto, usemos o seguinte código CSS (ligeiramente diferente do mostrado no vídeo para ficar mais apresentável e condizente a cenários do mundo real):

.c-offcanvas-menu {
align-items: center;
background-color: #363636;
color: #fcfcfc;
display: flex;
height: 100vh;
justify-content: center;
left: 0;
position: fixed;
top: 0;
transform: translateX(-100%);
transition: all 235ms cubic-bezier(.95, .05, .795, .035);
width: 100vw;
}

O grande segredo da técnica é transform: translateX(-100%), que faz com que o menu fique fora da tela.

Mas, uma vez acionado, é preciso que ele apareça. Então, se o valor de transform é responsável por ele ficar fora, o que é preciso? Simples: “resetar” e garantir que ele fique em sua posição “original”.

.c-offcanvas-menu.is-active {
transform: none;
transition: all 205ms cubic-bezier(.19, 1, .22, 1);
}

Ou seja, quando, no elemento, também houver a classe is-active, a transformação cessará de surtir qualquer efeito, o que, em conjunto com o transition (com um bom easing), garantam o efeito slide.

JavaScript

Então, agora só falta controlar as interações para que a classe is-active seja colocada ou retirada de .c-offcanvas-menu conforme seja necessário.

O código JavaScript para isso é tão simples quanto:

const trigger = document.querySelector( '.js-offcanvas-trigger' )
const offcanvas = document.querySelector( '.js-offcanvas-menu' )
trigger.addEventListener( 'click', toggleMobileMenu )
function toggleMobileMenu() {
offcanvas.classList.toggle( 'is-active' )
}

O “mistério”, aqui, é garantir que a classe is-active seja colocada e retirada do elemento alternadamente, conforme cliques no trigger js-offcanvas-trigger.

Explicando melhor: caso o elemento js-offcanvas-menu não tenha a classe is-active, ela será adicionada no clique do trigger; caso tenha, ela será retirada.

Conclusão

Existem diversas técnicas para se conseguir o efeito do menu off-canvas. Dificilmente, você irá encontrar uma mais simples e que exija tão pouco código para funcionar.

Evidentemente, é necessário arranjar os complementos necessários, como ajustar breakpoints para exibição do menu/interações, harmonizar com o “menu desktop” etc., mas, essencialmente, é dessa forma que se faz o menu off-canvas mais simples que você respeita!