Criando um menu animado lateral com HTML, CSS e Javascript

Vamos aprender nesse artigo um simples e prático efeito de mostrar e ocultar um menu apenas com recursos nativos.

PHP Moderno: Criando uma aplicação com área administrativa

Criar um site não é uma tarefa simples e rápida, nós desenvolvedores muitas das vezes recorremos a bibliotecas como jQuery, por exemplo, afim de otimizar nosso tempo e entregar o produto o mais rápido para o cliente, não é mesmo?

O problema de se usar bibliotecas de terceiros são vários, dentre eles podemos listar:

  • Falta de atualização;
  • Linhas de códigos mal otimizadas;
  • Linhas de códigos desnecessárias;
  • Entre outros.

No passado o jQuery era uma biblioteca amplamente utilizada em qualquer site, porém nos dias atuais os desenvolvedores estão removendo esses scripts dos seus sites, visto os problemas citados acima e até mesmo pelo fato das linguagens nativas como CSS e Javascript possuir muitas das funcionalidades necessárias.

Veremos adiante como criar um menu de navegação vertical que fica na lateral do site, porém, quando clicamos em determinados botões o menu some ou aparece.

Confira a nossa videoaula explicando todo o processo de criação, desde a montagem do escopo da página até o nosso efeito.

O segredo está basicamente na classe CSS de transição, ela fará com que qualquer alteração seja executada de forma suave e a partir disso, a gente define os valores diretamente no Javascript através dos cliques nos botões.

Confira os códigos utilizados na videoaula.

index.html

<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Menu animado - SatellaSoft</title>

    <link rel="preload" href="assets/css/style.css" as="style">
    <link rel="preload" href="assets/js/script.js" as="script">

    <link rel="stylesheet" href="assets/css/style.css">
</head>

<body>

    <header>
        <img src="assets/img/menu.svg" alt="Clique para abrir ou fechar o menu" id="btnMenu">
    </header>

    <div class="content">
        <p>Lorem ipsum dolor sit, amet consectetur adipisicing elit. Itaque eius fugit nesciunt ad? Sint aperiam velit
            esse sapiente soluta, non enim ea maiores a, quis quo? Deleniti eos earum ducimus.</p>
    </div>

    <div id="menu" class="menu effect">
        <nav>
            <div style="text-align: right;">
                <button id="btnClose">X</button>
            </div>
            <ul>
                <li><a href="#">Frutas</a></li>
                <li><a href="#">Link aqui</a></li>
                <li><a href="#">Link aqui</a></li>
                <li><a href="#">Link aqui</a></li>
                <li><a href="#">Link aqui</a></li>
                <li><a href="#">Link aqui</a></li>
            </ul>
        </nav>
    </div>

    <script src="assets/js/script.js"></script>
</body>

</html>

style.css

:root {
    --menu-size: 250px;
}

* {
    margin: 0;
    padding: 0;
    border: none;
    box-sizing: border-box;
    outline: none;
    font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
}

body {
    background-color: #eee;
}

header {
    background-color: rgb(21, 22, 29);
    padding: 10px;
    text-align: center;
}

.content {
    max-width: 800px;
    width: 100%;
    margin: 0 auto;
    margin-top: 50px;
}

#btnMenu {
    cursor: pointer;
    padding: 5px;
    transition: all 0.5s;
}

#btnMenu:hover {
    border-radius: 50%;
    cursor: pointer;
    background-color: rgb(41, 57, 98);
}

#btnMenu:active {
    background-color: rgb(3, 4, 7);
}

#btnClose {
    padding: 8px;
    background-color: rgb(78, 37, 37);
    color: #fff;
    font-size: 20px;
    font-weight: bold;
}

#btnClose:active {
    background-color: rgb(151, 73, 73);
}

.menu {
    position: fixed;
    top: 0;
    width: var(--menu-size);
    height: 100%;
    background-color: rgb(40, 42, 54);
}

.menu ul {
    list-style: none;
}

.menu ul li {
    display: block;
}

.menu ul li a {
    transition: background 0.3s;
    display: block;
    color: #fff;
    font-size: 19px;
    text-decoration: none;
    text-transform: uppercase;
    padding: 10px 15px;
}

.menu ul li a:hover {
    background-color: rgb(49, 54, 85);
}

.effect {
    transition: margin 0.4s;
}

@media (min-width: 768px) {
    #btnClose {
        display: none;
    }
}

script.js

'use strict'

const menuSize = '250px';

let open = true;

document.querySelector('#btnMenu').addEventListener('click', e => {
    open = !open;
    toggleMenu();
})

document.querySelector('#btnClose').addEventListener('click', e => {
    open = false;

    toggleMenu();
})

function toggleMenu() {
    if (open) {
        document.querySelector('#menu').style.marginLeft = 0;
        return;
    }

    document.querySelector('#menu').style.marginLeft = `-${menuSize}`;
}