Accordions y tabs sin JS
Construye accordions y pestañas interactivas solo con CSS moderno, usando :checked, :target y selectores avanzados.
Accordions y tabs solo con CSS
Puedes crear componentes interactivos como accordions y tabs sin JavaScript, usando pseudo-clases modernas como :checked, :target, :has, :focus-within y combinaciones avanzadas.
Accordion accesible con :checked
<div class="acordeon">
<input type="checkbox" id="acordeon1" hidden>
<label for="acordeon1">Sección 1</label>
<div class="contenido">
Contenido de la sección 1
</div>
</div>
.contenido { display: none; }
#acordeon1:checked + label + .contenido {
display: block;
animation: fadeIn 0.3s;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
Variante: solo un panel abierto (tipo radio)
<div class="acordeon">
<input type="radio" name="acordeon" id="panel1" hidden>
<label for="panel1">Panel 1</label>
<div class="contenido">Contenido 1</div>
<input type="radio" name="acordeon" id="panel2" hidden>
<label for="panel2">Panel 2</label>
<div class="contenido">Contenido 2</div>
</div>
.contenido { display: none; }
#panel1:checked ~ label[for="panel1"] + .contenido {
display: block;
}
#panel2:checked ~ label[for="panel2"] + .contenido {
display: block;
}
Tabs solo con CSS usando :target
<nav>
<a href="#tab1">Tab 1</a>
<a href="#tab2">Tab 2</a>
</nav>
<div id="tab1" class="tab-content">Contenido 1</div>
<div id="tab2" class="tab-content">Contenido 2</div>
.tab-content { display: none; }
:target.tab-content { display: block; }
Tabs accesibles con :focus-within y :has
Puedes mejorar la accesibilidad y la experiencia de usuario combinando :focus-within y :has para mostrar el contenido cuando el usuario navega con teclado o cuando un tab está activo:
.tabs:has(a:focus) .tab-content {
outline: 2px solid var(--color-primary);
}
Consideraciones de accesibilidad
- Usa roles y atributos ARIA si el componente es complejo.
- Asegúrate de que los controles sean navegables con teclado.
- Añade animaciones suaves para mejorar la experiencia.
Estos patrones muestran el poder de las pseudo-clases modernas para crear UI avanzada sin JavaScript. Experimenta combinando :checked, :target, :has, :focus-within y :not para lograr componentes ricos y accesibles.