WEBLEB
Inicio
Editora de código
Iniciar sesión
Pro
Español
English
Français
Español
Português
Deutsch
Italiano
हिंदी
Menú desplegable con CSS
9012
webleb
Publica tu código
Recomendado
28 March 2023
Conexión de formulario a base de datos con Php
26 June 2024
Resplandor al pasar el menú
19 March 2025
Botón de confeti
index.html
Copy
Webleb
Facebook
styles.css
Copy
@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap"); *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } :root { --bg-color: #033ac5; --primary-bg-color: #333740; --primary-color: #2c62f6; --text-color: #b1b8ca; --text-active: #ffffff; --button-hover-bg-color: #2b2e34; --border-color: #494d59; --dropdown-height: 0; --rotate-arrow: 0; --translate-value: 0; --list-opacity: 0; --transition-time: 0.4s; --transition-timing: cubic-bezier(0.25, 0.46, 0.45, 0.94); --border-radius: 1.4rem; --list-button-height: 4.6rem; --floating-icon-size: 26; --floating-icon-top: 0; --floating-icon-left: 0; } html { font-size: 62.5%; } html, body { height: 100%; } body { display: flex; flex-direction: column; align-items: center; padding: 1.5rem; line-height: 1.4; background: #00B4DB; /* fallback for old browsers */ background: -webkit-linear-gradient(to right, #0083B0, #00B4DB); /* Chrome 10-25, Safari 5.1-6 */ background: linear-gradient(to right, #0083B0, #00B4DB); /* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */ } button { border: none; cursor: pointer; background-color: transparent; outline: none; } svg { height: 1.6rem; width: 1.6rem; } .text-truncate { text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } .dropdown-container { margin-top: 30vh; display: flex; flex-direction: column; width: 100%; max-width: 34rem; } .dropdown-title-icon, .dropdown-arrow { display: inline-flex; } .dropdown-title { margin: 0 auto 0 1.8rem; text-transform: capitalize; } .dropdown-button { font-family: "Roboto", sans-serif; font-weight: 400; font-size: 1.7rem; display: flex; align-items: center; padding: 0 1.8rem; } .dropdown-button svg { transition: all var(--transition-time) var(--transition-timing); fill: var(--text-color); } .dropdown-button svg, .dropdown-button span { pointer-events: none; } .dropdown-button:hover, .dropdown-button:focus { color: var(--text-active); } .dropdown-button:hover svg, .dropdown-button:focus svg { fill: var(--text-active); } .main-button { height: 5.2rem; border-radius: var(--border-radius); color: var(--text-color); background-color: var(--primary-bg-color); border: 0.1rem solid var(--border-color); transition: all var(--transition-time) var(--transition-timing); } .main-button:focus { border: 0.1rem solid var(--primary-color); box-shadow: 0 0 0 0.2rem rgba(44, 98, 246, 0.4); } .main-button .dropdown-arrow { transition: transform var(--transition-time) var(--transition-timing); transform: rotate(var(--rotate-arrow)); margin-left: 1.8rem; } .list-button { height: var(--list-button-height); transition: color var(--transition-time) var(--transition-timing); color: var(--text-color); overflow: hidden; } .dropdown-list-container { overflow: hidden; max-height: var(--dropdown-height); transition: max-height var(--transition-time) var(--transition-timing); } .dropdown-list-wrapper { margin-top: 1rem; padding: 1rem; background-color: var(--primary-bg-color); border-radius: var(--border-radius); border: 0.1rem solid var(--border-color); position: relative; } ul.dropdown-list { position: relative; list-style-type: none; } ul.dropdown-list::before { content: ""; position: absolute; top: 0; right: 0; left: 0; z-index: 0; opacity: 0; height: var(--list-button-height); background-color: var(--button-hover-bg-color); transition: all var(--transition-time) linear; transform: translateY(var(--translate-value)); border-radius: var(--border-radius); pointer-events: none; } ul.dropdown-list:hover::before, ul.dropdown-list:hover ~ .floating-icon { opacity: 1; } li.dropdown-list-item { display: flex; flex-direction: column; position: relative; z-index: 1; opacity: var(--list-opacity); transition: opacity 0.8s var(--transition-timing); } .floating-icon { height: calc(var(--floating-icon-size) * 1px); width: calc(var(--floating-icon-size) * 1px); position: absolute; top: var(--floating-icon-top); left: var(--floating-icon-left); background-color: var(--border-color); border-radius: 1rem; pointer-events: none; opacity: 0; transition: opacity var(--transition-time) var(--transition-timing); z-index: 2; display: inline-flex; align-items: center; justify-content: center; } .floating-icon svg { fill: var(--text-active); }
main.js
Copy
const root = document.documentElement; const dropdownTitleIcon = document.querySelector(".dropdown-title-icon"); const dropdownTitle = document.querySelector(".dropdown-title"); const dropdownList = document.querySelector(".dropdown-list"); const mainButton = document.querySelector(".main-button"); const floatingIcon = document.querySelector(".floating-icon"); const icons = { linkedin: "M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854V1.146zm4.943 12.248V6.169H2.542v7.225h2.401zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248-.822 0-1.359.54-1.359 1.248 0 .694.521 1.248 1.327 1.248h.016zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016a5.54 5.54 0 0 1 .016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225h2.4z", instagram: "M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z", facebook: "M16 8.049c0-4.446-3.582-8.05-8-8.05C3.58 0-.002 3.603-.002 8.05c0 4.017 2.926 7.347 6.75 7.951v-5.625h-2.03V8.05H6.75V6.275c0-2.017 1.195-3.131 3.022-3.131.876 0 1.791.157 1.791.157v1.98h-1.009c-.993 0-1.303.621-1.303 1.258v1.51h2.218l-.354 2.326H9.25V16c3.824-.604 6.75-3.934 6.75-7.951z", twitter: "M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z", youtube: "M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104.022.26.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105-.009.104c-.05.572-.124 1.14-.235 1.558a2.007 2.007 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006-.087-.004-.171-.007-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.007 2.007 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31.4 31.4 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103.003-.052.008-.104.022-.26.01-.104c.048-.519.119-1.023.22-1.402a2.007 2.007 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007.172-.006.086-.003.171-.007A99.788 99.788 0 0 1 7.858 2h.193zM6.4 5.209v4.818l4.157-2.408L6.4 5.209z" }; const listItems = ["Linkedin", "Instagram", "Facebook", "Twitter", "Youtube"]; const iconTemplate = (path) => { return `
`; }; const listItemTemplate = (text, translateValue) => { return `
${text}
`; }; const renderListItems = () => { dropdownList.innerHTML += listItems .map((item, index) => { return listItemTemplate(item, 100 * index); }) .join(""); }; window.addEventListener("load", () => { renderListItems(); }); const setDropdownProps = (deg, ht, opacity) => { root.style.setProperty("--rotate-arrow", deg !== 0 ? deg + "deg" : 0); root.style.setProperty("--dropdown-height", ht !== 0 ? ht + "rem" : 0); root.style.setProperty("--list-opacity", opacity); }; mainButton.addEventListener("click", () => { const listWrapperSizes = 3.5; // margins, paddings & borders const dropdownOpenHeight = 4.6 * listItems.length + listWrapperSizes; const currDropdownHeight = root.style.getPropertyValue("--dropdown-height") || "0"; currDropdownHeight === "0" ? setDropdownProps(180, dropdownOpenHeight, 1) : setDropdownProps(0, 0, 0); }); dropdownList.addEventListener("mouseover", (e) => { const translateValue = e.target.dataset.translateValue; root.style.setProperty("--translate-value", translateValue); }); dropdownList.addEventListener("click", (e) => { const clickedItemText = e.target.innerText.toLowerCase().trim(); const clickedItemIcon = icons[clickedItemText]; dropdownTitleIcon.innerHTML = iconTemplate(clickedItemIcon); dropdownTitle.innerHTML = clickedItemText; setDropdownProps(0, 0, 0); }); dropdownList.addEventListener("mousemove", (e) => { const iconSize = root.style.getPropertyValue("--floating-icon-size") || 0; const x = e.clientX - dropdownList.getBoundingClientRect().x; const y = e.clientY - dropdownList.getBoundingClientRect().y; const targetText = e.target.innerText.toLowerCase().trim(); const hoverItemText = icons[targetText]; floatingIcon.innerHTML = iconTemplate(hoverItemText); root.style.setProperty("--floating-icon-left", x - iconSize / 2 + "px"); root.style.setProperty("--floating-icon-top", y - iconSize / 2 + "px"); });