Para que lo tengan en cuenta que:
transition: transform 500ms ease;
es lo mismo que decir:
transition-property: trnasform;
transition-duration: 500ms;
transition-timing-function: ease;
Lograr animaciones fluidas en CSS no depende solo de elegir una propiedad bonita, sino de entender cómo el navegador procesa cada cambio visual. Cuando comprendes el ciclo de renderizado y aprovechas herramientas como will-change, tus interfaces ganan rendimiento sin sacrificar experiencia de usuario.
¿Cómo funciona el proceso de renderizado en las animaciones CSS?
Cada vez que el navegador ejecuta una animación, pasa por una serie de pasos internos. Los tres últimos son los más relevantes para el rendimiento: layout, paint y composite [00:26]. Estas etapas determinan cuánto trabajo debe realizar el navegador para mostrar cada fotograma de la animación.
Propiedades como opacity y transform son las más adecuadas para animar porque solo necesitan el paso de composite [01:03]. No obligan al navegador a recalcular el layout ni a repintar, lo que las hace extremadamente eficientes. En cambio, propiedades como margin-top fuerzan al navegador a recorrer los tres pasos, generando un costo de procesamiento mucho mayor.
¿Qué papel juegan la CPU y la GPU en este proceso?
Cuando usas opacity o transform, el navegador delega la animación a la GPU (Graphics Processing Unit), que está optimizada para este tipo de operaciones visuales [01:22]. Ese traspaso de trabajo entre la CPU y la GPU es lo que se conoce como aceleración de hardware. Aunque este paso introduce pequeñas fricciones, el resultado sigue siendo mucho más fluido que animar propiedades que dependen exclusivamente de la CPU.
¿Qué es will-change y cómo optimiza las animaciones?
La propiedad will-change actúa como un aviso anticipado al navegador [01:55]. Su traducción literal sería "cambiará", y eso es exactamente lo que hace: le dice al motor de renderizado que una propiedad específica se va a modificar pronto, para que pueda prepararse y optimizar el proceso.
css .better { transition: transform 500ms; will-change: transform; }
.better:hover { transform: translateY(5px); }
En este ejemplo [02:42], el navegador sabe de antemano que transform va a cambiar y reserva los recursos necesarios. El resultado es una animación más suave y predecible.
¿Por qué margin-top genera animaciones con temblor?
Para comparar, se puede crear un segundo botón que use margin-top en lugar de transform para lograr el mismo desplazamiento vertical [03:50]:
css .worst { transition: margin-top 500ms; }
.worst:hover { margin-top: 5px; }
Al hacer hover sobre este botón, la animación presenta un temblor visible [04:44]. Esto ocurre porque margin-top obliga al navegador a recalcular el layout de los elementos circundantes, repintar y luego componer. Cuando además se activa will-change en el botón con transform, la diferencia se acentúa todavía más: el primero se mueve con fluidez total mientras el segundo tiembla de forma notoria [05:22].
¿Cuándo usar will-change y qué precauciones tomar?
Aunque will-change mejora el rendimiento, consume recursos adicionales [05:32]. El navegador reserva memoria y capacidad de procesamiento para la optimización anticipada. Por eso no conviene aplicarla indiscriminadamente a todos los elementos de una página.
transform y opacity como propiedades de animación.margin, width, height u otras propiedades que disparen layout y paint.Una forma sencilla de recordar el concepto es la analogía del pastelito de Alicia en el País de las Maravillas [06:12]: cuando ves el cartel que dice "eat me", ya sabes lo que va a pasar. will-change funciona igual, es una señal que anticipa la transformación para que el navegador esté listo.
Si quieres comprobarlo por ti mismo, replica el ejercicio con ambos botones y observa la diferencia en fluidez. Comparte en los comentarios qué tan evidente fue el temblor del margin-top en tu pantalla.
Lograr animaciones fluidas en CSS no depende solo de elegir una propiedad bonita, sino de entender cómo el navegador procesa cada cambio visual. Cuando comprendes el ciclo de renderizado y aprovechas herramientas como will-change, tus interfaces ganan rendimiento sin sacrificar experiencia de usuario.
Cada vez que el navegador ejecuta una animación, pasa por una serie de pasos internos. Los tres últimos son los más relevantes para el rendimiento: layout, paint y composite [00:26]. Estas etapas determinan cuánto trabajo debe realizar el navegador para mostrar cada fotograma de la animación.
Propiedades como opacity y transform son las más adecuadas para animar porque solo necesitan el paso de composite [01:03]. No obligan al navegador a recalcular el layout ni a repintar, lo que las hace extremadamente eficientes. En cambio, propiedades como margin-top fuerzan al navegador a recorrer los tres pasos, generando un costo de procesamiento mucho mayor.
Cuando usas opacity o transform, el navegador delega la animación a la GPU (Graphics Processing Unit), que está optimizada para este tipo de operaciones visuales [01:22]. Ese traspaso de trabajo entre la CPU y la GPU es lo que se conoce como aceleración de hardware. Aunque este paso introduce pequeñas fricciones, el resultado sigue siendo mucho más fluido que animar propiedades que dependen exclusivamente de la CPU.
La propiedad will-change actúa como un aviso anticipado al navegador [01:55]. Su traducción literal sería "cambiará", y eso es exactamente lo que hace: le dice al motor de renderizado que una propiedad específica se va a modificar pronto, para que pueda prepararse y optimizar el proceso.
css .better { transition: transform 500ms; will-change: transform; }
.better:hover { transform: translateY(5px); }
En este ejemplo [02:42], el navegador sabe de antemano que transform va a cambiar y reserva los recursos necesarios. El resultado es una animación más suave y predecible.
Para comparar, se puede crear un segundo botón que use margin-top en lugar de transform para lograr el mismo desplazamiento vertical [03:50]:
css .worst { transition: margin-top 500ms; }
.worst:hover { margin-top: 5px; }
Al hacer hover sobre este botón, la animación presenta un temblor visible [04:44]. Esto ocurre porque margin-top obliga al navegador a recalcular el layout de los elementos circundantes, repintar y luego componer. Cuando además se activa will-change en el botón con transform, la diferencia se acentúa todavía más: el primero se mueve con fluidez total mientras el segundo tiembla de forma notoria [05:22].
Aunque will-change mejora el rendimiento, consume recursos adicionales [05:32]. El navegador reserva memoria y capacidad de procesamiento para la optimización anticipada. Por eso no conviene aplicarla indiscriminadamente a todos los elementos de una página.
transform y opacity como propiedades de animación.margin, width, height u otras propiedades que disparen layout y paint.Una forma sencilla de recordar el concepto es la analogía del pastelito de Alicia en el País de las Maravillas [06:12]: cuando ves el cartel que dice "eat me", ya sabes lo que va a pasar. will-change funciona igual, es una señal que anticipa la transformación para que el navegador esté listo.
Si quieres comprobarlo por ti mismo, replica el ejercicio con ambos botones y observa la diferencia en fluidez. Comparte en los comentarios qué tan evidente fue el temblor del margin-top en tu pantalla.
Para que lo tengan en cuenta que:
transition: transform 500ms ease;
es lo mismo que decir:
transition-property: trnasform;
transition-duration: 500ms;
transition-timing-function: ease;
.
Hay algunas propiedades que no son buenas de animar o transicionar, pero esto porque pasa, no todas las propiedades son lo mismo?
.
La principal diferencia es que algunas propiedades tienen que lidiar con sus posiciones en la pantalla, lo que significa que el navegador tiene que modificar al DOM y mover algunos pixeles para que algunas propiedades funcionen, esto se debe a que el CSS engine funciona en 5 pasos:
archivo.htmlengine agrega las etiquetas que vienen el el documento.cssengine identifica donde debería aparecer un nodo en la pantalla (aqui es donde se lidia con pixeles, tamaño de monitor, etc.).
Sabiendo esto, si nuestros elementos a transicionar lidian con pixeles y cambian de cierta forma el DOM, van a causar un mayor esfuerzo a nuestra computadora. Lo que se hace es trabajar con elementos que no dañen al DOM, como lo son opacity y
.
Por ultimo, porque nosotros somo buena onda y el navegador nos cae bien, le podemos decir que se ponga trucha y que empiece a prepararse para optimizar ciertas transformaciones que nosotros sabemos se van a tener que hacer, eso lo hacemos con la propiedad
transform.will-changeSiempre me había preguntado como rayos hacia para arreglar esto, y jugaba mucho con los márgenes aunque sabia que no debía ser de esa forma.
¡Genial! :)
Este tipo de optimizaciones puede aumentar la capacidad de respuesta de una página al realizar un trabajo potencialmente costoso antes de que realmente se requieran. Propiedades
will-change: auto;
will-change: scroll-position;
will-change: contents;
will-change: transform;
will-change: opacity;
will-change: left, top;
La propiedad "will-change" admite múltiples valores, en cuyo caso se deben separar por comas:
.miele {will-change: transform, opacity, contents;}
No aplique will-change a demasiados elementos porque puede hacer que la página se ralentice o consuma muchos recursos. "will-change" está destinado a ser utilizado como último recurso, con el fin de tratar de hacer frente a los problemas de rendimiento existentes. No debe usarse para anticipar problemas de desempeño.
Hola en esta paginas pueden informarse más sobre la propiedad will-change: Ingles: https://developer.mozilla.org/en-US/docs/Web/CSS/will-change Español: https://escss.blogspot.com/2014/05/will-change-propiedad-css.html
Es la primera vez que, me lo explican de manera "coloquial". Gracias.
No se si es algo muy obvio y la pregunta resulta tonta, pero porque al usar transition solo se mueve el botón .better pero al hacerlo con margin aunque se le indique solo al boton .worst se desplazan los dos de todos modos?
MDN dice: Don't apply will-change to elements to perform premature optimization. If your page is performing well, don't add the will-change property to elements just to wring out a little more speed. will-change is intended to be used as something of a last resort, in order to try to deal with existing performance problems. It should not be used to anticipate performance problems. Excessive use of will-change will result in excessive memory use and will cause more complex rendering to occur as the browser attempts to prepare for the possible change. This will lead to worse performance. https://developer.mozilla.org/en-US/docs/Web/CSS/will-change
Lo que no menciona es que esta propiedad debe usarse como ÚLTIMO RECURSO cuando estás teniendo problema de optimización con una página y no te queda de otra que probar esta propiedad, también dice que usarla en exceso en realidad puede empeorar el rendimiento del navegador. Documentación de MDN aquí
Notas de la clase