Keyframes + una reproducción
La solución CSS clásica, sin infinite.
Laboratorio aislado
Cada demostración usa una estrategia distinta para revelar el mismo elemento. Todas empiezan quietas y se ejecutan mediante su propio botón, salvo las variantes que explícitamente prueban un disparador por viewport o una API moderna.
20 experimentos
La tarjeta identifica el mecanismo usado y qué conviene observar.
La solución CSS clásica, sin infinite.
La duración se controla con --fade-duration.
No utiliza @keyframes; cambia una propiedad de estado.
Interacción sin JavaScript usando un checkbox oculto visualmente.
Reduce parpadeos de interacción al combinar visibilidad con opacidad.
La animación existe, pero empieza pausada y solo arranca al hacer clic.
El elemento está estático hasta que JavaScript le asigna la animación.
Usa offsetWidth para separar quitar y volver a poner la clase.
El elemento anterior se reemplaza por una copia limpia y vuelve a animarse.
CSS responde a data-state="visible" en lugar de una clase animada.
element.animate()La duración y el estado final se pasan desde JavaScript, no desde CSS.
Permite cambiar duración, delay y aceleración desde un único bloque JS.
La versión más explícita de WAAPI: efecto, timeline y reproducción separados.
La opacidad se calcula manualmente en cada frame, sin CSS animation.
Alternativa deliberadamente simple para comparar contra requestAnimationFrame.
El estado inicial y final se escriben directamente en style.opacity.
La transición comienza cuando la tarjeta entra en el viewport. Puede ejecutarse una vez.
Prueba el mismo disparador de viewport pero con una animación CSS de una sola ejecución.
@starting-styleEl navegador crea el estado inicial para una transición cuando aparece el nodo.
Prueba de una transición de documento para cambiar el contenido de la tarjeta. Es una vía avanzada.
Qué observar
El navegador entiende correctamente una animación CSS normal. El problema del proyecto anterior probablemente está en selectores, sobrescrituras, otras animaciones o en el flujo de reinicio.
La transición CSS puede ser un camino más estable para este showcase que mantener una animación CSS en reproducción continua.
Web Animations API permite sacar el control de duración y reproducción del CSS y mantenerlo en JavaScript.
El navegador puede controlar una interpolación temporal sin depender de animation ni transition. No es necesariamente la mejor implementación, pero sirve como referencia.
IntersectionObserver permite evitar animaciones constantes y ejecutarlas únicamente cuando el elemento aparece en la zona visible.
Eso apunta a que el comportamiento problemático del proyecto original proviene de su arquitectura concreta y no de una limitación del navegador respecto a duraciones largas.
Documentación
| Componente | HTML | CSS | JavaScript | Objetivo |
|---|---|---|---|---|
| Fade In Lab | index.html | components/fade-in/fade-in.css | components/fade-in/fade-in.js | Comparar 20 estrategias |
| Base visual | index.html | css/base.css | — | Layout, controles y accesibilidad |
Las variantes 15 y 20 son deliberadamente experimentales. No se presentan como recomendación automática; están aquí para comparar mecanismos.