Tema
Otros componentes
Una colección de piezas que aparecen en casi cualquier proyecto real: preguntas frecuentes, carruseles, galerías de fotos, líneas de tiempo, indicadores de progreso, estados de carga y etiquetas. Todas son HTML, CSS y JavaScript vanilla, sin librerías, y con los colores en variables para que las adaptes a la marca de tu cliente en segundos.
Cómo usar estos demos
Prueba cada demo con el teclado (Tab, Enter, flechas, Esc): todos están pensados para funcionar sin mouse. Luego copia el código o ábrelo en el Playground.
Acordeón / FAQ
Cuándo usarlo: secciones de preguntas frecuentes, especificaciones de producto o cualquier contenido largo que conviene mostrar por partes.
Cómo personalizarlo
- Cambia
SOLO_UNAafalseen el JS si quieres que se puedan abrir varias preguntas a la vez. --duracioncontrola la velocidad de apertura. La animación usa el trucogrid-template-rows: 0fr → 1fr, que anima la altura sin calcularla en JS.- Para agregar preguntas copia un bloque
.faq__itemy cambia losid(b5/p5) para quearia-controlsyaria-labelledbysigan apuntando bien. - Alternativa sin JS: usa
<details>y<summary>; funciona igual de accesible, aunque animarlo es más limitado.
Carrusel / slider
Cuándo usarlo: banners promocionales, destacados de portafolio o testimonios. Úsalo con moderación: el contenido importante no debería quedar escondido en la diapositiva 4.
Cómo personalizarlo
INTERVALO(en ms) define cada cuánto avanza solo. El autoplay se pausa con el mouse encima, con el foco dentro, con el botón de pausa y si el usuario prefiere menos movimiento.- Agrega diapositivas copiando un
<article class="slide">: los puntos se generan solos. Actualiza elaria-label("5 de 5"). - Para imágenes reales usa
background-imageen cada.slideo pon un<img>conobject-fit: cover. - Funciona con flechas del teclado (con el carrusel enfocado) y con swipe en pantallas táctiles (umbral de 40px).
Error común
Un carrusel con autoplay sin botón de pausa incumple las pautas de accesibilidad (WCAG 2.2.2). Si algo se mueve solo más de 5 segundos, el usuario debe poder detenerlo.
Galería con lightbox
Cuándo usarlo: portafolios de fotógrafos, menús de restaurantes, catálogos de productos o cualquier sitio donde ver la imagen en grande importa.
Cómo personalizarlo
- Las "fotos" están hechas con degradados para que el demo no dependa de archivos externos. En tu proyecto reemplaza cada
.artepor<img src="foto.jpg" alt="Descripción">y en el lightbox usa también un<img>al que le cambias elsrc. minmax(150px, 1fr)en.galeriadefine el ancho mínimo de cada miniatura; súbelo para miniaturas más grandes.- El lightbox se cierra con Esc, con la × o haciendo clic fuera; se navega con las flechas y mantiene el foco atrapado dentro mientras está abierto.
- Cambia
--overlaypara un fondo más claro u oscuro.
Timeline
Cuándo usarlo: historia de la empresa, pasos de un proceso, experiencia laboral en un CV o el seguimiento de un pedido.
Cómo personalizarlo
- En móvil la línea va a la izquierda; desde
700pxse centra y los eventos alternan de lado con:nth-child(even). --acentocolorea los puntos y las fechas;--lineala línea vertical.- Usa
<time datetime="...">con fechas completas (2024-03-15) si las tienes: ayuda a buscadores y lectores de pantalla. - Es una lista ordenada
<ol>, así que el orden tiene significado. Si es una línea de tiempo inversa (lo más nuevo arriba), simplemente cambia el orden de los<li>.
Barras de progreso
Cuándo usarlo: subida de archivos, formularios de varios pasos (checkout), cursos completados o metas de recaudación.
Cómo personalizarlo
- La barra lineal usa un degradado entre
--acentoy--acento-2. - La circular es un SVG: el truco es
stroke-dasharrayigual a la circunferencia (2 × π × r) ystroke-dashoffsetpara "esconder" la parte que falta. Si cambias el radior, cambia tambiénCIRCen el JS. - Para la de pasos, cambia los textos de cada
.paso; si agregas o quitas pasos, ajusta el25(100 / número de tramos) en la funciónpintar(). - Siempre actualiza
aria-valuenowjunto con lo visual, como hacepintar(), para que el progreso se anuncie.
Skeleton loading
Cuándo usarlo: mientras se cargan datos de una API (listas de productos, perfiles, feeds). Se siente más rápido que un spinner porque el usuario ya ve la forma del contenido.
Cómo personalizarlo
--huesoy--brilloson los dos colores del efecto shimmer;--velocidadsu duración.- Diseña el esqueleto con la misma forma y tamaño que el contenido real para que no haya saltos al cargar.
- Reemplaza el
setTimeoutdecargar()por tufetch()real y pinta las tarjetas cuando lleguen los datos. aria-busy="true"indica a los lectores de pantalla que la región se está cargando; cámbialo afalseal terminar.
Chips y badges
Cuándo usarlo: etiquetas en un buscador o formulario (chips eliminables), filtros de catálogo (chips seleccionables), estados de pedidos en tablas (badges) y notificaciones sin leer (contador en icono).
Cómo personalizarlo
- Los colores de estado están en
--ok,--aviso,--errore--info. El fondo suave se genera solo concolor-mix(). - Los filtros usan
aria-pressedpara indicar si están activos; el estilo cambia con el selector[aria-pressed="true"], así el CSS y la accesibilidad siempre coinciden. - Al eliminar un chip, el foco pasa al siguiente para que quien usa teclado no se pierda.
- El contador muestra
99+cuando pasa de 99 y se oculta solo cuando está vacío (:empty).
Buena práctica
No uses sólo el color para comunicar un estado: los badges incluyen texto ("Pagado", "Cancelado"). Así también los entienden personas con daltonismo.
Resumen
- Cada componente usa HTML semántico (
ol,time,button,role="progressbar") y atributos ARIA que se actualizan con JS. - Respeta
prefers-reduced-motion: el carrusel no se reproduce solo y el skeleton deja de animarse. - Personaliza todo desde las variables de
:rooty los parámetros señalados en los comentarios del JS.