Criando speedDial usando css
Criando speedDial usando css e Javascript.
Introdução
Criando speedDial usando css, neste tutorial irei demonstrar como criar um componente do estilo SpeedDial usando apenas css e o javscript para animar o componente.
O que é o SpeedDial
O SpeedDial nada mais é que um componente estilizado criado para representar uma simples lista de links, cujo objetivo é facilitar a exibição de links de forma ordenada em determinadas direções.
Existem várias formas de se apresentar um speeddial, sendo elas de forma linear vertical , linear horizontal, circular e semicircular.
Neste tutorial irei demonstrar a forma o speeddial no formato linear vertical, listando os itens um abaixo do outro.
Criando speedDial usando css
Vamos implementar o nosso componente, a primeira ação que devemos executar é a criação da estrutura da página e a estrutura do speeddial .
Logo abaixo mostro o código que utilizei para criar a estrutura do nosso projeto.
Você pode verificar que criei o corpo da página e adicionei uma tag que contem o título da nossa página e em seguida o botão responsável por exibir os links do nosso componente (speeddial).
Para agrupar os links do speeddial utilizei a tags (ul e li) contendo os links.
Já para criar os ícones utilizei a lib ionicons, você pode verificar no final da estrutura da página que adicionei os links de importação do ionicons.
<!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"> <link rel="stylesheet" href="style.css"> <title>SpeedDial</title> </head> <body> <div class="container"> <h2 class="title">SpeedDial</h2> <div class="speeddial"> <button type="button" class="speeddial-button"> <ion-icon name="add"></ion-icon> </button> <ul class="speeddial-list"> <li class="speeddial-item" style="transition-delay: 120ms;"> <a class="speeddial-action" href="#"> <ion-icon name="home-outline"></ion-icon> </a> </li> <li class="speeddial-item" style="transition-delay: 90ms;"> <a class="speeddial-action" href="#"> <ion-icon name="flash"></ion-icon> </a> </li> <li class="speeddial-item" style="transition-delay: 60ms;"> <a class="speeddial-action" href="#"> <ion-icon name="bulb-outline"></ion-icon> </a> </li> <li class="speeddial-item" style="transition-delay: 30ms;"> <a class="speeddial-action" href="#"> <ion-icon name="flash-outline"></ion-icon> </a> </li> <li class="speeddial-item" style="transition-delay: 0ms;"> <a class="speeddial-action" href="#"> <ion-icon name="flash-outline"></ion-icon> </a> </li> </ul> </div> </div> <script src="main.js"></script> <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script> <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script> </body> </html>
Após terminarmos a implementação da estrutura do componente, vamos adicionar estilo para ele, logo abaixo mostro todo o código utilizado para estilização do nosso componente.
*, *:after, *:before { margin: 0; padding: 0; border: 0; font-size: 100%; vertical-align: baseline; text-decoration: none; } body { height: 100vh; display: flex; justify-content: center; align-items: center; background-color: #333867; } .container { display: flex; flex-direction: column; justify-content: center; gap: 20px; } .title { padding: 0.8rem; border-radius: 6px; background: #17193b; text-align: center; color: orange; font-weight: 900; font-size: 24px; } .speeddial { align-items: center; flex-direction: column; display: flex; z-index: 2; } .speeddial-button { display: flex; align-items: center; justify-content: center; padding: 10px; background: #2196f3; color: #fff; border-radius: 50%; font-size: 50px; transition: 0.3s all ease-in-out; box-shadow: rgba(0, 0, 0, 0.4) 0px 2px 4px, rgba(0, 0, 0, 0.3) 0px 7px 13px -3px, rgba(0, 0, 0, 0.2) 0px -3px 0px inset; } .speeddial-button:active { background-color: orange; transform: scale(0.9); transition: all 0.3s ease-in-out; } .speeddial-list { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; align-items: center; justify-content: center; transition: top 0s linear 0.2s; pointer-events: none; } .speeddial-item { transform: scale(0); opacity: 0; margin: 0.25rem 0; transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms, opacity 0.8s; will-change: transform; } .speeddial-action { width: 3rem; height: 3rem; display: flex; align-items: center; justify-content: center; border-radius: 50%; position: relative; overflow: hidden; background: #495057; color: #fff; box-shadow: rgba(0, 0, 0, 0.4) 0px 2px 4px, rgba(0, 0, 0, 0.3) 0px 7px 13px -3px, rgba(0, 0, 0, 0.2) 0px -3px 0px inset; } .speeddial-opened .speeddial-list { pointer-events: auto; } .speeddial-opened .speeddial-item { transform: scale(1); opacity: 1; } .speeddial-opened .speeddial-button { transform: rotate(45deg); }
Pronto agora vamos para animação do nosso componente, conforme a estrutura que criamos vamos adicionar uma ação para o botão do speeddial.
Logo abaixo mostro como ficou o nosso código em javascript, que adiciona funcionalidade para o botão do speeddial.
const speedDial = document.querySelector(".speeddial"); const speedDialButton = document.querySelector(".speeddial-button"); speedDialButton.onclick = function (e) { e.preventDefault(); speedDial.classList.toggle("speeddial-opened"); };
Explicando o código acima, no código acima estou obtendo a referência do speeddial e do botão do speeddial e armazenando na variáveis (speedDial e speedDialButton ).
Logo após adiciono no listener de (click) do botão a funcionalidade para alternar a ação de abrir e fechar o speeddial.
No final será gerado um componente conforme a figura abaixo:
Segue abaixo o link do vídeo com a animação do componente :
Vídeo Tutorial:
Código fonte do tutorial: