Cómo construir un componente de tab sensible con CSS y un toque de JavaScript
Spanish (Español) translation by Richter Domagas (you can also view the original English article)
En este tutorial, aprenderemos cómo crear un componente sensible tab con CSS y un poco de JavaScript. Es absolutamente posible crear componentes de ficha CSS puros, pero para este ejemplo vamos a concretar nuestras capacidades de JavaScript.
Aquí es lo que vamos a construir, en unos grandes pasos:
Nota: Este tutorial no centrarse en cómo hacer accesible, el componente de la tab para explorar la accesibilidad sería un paso válido.
1. El HTML
Para comenzar con, vamos a examinar el marcado requerido. Tenemos un contenedor que incluye las tabs propias (elementos de la lista), así como el contenido de cada tab (tab panels). Para asociar una tab con el correspondiente panel utilizamos el atributo personalizado de data-index que contiene un valor único para cada tab panel. Dicho esto, debido a la numeración de base cero, un panel con data-index = 0 se asocia con la primera tab, un panel con data-index = 1 está asociado con la segunda y así sucesivamente.
Aquí está el código HTML:
1 |
<div class="tabs-container"> |
2 |
<ul class="tabs"> |
3 |
<li class="active"> |
4 |
<a href="">Part 1</a> |
5 |
</li>
|
6 |
<li>
|
7 |
<a href="">Part 2</a> |
8 |
</li>
|
9 |
<li>
|
10 |
<a href="">Part 3</a> |
11 |
</li>
|
12 |
</ul>
|
13 |
<div class="tabs-content"> |
14 |
<div class="tabs-panel active" data-index="0"> |
15 |
<!-- content here -->
|
16 |
</div>
|
17 |
<div class="tabs-panel" data-index="1"> |
18 |
<!-- content here -->
|
19 |
</div>
|
20 |
<div class="tabs-panel" data-index="2"> |
21 |
<!-- content here -->
|
22 |
</div>
|
23 |
</div>
|
24 |
</div>
|
2. El CSS
Como siguiente paso vamos a especificar unas reglas CSS de nuestro componente. Nada apetece demasiado, sólo algunos estilos básicos. Una cosa a notar es que no utiliza cualquier transiciones (por ejemplo, descolorarse, diapositivas) para alternar entre los tab panels; en cambio estos aparecen y desaparecen con un simple interruptor de encendido / apagado.
Aquí están los estilos iniciales:
1 |
.tabs-container { |
2 |
max-width: 1000px; |
3 |
margin: 50px auto; |
4 |
padding: 25px; |
5 |
}
|
6 |
|
7 |
.tabs { |
8 |
display: flex; |
9 |
}
|
10 |
|
11 |
.tabs li:not(:last-child) { |
12 |
margin-right: 7px; |
13 |
}
|
14 |
|
15 |
.tabs li a { |
16 |
display: block; |
17 |
position: relative; |
18 |
top: 4px; |
19 |
padding: 10px 25px; |
20 |
border-radius: 2px 2px 0 0; |
21 |
background: white; |
22 |
opacity: 0.7; |
23 |
transition: all 0.1s ease-in-out; |
24 |
}
|
25 |
|
26 |
.tabs li.active a, |
27 |
.tabs li a:hover { |
28 |
opacity: 1; |
29 |
top: 0; |
30 |
}
|
31 |
|
32 |
.tabs-content { |
33 |
position: relative; |
34 |
z-index: 2; |
35 |
padding: 25px; |
36 |
border-radius: 0 4px 4px 4px; |
37 |
background: white; |
38 |
}
|
39 |
|
40 |
.tabs-panel { |
41 |
display: none; |
42 |
}
|
43 |
|
44 |
.tabs-panel.active { |
45 |
display: block; |
46 |
}
|
3. El JavaScript
Con el HTML y CSS en su lugar, es hora de mirar el código JavaScript necesario.
Cada vez que haga clic en una tab, hacemos lo siguiente:
- Retire la
activeclass de la tab correspondiente (por default el primero de ellos) y el panel de la tab panel (por default el primero de ellos). - Encontrar al
liparent de esta tab, se agregue laactiveclass y recuperar su index. - Encontrar el tab panel cuyo valor de attribute (para el attribute de
data-index) coincide con el valor del mencionado index y asignarle laactiveclass.
Aquí está el código JavaScript resultante:
1 |
const tabLinks = document.querySelectorAll(".tabs a"); |
2 |
const tabPanels = document.querySelectorAll(".tabs-panel"); |
3 |
|
4 |
for(let el of tabLinks) { |
5 |
el.addEventListener("click", e => { |
6 |
e.preventDefault(); |
7 |
|
8 |
document.querySelector('.tabs li.active').classList.remove("active"); |
9 |
document.querySelector('.tabs-panel.active').classList.remove("active"); |
10 |
|
11 |
const parentListItem = el.parentElement; |
12 |
parentList.classList.add("active"); |
13 |
const index = [...parentListItem.parentElement.children].indexOf(parentListItem); |
14 |
|
15 |
const panel = [...tabPanels].filter(el => el.getAttribute("data-index") == index); |
16 |
panel[0].classList.add("active"); |
17 |
});
|
18 |
}
|
4. Capacidad de respuesta que va
¡Nuestro componente está casi listo! El último que tenemos que hacer es hacer el componente sensible. Así, por ejemplo, cuando la viewport tiene un ancho máximo de 600px, debe contraer y parecerse a esto:



Como estamos utilizando un enfoque de primer escritorio, estas son las reglas CSS que tenemos que sobrescribir:
1 |
@media screen and (max-width: 600px) { |
2 |
.tabs { |
3 |
flex-direction: column; |
4 |
}
|
5 |
|
6 |
.tabs li { |
7 |
width: 100%; |
8 |
}
|
9 |
|
10 |
.tabs li:not(:last-child) { |
11 |
margin-right: 0; |
12 |
}
|
13 |
|
14 |
.tabs li a { |
15 |
border-radius: 0; |
16 |
opacity: 1; |
17 |
top: 0; |
18 |
}
|
19 |
|
20 |
.tabs li.active a::before { |
21 |
content: '•'; |
22 |
padding-right: 5px; |
23 |
}
|
24 |
|
25 |
.tabs-content { |
26 |
border-radius: 0; |
27 |
}
|
28 |
}
|
5. Soporte del navegador
Nuestra un demo funciona bien en todos los dispositivos y navegadores recientes. Como de costumbre con mis tutoriales, utilizamos Babel para compilar el código ES6 hasta ES5.
Conclusión
En este breve tutorial, hemos conseguido crear un componente de la tab de respuesta útil con HTML, CSS y JavaScript. Otra vez, este componente no es adecuadamente accesible, pero si usted quiere mejorar su funcionalidad que sería un buen paso. ¡Feliz codificación!


Accesibilidad WebGuía de un Principiante de Accesibilidad WebJohn Hartley

AccesibilidadConstruir una Web Inclusiva: Qué es Importante la AccesibilidadSami Keijonen

Accesibilidad3 Consejos de Accesibilidad que Desearía haber Aprendido AntesJoanna Ngai

AccesibilidadConceptos Básicos de Accesibilidad: Diseño para la Discapacidad VisualGraeme Fulton



