Una gu铆a completa sobre CSS @scroll-timeline, que cubre su sintaxis, propiedades, uso y t茅cnicas de animaci贸n avanzadas. Crea animaciones atractivas basadas en el scroll.
Dominando CSS @scroll-timeline: Control de Animaci贸n a Trav茅s del Progreso de Desplazamiento
En el panorama en constante evoluci贸n del desarrollo web, crear experiencias de usuario atractivas e interactivas es primordial. CSS ofrece varias herramientas para lograr esto, y una de las m谩s poderosas, aunque a menudo pasada por alto, es la regla @scroll-timeline. Esta caracter铆stica permite a los desarrolladores vincular las animaciones directamente al progreso de desplazamiento de un elemento, creando animaciones cautivadoras impulsadas por el scroll. Este art铆culo proporciona una exploraci贸n exhaustiva de @scroll-timeline, que cubre su sintaxis, propiedades, uso pr谩ctico y t茅cnicas de animaci贸n avanzadas para elevar tus dise帽os web.
驴Qu茅 es CSS @scroll-timeline?
@scroll-timeline es una regla CSS que define una l铆nea de tiempo de desplazamiento, que es esencialmente una secuencia de estados que corresponden a la posici贸n de desplazamiento de un elemento especificado. En lugar de depender de animaciones tradicionales basadas en el tiempo, @scroll-timeline vincula el progreso de la animaci贸n a la acci贸n de desplazamiento del usuario. Esto da como resultado una animaci贸n m谩s natural y receptiva, ya que la velocidad de la animaci贸n se controla directamente por el comportamiento de desplazamiento del usuario.
Esto abre emocionantes posibilidades para:
- Narraci贸n visual: Revela el contenido progresivamente a medida que el usuario se desplaza.
- Visualizaci贸n de datos interactiva: Anima gr谩ficos y diagramas a medida que el usuario explora los datos.
- Efectos de paralaje: Crea profundidad y dimensi贸n animando diferentes elementos a diferentes velocidades seg煤n la posici贸n de desplazamiento.
- Indicadores de progreso: Representa visualmente el progreso del usuario a trav茅s de un documento largo.
Sintaxis y Propiedades
La sintaxis b谩sica de la regla @scroll-timeline es la siguiente:
@scroll-timeline timeline-name {
source: auto | <element-selector>;
orientation: auto | block | inline;
scroll-offsets: <scroll-offset>[ , <scroll-offset> ]*;
}
Desglosemos cada propiedad:
timeline-name
Este es un identificador 煤nico para tu l铆nea de tiempo de desplazamiento. Usar谩s este nombre para hacer referencia a la l铆nea de tiempo al aplicarla a una animaci贸n.
Ejemplo:
@scroll-timeline my-scroll-timeline {
/* ... */
}
source
Esta propiedad especifica el elemento cuya posici贸n de desplazamiento impulsar谩 la animaci贸n. Puede tener dos valores:
auto: El navegador determina autom谩ticamente el elemento de desplazamiento. A menudo, este es la ventana gr谩fica del documento (la ventana del navegador).<element-selector>: Un selector CSS que identifica el elemento espec铆fico que se utilizar谩 como fuente de desplazamiento. Esto te permite apuntar a contenedores o secciones espec铆ficas en tu p谩gina.
Ejemplo (usando la ventana gr谩fica como fuente):
@scroll-timeline my-scroll-timeline {
source: auto; /* Usa la ventana gr谩fica */
/* ... */
}
Ejemplo (usando un elemento espec铆fico como fuente):
@scroll-timeline my-scroll-timeline {
source: #scrollable-container; /* Usa el elemento con ID "scrollable-container" */
/* ... */
}
orientation
Esta propiedad especifica la direcci贸n de desplazamiento que se utilizar谩 para la l铆nea de tiempo. Determina si la animaci贸n es impulsada por el desplazamiento vertical u horizontal. Puede tener tres valores:
auto: El navegador determina autom谩ticamente la direcci贸n de desplazamiento en funci贸n de la direcci贸n de desplazamiento dominante del elemento de origen.block: Utiliza la direcci贸n de desplazamiento en bloque (vertical, en la mayor铆a de los modos de escritura).inline: Utiliza la direcci贸n de desplazamiento en l铆nea (horizontal, en la mayor铆a de los modos de escritura).
Ejemplo (usando el desplazamiento vertical):
@scroll-timeline my-scroll-timeline {
source: auto;
orientation: block; /* Desplazamiento vertical */
/* ... */
}
Ejemplo (usando el desplazamiento horizontal):
@scroll-timeline my-scroll-timeline {
source: #horizontal-scroll-container;
orientation: inline; /* Desplazamiento horizontal */
/* ... */
}
scroll-offsets
Esta propiedad define las posiciones de desplazamiento que corresponden a puntos espec铆ficos en la animaci贸n. Es una propiedad opcional, y si no se especifica, la animaci贸n se reproducir谩 desde el principio hasta el final del 谩rea desplazable. Cuando se usa, puedes definir uno o m谩s desplazamientos de desplazamiento, cada uno especificando una posici贸n de desplazamiento y un punto correspondiente en el progreso de la animaci贸n.
La sintaxis para un <scroll-offset> es:
<scroll-offset> = <length-percentage> [ at <length-percentage> ]
Donde:
- El primer
<length-percentage>representa la posici贸n de desplazamiento dentro del 谩rea desplazable. - El
at <length-percentage>opcional representa el progreso de animaci贸n correspondiente (0% a 100%). Si se omite, el progreso de la animaci贸n se distribuye uniformemente entre los desplazamientos de desplazamiento definidos.
Ejemplos:
/* La posici贸n de desplazamiento 200px corresponde al progreso de la animaci贸n 0% */
scroll-offsets: 200px at 0%;
/* La posici贸n de desplazamiento al 50% del 谩rea desplazable corresponde al progreso de la animaci贸n 50% */
scroll-offsets: 50% at 50%;
/* M煤ltiples desplazamientos: */
scroll-offsets: 0px at 0%, 500px at 50%, 1000px at 100%;
/* Sin la palabra clave "at" - progreso de animaci贸n distribuido uniformemente: */
scroll-offsets: 0px, 500px, 1000px; /* Equivalente a 0px at 0%, 500px at 50%, 1000px at 100% */
Consideraciones importantes para scroll-offsets:
- Si especificas
scroll-offsets, aseg煤rate de que cubran el rango del 谩rea desplazable para evitar un comportamiento de animaci贸n inesperado. - El progreso de la animaci贸n se interpola entre los desplazamientos de desplazamiento definidos.
- Si no especificas
scroll-offsets, el progreso de la animaci贸n se distribuir谩 uniformemente en toda el 谩rea desplazable.
Aplicar la L铆nea de Tiempo de Desplazamiento a una Animaci贸n
Una vez que hayas definido tu l铆nea de tiempo de desplazamiento, debes aplicarla a una animaci贸n CSS utilizando la propiedad animation-timeline.
La sintaxis es simple:
animation-timeline: timeline-name; /* Usa el nombre que definiste en @scroll-timeline */
Tambi茅n necesitar谩s definir una animaci贸n CSS est谩ndar usando @keyframes. La animaci贸n define los cambios en las propiedades CSS que ocurrir谩n a medida que el usuario se desplaza. Adem谩s, querr谩s asegurarte de que la propiedad CSS `animation-range` est茅 configurada. Define el rango de la l铆nea de tiempo de desplazamiento que activar谩 la animaci贸n.
Aqu铆 tienes un ejemplo completo:
/* Define la l铆nea de tiempo de desplazamiento */
@scroll-timeline my-scroll-timeline {
source: auto;
orientation: block;
}
/* Define la animaci贸n */
@keyframes fade-in {
0% {
opacity: 0;
transform: translateY(20px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
/* Aplica la animaci贸n y la l铆nea de tiempo de desplazamiento a un elemento */
.animated-element {
animation: fade-in 1s forwards;
animation-timeline: my-scroll-timeline;
animation-range: entry 25% cover 75%; /* entry y cover son valores de palabras clave para los rangos de inicio y fin */
}
En este ejemplo:
- La
@scroll-timelinellamadamy-scroll-timelineest谩 definida, usando la ventana gr谩fica como fuente y el desplazamiento vertical como orientaci贸n. - La
@keyframesllamadafade-indefine una simple animaci贸n de desvanecimiento y deslizamiento hacia arriba. - La clase
.animated-elementtiene aplicada la animaci贸nfade-in, pero en lugar de ser activada por un temporizador, est谩 controlada por lamy-scroll-timeline. - El rango de animaci贸n define que la animaci贸n debe comenzar cuando el borde superior del elemento entra en el 25% inferior de la ventana gr谩fica y finalizar cuando sale del 25% superior.
Ejemplos Pr谩cticos y Casos de Uso
Exploremos algunos ejemplos pr谩cticos de c贸mo puedes usar @scroll-timeline para crear experiencias web atractivas.
1. Revelar Contenido Progresivamente
Este es un caso de uso com煤n donde revelas contenido a medida que el usuario se desplaza por la p谩gina. Imagina un art铆culo de formato largo con secciones que se desvanecen a medida que entran en la vista.
HTML:
<section class="content-section">
<h2>Secci贸n 1</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
</section>
<section class="content-section">
<h2>Secci贸n 2</h2>
<p>Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua...</p>
</section>
CSS:
@scroll-timeline reveal-timeline {
source: auto;
orientation: block;
}
@keyframes reveal {
0% {
opacity: 0;
transform: translateY(20px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.content-section {
animation: reveal 1s forwards;
animation-timeline: reveal-timeline;
animation-range: entry 25% cover 75%;
}
En este ejemplo, cada .content-section se desvanecer谩 a medida que se desplace hacia la ventana gr谩fica. El `animation-range` asegura que la animaci贸n comience cuando el borde superior de la secci贸n entre en el 25% inferior de la ventana gr谩fica y termine cuando la secci贸n salga del 25% superior.
2. Efectos de Paralaje
Los efectos de paralaje crean una sensaci贸n de profundidad moviendo elementos de fondo a diferentes velocidades que los elementos de primer plano. @scroll-timeline facilita la implementaci贸n del desplazamiento de paralaje.
HTML:
<div class="parallax-container">
<div class="background-element"></div>
<div class="foreground-element">
<h2>Secci贸n de Paralaje</h2>
<p>Alg煤n contenido aqu铆...</p>
</div>
</div>
CSS:
.parallax-container {
position: relative;
height: 500px; /* Ajusta seg煤n sea necesario */
overflow: hidden;
}
.background-element {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url('background.jpg'); /* Reemplaza con tu imagen */
background-size: cover;
transform: translateZ(-1px) scale(2); /* Crea el efecto de paralaje */
transform-origin: top;
pointer-events: none; /* Permite hacer clic en los elementos de primer plano */
animation: parallax-bg 1s linear forwards;
animation-timeline: parallax-timeline;
animation-range: 0vh 100vh;
}
.foreground-element {
position: relative;
z-index: 1;
padding: 50px;
background-color: rgba(255, 255, 255, 0.8);
}
@scroll-timeline parallax-timeline {
source: auto;
orientation: block;
}
@keyframes parallax-bg {
0% { transform: translateZ(-1px) scale(2) translateY(0px); }
100% { transform: translateZ(-1px) scale(2) translateY(-50vh); }
}
En este ejemplo, el .background-element est谩 posicionado detr谩s del .foreground-element y se escala usando transform. Luego, se aplica la animaci贸n `parallax-bg`, lo que hace que el fondo se mueva m谩s lento que el primer plano a medida que el usuario se desplaza, creando el efecto de paralaje. El `animation-range` asegura que la animaci贸n se ejecute a lo largo de toda la altura de la ventana gr谩fica (0vh a 100vh).
3. Animaci贸n de una Barra de Progreso
Puedes usar @scroll-timeline para crear una barra de progreso que represente visualmente el progreso de desplazamiento del usuario a trav茅s de un documento.
HTML:
<div class="progress-bar-container">
<div class="progress-bar"></div>
</div>
<div class="content">
<!-- Tu contenido aqu铆 -->
</div>
CSS:
.progress-bar-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 5px;
background-color: #eee;
z-index: 1000;
}
.progress-bar {
height: 100%;
width: 0%;
background-color: #007bff;
animation: progress-bar-fill 1s linear forwards;
animation-timeline: document-scroll-timeline;
}
@scroll-timeline document-scroll-timeline {
source: auto;
orientation: block;
}
@keyframes progress-bar-fill {
0% {
width: 0%;
}
100% {
width: 100%;
}
}
En este ejemplo, el ancho de la .progress-bar se anima del 0% al 100% a medida que el usuario se desplaza por el documento. La @scroll-timeline se llama `document-scroll-timeline`, lo que deja claro lo que representa.
T茅cnicas Avanzadas
Una vez que comprendas los conceptos b谩sicos, puedes explorar algunas t茅cnicas avanzadas para crear animaciones impulsadas por el scroll a煤n m谩s sofisticadas.
1. Usar scroll-offsets para un Control Preciso
La propiedad scroll-offsets te permite mapear posiciones de desplazamiento espec铆ficas a valores de progreso de animaci贸n espec铆ficos. Esto es 煤til cuando deseas activar ciertos estados de animaci贸n en puntos precisos durante el desplazamiento.
@scroll-timeline custom-timeline {
source: #scrollable-container;
orientation: block;
scroll-offsets: 100px at 0%, 500px at 50%, 1000px at 100%;
}
@keyframes custom-animation {
0% {
transform: translateX(-100px);
opacity: 0;
}
50% {
transform: translateX(0);
opacity: 1;
}
100% {
transform: translateX(100px);
opacity: 0;
}
}
.animated-element {
animation: custom-animation 1s forwards;
animation-timeline: custom-timeline;
}
En este ejemplo, la animaci贸n:
- Comenzar谩 en
translateX(-100px)yopacity: 0cuando la posici贸n de desplazamiento sea 100px. - Alcanzar谩
translateX(0)yopacity: 1cuando la posici贸n de desplazamiento sea 500px. - Terminar谩 en
translateX(100px)yopacity: 0cuando la posici贸n de desplazamiento sea 1000px.
2. Combinar con JavaScript
Si bien @scroll-timeline ofrece un poderoso control de animaci贸n a trav茅s de CSS, puedes combinarlo con JavaScript para una flexibilidad a煤n mayor. Por ejemplo, podr铆as usar JavaScript para:
- Calcular y actualizar din谩micamente los
scroll-offsetsen funci贸n del tama帽o de la ventana gr谩fica o los cambios de contenido. - Activar efectos o interacciones adicionales basadas en JavaScript basadas en el progreso de desplazamiento.
- Implementar soluciones de respaldo para navegadores que no admiten completamente
@scroll-timeline.
Aqu铆 tienes un ejemplo b谩sico de c贸mo usar JavaScript para leer el progreso de desplazamiento y actualizar una variable CSS:
const scrollableElement = document.getElementById('scrollable-container');
const animatedElement = document.querySelector('.animated-element');
scrollableElement.addEventListener('scroll', () => {
const scrollPosition = scrollableElement.scrollTop;
const maxScroll = scrollableElement.scrollHeight - scrollableElement.clientHeight;
const scrollPercentage = (scrollPosition / maxScroll) * 100;
animatedElement.style.setProperty('--scroll-progress', scrollPercentage + '%');
});
Luego puedes usar esta variable CSS dentro de tu animaci贸n:
@keyframes custom-animation {
0% {
transform: translateX(calc(var(--scroll-progress) * -1px));
}
100% {
transform: translateX(calc(var(--scroll-progress) * 1px));
}
}
.animated-element {
--scroll-progress: 0%; /* Valor inicial */
animation: custom-animation 1s linear forwards;
animation-timeline: scroll-driven-timeline;
}
3. Aprovechar Diferentes Funciones de Facilitaci贸n
Si bien animation-timing-function no es directamente aplicable a la l铆nea de tiempo de desplazamiento en s铆 (ya que la l铆nea de tiempo es impulsada por el progreso de desplazamiento, no por el tiempo), a煤n puedes usar funciones de facilitaci贸n dentro de tus @keyframes para controlar la velocidad y el ritmo de la animaci贸n en diferentes etapas. Experimenta con diferentes funciones de facilitaci贸n como ease-in, ease-out, ease-in-out o incluso curvas de B茅zier c煤bicas personalizadas para lograr el efecto deseado.
Compatibilidad del Navegador y Alternativas
A finales de 2023, @scroll-timeline disfruta de una compatibilidad relativamente buena con los navegadores modernos como Chrome, Edge, Firefox y Safari. Sin embargo, es esencial verificar el estado actual de compatibilidad en sitios web como Can I use... antes de implementarlo en producci贸n.
Para los navegadores que no admiten @scroll-timeline, puedes proporcionar una alternativa usando los listeners de eventos de desplazamiento basados en JavaScript tradicionales y las bibliotecas de animaci贸n como GSAP (GreenSock Animation Platform) o Anime.js. Tambi茅n puedes usar consultas de caracter铆sticas CSS (@supports) para aplicar condicionalmente las animaciones basadas en @scroll-timeline o las alternativas basadas en JavaScript.
@supports (animation-timeline: scroll()) {
/* Aplicar animaciones basadas en @scroll-timeline */
.animated-element {
animation: fade-in 1s forwards;
animation-timeline: my-scroll-timeline;
}
} @else {
/* Aplicar alternativa basada en JavaScript */
.animated-element {
/* Ocultar inicialmente */
opacity: 0;
}
/* (C贸digo JavaScript para detectar el desplazamiento y aplicar la opacidad) */
}
Consideraciones de Accesibilidad
Al usar @scroll-timeline o cualquier t茅cnica de animaci贸n, es crucial considerar la accesibilidad. Aseg煤rate de que tus animaciones no causen:
- Convulsiones: Evita animaciones intermitentes o que cambian r谩pidamente.
- Distracci贸n: Proporciona una forma para que los usuarios pausen o deshabiliten las animaciones, especialmente si son largas o distraen.
- Sobrecarga cognitiva: Usa animaciones con moderaci贸n y aseg煤rate de que sirvan para un prop贸sito claro, en lugar de ser puramente decorativas.
- Mareo por movimiento: Ten en cuenta los efectos de paralaje, ya que pueden desencadenar mareos por movimiento en algunos usuarios.
Considera proporcionar formas alternativas de acceder a la informaci贸n presentada a trav茅s de animaciones, como contenido est谩tico o texto descriptivo. Usa los atributos ARIA para proporcionar significado sem谩ntico y contexto a las tecnolog铆as de asistencia.
Mejores Pr谩cticas
Aqu铆 hay algunas de las mejores pr谩cticas a tener en cuenta al trabajar con @scroll-timeline:
- Usa nombres descriptivos de l铆nea de tiempo: Elige nombres de l铆nea de tiempo que indiquen claramente su prop贸sito (por ejemplo,
parallax-background-timeline,reveal-section-timeline). - Mant茅n las animaciones con buen rendimiento: Optimiza tus animaciones para evitar cuellos de botella en el rendimiento. Usa propiedades CSS aceleradas por hardware como
transformyopacitysiempre que sea posible. - Prueba a fondo: Prueba tus animaciones en diferentes dispositivos y navegadores para asegurarte de que funcionen como se espera y no causen problemas de accesibilidad o rendimiento.
- Comienza simple: Comienza con animaciones simples y agrega gradualmente complejidad a medida que ganas experiencia.
- Considera la experiencia del usuario: Aseg煤rate de que tus animaciones mejoren la experiencia del usuario, en lugar de restarle valor. Evita animaciones demasiado complejas o que distraigan.
- Usa la propiedad CSS `animation-range`: Aseg煤rate de que las animaciones solo se activen cuando un elemento est谩 en la ventana gr谩fica para una experiencia fluida y predecible.
Conclusi贸n
@scroll-timeline es una poderosa funci贸n CSS que permite a los desarrolladores crear animaciones interactivas impulsadas por el scroll y atractivas. Al vincular animaciones al comportamiento de desplazamiento del usuario, puedes crear experiencias web m谩s naturales y receptivas. Al comprender su sintaxis, propiedades y t茅cnicas avanzadas, puedes aprovechar @scroll-timeline para elevar tus dise帽os web y crear recorridos de usuario cautivadores. Recuerda considerar la compatibilidad del navegador, la accesibilidad y el rendimiento al implementar @scroll-timeline, y siempre prioriza la experiencia del usuario.