¡Hola! ✨ Hoy quiero compartir contigo un dropdown personalizado y completamente accesible que he desarrollado. Este componente no utiliza las etiquetas HTML estándar para dropdowns, pero sigue siendo totalmente accesible 😊.
Código del Dropdown
Aquí tienes todo el código necesario para implementar este dropdown en tu proyecto. He incluido los archivos HTML, CSS y JavaScript para que puedas integrarlo fácilmente.
Estructura del proyecto
Código HTML 🧱
Primero, crearemos la estructura HTML de nuestro dropdown.
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
< link rel = "preconnect" href = "https://fonts.googleapis.com" />
< link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin />
href = "https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap"
< link rel = "stylesheet" href = "./css/reset.css" />
< link rel = "stylesheet" href = "./css/style.css" />
< title >Dropdown ✨</ title >
< div class = "main__dropdown dropdown" >
aria-controls = "dropdown__menu"
< span class = "dropdown__item-input" id = "dropdown__item-input" >
xmlns = "http://www.w3.org/2000/svg"
class = "dropdown__item-icon"
< path stroke = "none" d = "M0 0h24v24H0z" fill = "none" />
< path d = "M6 9l6 6l6 -6" />
class = "dropdown__menu menu"
aria-labelledby = "dropdown__item-input"
< li class = "menu__item" role = "option" tabindex = "0" data-value = "Fish" >
< li class = "menu__item" role = "option" tabindex = "0" data-value = "Cat" >
< li class = "menu__item" role = "option" tabindex = "0" data-value = "Dog" >
< li class = "menu__item" role = "option" tabindex = "0" data-value = "Cow" >
< li class = "menu__item" role = "option" tabindex = "0" data-value = "Bird" >
< div class = "background-overlay" ></ div >
< script src = "./js/script.js" ></ script >
Código CSS 🎨
Primero, escribimos el archivo reset.css
para asegurarnos de que nuestro diseño no se vea afectado por los estilos predeterminados del navegador.
vertical-align: baseline ;
object-position: center center ;
background-color: transparent ;
border-collapse: collapse ;
font-family: 'Inter' , sans-serif ;
-webkit-font-smoothing: antialiased ;
-moz-osx-font-smoothing: grayscale ;
Luego, agregamos el estilo específico para el dropdown en index.css
.
background: linear-gradient(to right , #4f4f4f2e 1 px , transparent 1 px ),
linear-gradient(to bottom , #4f4f4f2e 1 px , transparent 1 px );
background-size: 14 px 24 px ;
mask-image: radial-gradient( ellipse 80 % 50 % at 50 % 0 % , #000 70 % , transparent 110 % );
background-color: #ffffff ;
border: 1 px solid #D4D4D4 ;
justify-content: space-between ;
transition: transform .3 s ease , opacity .3 s ease ;
transition: transform .3 s ease ;
background-color: #ffffff ;
border: 1 px solid #D4D4D4 ;
box-shadow: 0 px 4 px 15 px rgba( 115 , 115 , 115 , 0.15 );
transition: opacity .3 s ease ;
.dropdown__menu ::-webkit-scrollbar {
.dropdown__menu ::-webkit-scrollbar-thumb {
background-color: #D4D4D4 ;
.dropdown__menu ::-webkit-scrollbar-track {
background-color: transparent ;
.dropdown__item--active {
.dropdown__item-icon--active {
transform: rotate( -180 deg );
background-color: #0A0A0A ;
.dropdown__menu--active {
animation: fade_in .3 s cubic-bezier( 0.42 , 0 , 0.58 , 1 );
transform: translateY( -90 px );
transform: translateY( 10 px );
transform: translateY( -5 px );
transform: translateY( 0 );
Código JavaScript ⚡
Finalmente, agregamos la funcionalidad del dropdown con JavaScript.
const menuItems = document . querySelectorAll ( ".menu__item" );
const dropdownItem = document . querySelector ( ".dropdown__item" );
const dropdownMenu = document . querySelector ( ".dropdown__menu" );
const dropdownItemIcon = document . querySelector ( ".dropdown__item-icon" );
const dropdownItemInput = document . querySelector ( ".dropdown__item-input" );
dropdownItem . addEventListener ( "click" , () => {
dropdownItem . classList . toggle ( "dropdown__item--active" );
dropdownMenu . classList . toggle ( "dropdown__menu--active" );
dropdownItemIcon . classList . toggle ( "dropdown__item-icon--active" );
menuItems . forEach (( menuItem ) => {
menuItem . addEventListener ( "click" , ( e ) => {
dropdownItem . classList . remove ( "dropdown__item--active" );
dropdownMenu . classList . remove ( "dropdown__menu--active" );
dropdownItemIcon . classList . remove ( "dropdown__item-icon--active" );
dropdownItemInput . dataset . value = e . target . dataset . value ;
dropdownItemInput . innerHTML = e . target . innerHTML ;
menuItems . forEach (( item ) => {
item . classList . remove ( "menu__item--active" );
if ( item . dataset . value === dropdownItemInput . dataset . value ) {
item . classList . add ( "menu__item--active" );
Puedes copiar y pegar el código en tu proyecto para probarlo. Espero que te guste y lo mas importante que te sea útil 😊.
Happy coding 👻