{"id":19394,"date":"2026-06-07T07:00:00","date_gmt":"2026-06-07T05:00:00","guid":{"rendered":"https:\/\/martagonzalez.dev\/wp\/blog\/\/"},"modified":"2026-06-09T18:53:45","modified_gmt":"2026-06-09T16:53:45","slug":"como-funciona-keyframes-en-css-explicado-facil","status":"publish","type":"post","link":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/","title":{"rendered":"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil"},"content":{"rendered":"<div class=\"kksr-ratings kksr-native\" data-payload=\"{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;19394&quot;,&quot;count&quot;:&quot;0&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;5&quot;,&quot;greet&quot;:&quot;\u00bfTe ha resultado \u00fatil este art\u00edculo?&quot;,&quot;legend&quot;:&quot;{score}\/{best} \u00b7 {count} {votes}&quot;,&quot;_legend&quot;:&quot;{score}\/{best} \u00b7 {count} {votes}&quot;,&quot;score&quot;:&quot;0&quot;,&quot;size&quot;:&quot;24&quot;,&quot;legendonly&quot;:&quot;false&quot;,&quot;starsonly&quot;:&quot;false&quot;}\"><div class=\"kksr-stars\"><\/div><div class=\"kksr-legend\"><\/div><\/div>\n<figure class=\"wp-block-image size-large\"><img data-dominant-color=\"c3bdd1\" data-has-transparency=\"false\" style=\"--dominant-color: #c3bdd1;\" decoding=\"async\" width=\"1024\" height=\"683\" sizes=\"(max-width: 1024px) 100vw, 1024px\" src=\"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil-1024x683.avif\" alt=\"\" class=\"wp-image-19396 not-transparent\" srcset=\"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil-1024x683.avif 1024w, https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil-300x200.avif 300w, https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil-768x512.avif 768w, https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil.avif 1536w\" \/ fetchpriority=\"high\"><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Las animaciones en CSS pueden parecer un detalle peque\u00f1o dentro de una interfaz, pero cuando est\u00e1n bien planteadas ayudan a que una web se sienta m\u00e1s fluida, clara y cuidada. Un bot\u00f3n que aparece suavemente, una tarjeta que entra en pantalla, un loader que gira mientras carga el contenido o un icono que llama la atenci\u00f3n sin resultar molesto tienen algo en com\u00fan: muchas veces est\u00e1n creados con <strong>@keyframes en CSS<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La regla <code>@keyframes<\/code> permite definir una animaci\u00f3n paso a paso. Es decir, le indica al navegador c\u00f3mo debe cambiar un elemento desde un estado inicial hasta un estado final, pasando por todos los puntos intermedios que queramos controlar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si ya has trabajado con transiciones o est\u00e1s empezando a explorar el movimiento en interfaces, este concepto es clave para entender mejor las <a href=\"https:\/\/martagonzalez.dev\/blog\/animaciones-css-guia-basica\/\">animaciones CSS<\/a> y aplicarlas con criterio en tus proyectos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo vamos a ver <strong>c\u00f3mo funciona @keyframes en CSS<\/strong>, cu\u00e1l es su sintaxis, qu\u00e9 propiedades intervienen, cu\u00e1ndo conviene usarlo y qu\u00e9 buenas pr\u00e1cticas deber\u00edas tener en cuenta para crear animaciones \u00fatiles, accesibles y f\u00e1ciles de mantener.<\/p>\n\n\n\n<h2 id=\"h-que-es-keyframes-en-css\" class=\"wp-block-heading\">Qu\u00e9 es @keyframes en CSS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>@keyframes<\/code> es una regla de CSS que se utiliza para definir los distintos estados de una animaci\u00f3n. Su funci\u00f3n principal es describir c\u00f3mo cambia un elemento a lo largo del tiempo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dicho de forma sencilla, <strong>@keyframes CSS marca los pasos de una animaci\u00f3n<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, podemos hacer que un elemento pase de estar invisible a visible, que se desplace de izquierda a derecha, que cambie de tama\u00f1o, que rote, que parpadee o que combine varias transformaciones a la vez.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La estructura b\u00e1sica es esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes nombreAnimacion {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso, la animaci\u00f3n empieza con una opacidad de <code>0<\/code>, por lo que el elemento no se ve. Despu\u00e9s termina con una opacidad de <code>1<\/code>, de modo que aparece completamente visible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pero definir el <code>@keyframes<\/code> no es suficiente. Para que la animaci\u00f3n se aplique a un elemento, necesitamos usar la propiedad <code>animation<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.caja {\n  animation: nombreAnimacion 1s ease-in-out;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed estamos indicando que el elemento con clase <code>.caja<\/code> debe usar la animaci\u00f3n llamada <code>nombreAnimacion<\/code>, que tendr\u00e1 una duraci\u00f3n de <code>1s<\/code> y una curva de movimiento <code>ease-in-out<\/code>.<\/p>\n\n\n\n<h2 id=\"h-como-funciona-keyframes-paso-a-paso\" class=\"wp-block-heading\">C\u00f3mo funciona @keyframes paso a paso<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para entender bien las <strong>animaciones con keyframes<\/strong>, conviene separar el proceso en dos partes: primero se define la animaci\u00f3n y despu\u00e9s se aplica al elemento.<\/p>\n\n\n\n<h3 id=\"h-1-definir-la-animacion-con-keyframes\" class=\"wp-block-heading\">1. Definir la animaci\u00f3n con @keyframes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La regla <code>@keyframes<\/code> funciona como una especie de guion. Dentro de ella escribimos qu\u00e9 cambios queremos que ocurran durante la animaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos usar <code>from<\/code> y <code>to<\/code> cuando solo necesitamos indicar un punto inicial y un punto final.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes aparecer {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este ejemplo es muy com\u00fan para crear un efecto de aparici\u00f3n suave.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n podemos escribirlo con porcentajes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes aparecer {\n  0% {\n    opacity: 0;\n  }\n\n  100% {\n    opacity: 1;\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ambas versiones hacen lo mismo. <code>from<\/code> equivale a <code>0%<\/code> y <code>to<\/code> equivale a <code>100%<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La ventaja de usar porcentajes es que podemos a\u00f1adir pasos intermedios. Por ejemplo, podemos hacer que un elemento no solo aparezca, sino que tambi\u00e9n se mueva, crezca o rebote durante el proceso.<\/p>\n\n\n\n<h3 id=\"h-2-aplicar-la-animacion-con-animation\" class=\"wp-block-heading\">2. Aplicar la animaci\u00f3n con animation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez definida la animaci\u00f3n, necesitamos aplicarla a un selector CSS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-name: aparecer;\n  animation-duration: 1s;\n  animation-timing-function: ease;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n podemos escribirlo de forma abreviada:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation: aparecer 1s ease;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La propiedad <code>animation<\/code> es un shorthand, es decir, una forma resumida de escribir varias propiedades relacionadas con la animaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta separaci\u00f3n es importante: <code>@keyframes<\/code> define qu\u00e9 ocurre, mientras que <code>animation<\/code> define c\u00f3mo se ejecuta.<\/p>\n\n\n\n<h2 id=\"h-propiedades-principales-de-css-animation-keyframes\" class=\"wp-block-heading\">Propiedades principales de CSS animation keyframes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para trabajar correctamente con <strong>CSS animation keyframes<\/strong>, no basta con conocer <code>@keyframes<\/code>. Tambi\u00e9n es importante entender las propiedades que controlan c\u00f3mo se reproduce la animaci\u00f3n.<\/p>\n\n\n\n<h3 id=\"h-animation-name\" class=\"wp-block-heading\">animation-name<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La propiedad <code>animation-name<\/code> indica el nombre de la animaci\u00f3n que queremos aplicar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-name: aparecer;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ese nombre debe coincidir con el nombre definido en <code>@keyframes<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes aparecer {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si el nombre no coincide, la animaci\u00f3n no funcionar\u00e1. Este es uno de los errores m\u00e1s habituales cuando se empieza a trabajar con keyframes CSS.<\/p>\n\n\n\n<h3 id=\"h-animation-duration\" class=\"wp-block-heading\">animation-duration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>animation-duration<\/code> define cu\u00e1nto dura la animaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-duration: 2s;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Puede expresarse en segundos (<code>s<\/code>) o milisegundos (<code>ms<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-duration: 500ms;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Una duraci\u00f3n demasiado corta puede pasar desapercibida. Una duraci\u00f3n demasiado larga puede resultar pesada. En interfaces web, muchas microinteracciones suelen funcionar bien entre <code>150ms<\/code> y <code>500ms<\/code>, aunque depende del tipo de efecto y del contexto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, no es lo mismo animar el hover de un bot\u00f3n que una entrada de contenido m\u00e1s elaborada. En el primer caso, una duraci\u00f3n breve suele ser suficiente. En el segundo, puede tener sentido usar un tiempo algo mayor.<\/p>\n\n\n\n<h3 id=\"h-animation-timing-function\" class=\"wp-block-heading\">animation-timing-function<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La propiedad <code>animation-timing-function<\/code> controla la velocidad de la animaci\u00f3n a lo largo del tiempo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-timing-function: ease-in-out;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Algunos valores frecuentes son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>linear<\/code>: mantiene una velocidad constante.<\/li>\n\n\n\n<li><code>ease<\/code>: empieza suave, acelera y termina suave.<\/li>\n\n\n\n<li><code>ease-in<\/code>: empieza lento y acelera.<\/li>\n\n\n\n<li><code>ease-out<\/code>: empieza r\u00e1pido y termina lento.<\/li>\n\n\n\n<li><code>ease-in-out<\/code>: empieza y termina suavemente.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n se puede usar <code>cubic-bezier()<\/code> para crear una curva personalizada.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este nivel de control es \u00fatil cuando queremos que el movimiento tenga una sensaci\u00f3n m\u00e1s natural.<\/p>\n\n\n\n<h3 id=\"h-animation-delay\" class=\"wp-block-heading\">animation-delay<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>animation-delay<\/code> permite retrasar el inicio de la animaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-delay: 1s;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto significa que la animaci\u00f3n empezar\u00e1 un segundo despu\u00e9s de que se aplique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es especialmente \u00fatil cuando queremos animar varios elementos de forma escalonada, por ejemplo, una lista de tarjetas que aparece una detr\u00e1s de otra.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.card:nth-child(1) {\n  animation-delay: 0ms;\n}\n\n.card:nth-child(2) {\n  animation-delay: 120ms;\n}\n\n.card:nth-child(3) {\n  animation-delay: 240ms;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este recurso puede ayudar a crear una sensaci\u00f3n de continuidad, siempre que no se abuse de \u00e9l.<\/p>\n\n\n\n<h3 id=\"h-animation-iteration-count\" class=\"wp-block-heading\">animation-iteration-count<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>animation-iteration-count<\/code> define cu\u00e1ntas veces se repite la animaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-iteration-count: 3;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si queremos que se repita indefinidamente, usamos <code>infinite<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.loader {\n  animation: girar 1s linear infinite;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este valor se utiliza mucho en loaders, iconos animados o efectos decorativos en bucle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aun as\u00ed, conviene usarlo con moderaci\u00f3n. Una animaci\u00f3n infinita puede ser \u00fatil cuando informa de que algo est\u00e1 cargando, pero puede resultar molesta si se utiliza solo como recurso decorativo.<\/p>\n\n\n\n<h3 id=\"h-animation-direction\" class=\"wp-block-heading\">animation-direction<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>animation-direction<\/code> indica la direcci\u00f3n en la que se reproduce la animaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-direction: alternate;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Algunos valores posibles son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>normal<\/code>: la animaci\u00f3n va de principio a fin.<\/li>\n\n\n\n<li><code>reverse<\/code>: la animaci\u00f3n se reproduce al rev\u00e9s.<\/li>\n\n\n\n<li><code>alternate<\/code>: alterna entre ida y vuelta.<\/li>\n\n\n\n<li><code>alternate-reverse<\/code>: alterna, pero empieza al rev\u00e9s.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esto resulta muy \u00fatil para animaciones que deben ir y volver, como un elemento flotando suavemente.<\/p>\n\n\n\n<h3 id=\"h-animation-fill-mode\" class=\"wp-block-heading\">animation-fill-mode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>animation-fill-mode<\/code> controla qu\u00e9 estilos conserva el elemento antes o despu\u00e9s de la animaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-fill-mode: forwards;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El valor <code>forwards<\/code> hace que el elemento conserve el estado final de la animaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, si una tarjeta entra desde abajo y termina en su posici\u00f3n normal, <code>forwards<\/code> permite que se quede en esa posici\u00f3n al terminar.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes subir {\n  from {\n    transform: translateY(40px);\n    opacity: 0;\n  }\n\n  to {\n    transform: translateY(0);\n    opacity: 1;\n  }\n}\n\n.tarjeta {\n  animation: subir 600ms ease-out forwards;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Sin <code>forwards<\/code>, el elemento podr\u00eda volver a su estado inicial al finalizar la animaci\u00f3n, algo que muchas veces no queremos.<\/p>\n\n\n\n<h2 id=\"h-ejemplo-practico-de-keyframes-css\" class=\"wp-block-heading\">Ejemplo pr\u00e1ctico de @keyframes CSS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos un ejemplo completo. Imagina que queremos animar una tarjeta para que aparezca suavemente desde abajo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div class=\"card\"&gt;\n  &lt;h2&gt;Animaci\u00f3n con CSS&lt;\/h2&gt;\n  &lt;p&gt;Esta tarjeta aparece con un movimiento suave.&lt;\/p&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>.card {\n  max-width: 320px;\n  padding: 24px;\n  border-radius: 16px;\n  background: #ffffff;\n  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12);\n\n  animation: entradaTarjeta 600ms ease-out forwards;\n}\n\n@keyframes entradaTarjeta {\n  0% {\n    opacity: 0;\n    transform: translateY(32px);\n  }\n\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso, la tarjeta empieza con <code>opacity: 0<\/code>, por lo que no se ve. Adem\u00e1s, tiene <code>transform: translateY(32px)<\/code>, as\u00ed que aparece ligeramente desplazada hacia abajo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al llegar al <code>100%<\/code>, la tarjeta ya es visible y vuelve a su posici\u00f3n natural.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este tipo de animaci\u00f3n es muy \u00fatil para mejorar la percepci\u00f3n de fluidez en una interfaz. No es una animaci\u00f3n decorativa sin sentido: ayuda a que el contenido aparezca de una forma m\u00e1s amable y menos brusca.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si est\u00e1s creando interfaces con componentes reutilizables, este mismo enfoque puede combinarse con metodolog\u00edas de dise\u00f1o m\u00e1s ordenadas, como explico en el art\u00edculo sobre <a href=\"https:\/\/martagonzalez.dev\/blog\/metodologias-de-desarrollo-de-software-cascada-agile-y-lean-explicadas\/\">metodolog\u00edas de desarrollo de software<\/a>, especialmente cuando trabajas en proyectos donde dise\u00f1o, desarrollo y experiencia de usuario deben avanzar de forma coordinada.<\/p>\n\n\n\n<h2 id=\"h-usar-porcentajes-intermedios-en-keyframes\" class=\"wp-block-heading\">Usar porcentajes intermedios en @keyframes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una de las ventajas de <strong>@keyframes CSS<\/strong> es que no estamos limitados a un inicio y un final. Podemos a\u00f1adir tantos puntos intermedios como necesitemos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes rebote {\n  0% {\n    transform: translateY(0);\n  }\n\n  30% {\n    transform: translateY(-30px);\n  }\n\n  60% {\n    transform: translateY(10px);\n  }\n\n  100% {\n    transform: translateY(0);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este ejemplo crea una animaci\u00f3n de rebote. El elemento sube, baja un poco y vuelve a su posici\u00f3n original.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.boton {\n  animation: rebote 700ms ease-in-out;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Los porcentajes intermedios permiten construir animaciones m\u00e1s expresivas. Sin embargo, conviene usarlos con criterio. Cuantos m\u00e1s pasos a\u00f1adimos, m\u00e1s compleja se vuelve la animaci\u00f3n y m\u00e1s f\u00e1cil es que el resultado parezca exagerado.<\/p>\n\n\n\n<h3 id=\"h-cuando-usar-varios-pasos\" class=\"wp-block-heading\">Cu\u00e1ndo usar varios pasos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Usar varios porcentajes tiene sentido cuando queremos crear una secuencia clara. Por ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un icono que rebota.<\/li>\n\n\n\n<li>Un loader con varios estados.<\/li>\n\n\n\n<li>Una ilustraci\u00f3n que cambia de posici\u00f3n.<\/li>\n\n\n\n<li>Un elemento que entra, se agranda y vuelve a su tama\u00f1o normal.<\/li>\n\n\n\n<li>Un aviso que llama la atenci\u00f3n con un peque\u00f1o movimiento.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"h-cuando-evitar-demasiados-pasos\" class=\"wp-block-heading\">Cu\u00e1ndo evitar demasiados pasos<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No siempre hace falta complicar una animaci\u00f3n. Si solo queremos suavizar un cambio entre dos estados, puede bastar con una transici\u00f3n o con un <code>@keyframes<\/code> muy sencillo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La clave est\u00e1 en hacerse una pregunta antes de a\u00f1adir movimiento: \u00bfesta animaci\u00f3n ayuda a entender mejor la interfaz o solo a\u00f1ade ruido visual?<\/p>\n\n\n\n<h2 id=\"h-diferencia-entre-transition-y-keyframes\" class=\"wp-block-heading\">Diferencia entre transition y @keyframes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una duda muy com\u00fan cuando se empieza a trabajar con animaciones en CSS es cu\u00e1ndo usar <code>transition<\/code> y cu\u00e1ndo usar <code>@keyframes<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La diferencia principal es esta:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><code>transition<\/code> suaviza el cambio entre dos estados.<\/strong><br><strong><code>@keyframes<\/code> permite crear una secuencia de animaci\u00f3n con uno o varios pasos.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, si queremos que un bot\u00f3n cambie de color al pasar el rat\u00f3n por encima, lo m\u00e1s l\u00f3gico es usar <code>transition<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.boton {\n  background: #753a88;\n  transition: background 200ms ease;\n}\n\n.boton:hover {\n  background: #cc2b5e;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed solo hay dos estados: normal y hover. Por eso <code>transition<\/code> es suficiente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En cambio, si queremos que un icono pulse constantemente, necesitamos una animaci\u00f3n con <code>@keyframes<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.icono {\n  animation: pulso 1.5s ease-in-out infinite;\n}\n\n@keyframes pulso {\n  0% {\n    transform: scale(1);\n  }\n\n  50% {\n    transform: scale(1.12);\n  }\n\n  100% {\n    transform: scale(1);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed no estamos simplemente pasando de un estado a otro por una interacci\u00f3n del usuario. Estamos creando una secuencia que se repite en el tiempo.<\/p>\n\n\n\n<h3 id=\"h-regla-rapida-para-elegir\" class=\"wp-block-heading\">Regla r\u00e1pida para elegir<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Una forma sencilla de decidir es esta:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Si hay dos estados, usa <code>transition<\/code>.<\/strong><br><strong>Si hay una secuencia, repetici\u00f3n o control avanzado, usa <code>@keyframes<\/code>.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esta regla no cubre todos los casos posibles, pero ayuda mucho cuando est\u00e1s empezando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n es \u00fatil relacionarlo con el dise\u00f1o de experiencia de usuario. El movimiento no deber\u00eda a\u00f1adirse solo porque \u201cqueda bonito\u201d, sino porque ayuda a comunicar mejor una acci\u00f3n o un cambio de estado. Esta idea conecta directamente con temas como el <a href=\"https:\/\/martagonzalez.dev\/blog\/efecto-patito-de-goma-como-esta-tecnica-ayuda-a-depurar-codigo-y-resolver-problemas-en-programacion\/\">Efecto Patito de Goma aplicado al desarrollo<\/a>: muchas veces, explicar qu\u00e9 queremos que haga una interfaz nos ayuda a elegir mejor la soluci\u00f3n t\u00e9cnica.<\/p>\n\n\n\n<h2 id=\"h-animaciones-utiles-con-keyframes-css\" class=\"wp-block-heading\">Animaciones \u00fatiles con keyframes CSS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las <strong>animaciones con keyframes<\/strong> pueden aplicarse a muchos elementos de una web. Lo importante es que tengan una intenci\u00f3n clara.<\/p>\n\n\n\n<h3 id=\"h-animacion-de-aparicion-suave\" class=\"wp-block-heading\">Animaci\u00f3n de aparici\u00f3n suave<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n\n.elemento {\n  animation: fadeIn 400ms ease forwards;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Es una de las animaciones m\u00e1s sencillas y m\u00e1s utilizadas. Sirve para mostrar contenido sin que aparezca de golpe.<\/p>\n\n\n\n<h3 id=\"h-animacion-de-entrada-lateral\" class=\"wp-block-heading\">Animaci\u00f3n de entrada lateral<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes slideIn {\n  from {\n    opacity: 0;\n    transform: translateX(-40px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateX(0);\n  }\n}\n\n.menu {\n  animation: slideIn 500ms ease-out forwards;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Puede funcionar bien en men\u00fas, paneles, banners o bloques de contenido.<\/p>\n\n\n\n<h3 id=\"h-loader-giratorio\" class=\"wp-block-heading\">Loader giratorio<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>.loader {\n  width: 40px;\n  height: 40px;\n  border: 4px solid #eeeeee;\n  border-top-color: #cc2b5e;\n  border-radius: 50%;\n  animation: girar 800ms linear infinite;\n}\n\n@keyframes girar {\n  to {\n    transform: rotate(360deg);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este ejemplo es muy habitual para indicar que una acci\u00f3n est\u00e1 en proceso. La animaci\u00f3n es infinita porque el loader debe seguir girando mientras se carga el contenido.<\/p>\n\n\n\n<h3 id=\"h-efecto-flotante\" class=\"wp-block-heading\">Efecto flotante<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes flotar {\n  0% {\n    transform: translateY(0);\n  }\n\n  50% {\n    transform: translateY(-12px);\n  }\n\n  100% {\n    transform: translateY(0);\n  }\n}\n\n.ilustracion {\n  animation: flotar 3s ease-in-out infinite;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este tipo de animaci\u00f3n suele usarse en ilustraciones, iconos decorativos o elementos destacados. Debe ser suave para no cansar al usuario.<\/p>\n\n\n\n<h2 id=\"h-buenas-practicas-para-usar-keyframes-en-css\" class=\"wp-block-heading\">Buenas pr\u00e1cticas para usar @keyframes en CSS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las animaciones pueden mejorar mucho una interfaz, pero tambi\u00e9n pueden empeorarla si se usan sin criterio. Por eso es importante aplicar algunas buenas pr\u00e1cticas.<\/p>\n\n\n\n<h3 id=\"h-usa-transform-y-opacity-siempre-que-puedas\" class=\"wp-block-heading\">Usa transform y opacity siempre que puedas<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando animes elementos, intenta priorizar propiedades como <code>transform<\/code> y <code>opacity<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  transform: translateY(20px);\n  opacity: 0;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Estas propiedades suelen ser m\u00e1s eficientes para el navegador que animar valores como <code>width<\/code>, <code>height<\/code>, <code>top<\/code>, <code>left<\/code> o <code>margin<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, en lugar de mover un elemento con <code>top<\/code>, es preferible usar <code>transform: translate()<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes moverConTop {\n  from {\n    top: 0;\n  }\n\n  to {\n    top: 100px;\n  }\n}\n\n@keyframes moverConTransform {\n  from {\n    transform: translateY(0);\n  }\n\n  to {\n    transform: translateY(100px);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto ayuda a que la animaci\u00f3n sea m\u00e1s fluida y tenga mejor rendimiento.<\/p>\n\n\n\n<h3 id=\"h-no-abuses-de-las-animaciones-infinitas\" class=\"wp-block-heading\">No abuses de las animaciones infinitas<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Las animaciones infinitas pueden ser \u00fatiles, pero tambi\u00e9n pueden distraer. Un loader giratorio tiene sentido porque informa al usuario de que algo est\u00e1 cargando. Un icono que no deja de moverse sin motivo puede resultar molesto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de usar <code>infinite<\/code>, preg\u00fantate si la animaci\u00f3n realmente necesita repetirse todo el tiempo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.elemento {\n  animation-iteration-count: infinite;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si no aporta informaci\u00f3n o contexto, quiz\u00e1 es mejor evitarlo.<\/p>\n\n\n\n<h3 id=\"h-cuida-la-accesibilidad\" class=\"wp-block-heading\">Cuida la accesibilidad<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No todas las personas perciben el movimiento de la misma manera. Algunas animaciones pueden causar incomodidad, mareo o dificultad para concentrarse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por eso es buena pr\u00e1ctica respetar la preferencia del usuario con <code>prefers-reduced-motion<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@media (prefers-reduced-motion: reduce) {\n  * {\n    animation-duration: 0.01ms;\n    animation-iteration-count: 1;\n    scroll-behavior: auto;\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n puedes desactivar animaciones concretas:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@media (prefers-reduced-motion: reduce) {\n  .ilustracion {\n    animation: none;\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto demuestra cuidado por la experiencia de todas las personas usuarias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La accesibilidad no deber\u00eda tratarse como un extra, sino como parte del propio proceso de dise\u00f1o y desarrollo. Igual que cuidamos la estructura, los textos o la jerarqu\u00eda visual, tambi\u00e9n deber\u00edamos cuidar c\u00f3mo se comporta el movimiento en pantalla.<\/p>\n\n\n\n<h3 id=\"h-manten-nombres-claros\" class=\"wp-block-heading\">Mant\u00e9n nombres claros<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El nombre de una animaci\u00f3n debe explicar qu\u00e9 hace.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes fadeIn {\n}\n\n@keyframes slideUp {\n}\n\n@keyframes pulse {\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Evita nombres poco descriptivos como <code>animacion1<\/code>, <code>movimiento2<\/code> o <code>efectoFinal<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En proyectos grandes, una nomenclatura clara ayuda mucho a mantener el CSS ordenado.<\/p>\n\n\n\n<h3 id=\"h-evita-animar-demasiados-elementos-a-la-vez\" class=\"wp-block-heading\">Evita animar demasiados elementos a la vez<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Una p\u00e1gina con muchas animaciones simult\u00e1neas puede parecer desordenada y afectar al rendimiento. Adem\u00e1s, si todo se mueve, nada destaca.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La animaci\u00f3n debe guiar la atenci\u00f3n, no competir por ella.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una buena pr\u00e1ctica es reservar las animaciones para momentos concretos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Entrada de contenido importante.<\/li>\n\n\n\n<li>Confirmaci\u00f3n de una acci\u00f3n.<\/li>\n\n\n\n<li>Estados de carga.<\/li>\n\n\n\n<li>Feedback visual.<\/li>\n\n\n\n<li>Microinteracciones relevantes.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-errores-comunes-al-trabajar-con-keyframes-css\" class=\"wp-block-heading\">Errores comunes al trabajar con @keyframes CSS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque <code>@keyframes<\/code> es bastante f\u00e1cil de entender, hay errores frecuentes que pueden hacer que la animaci\u00f3n no funcione como esperamos.<\/p>\n\n\n\n<h3 id=\"h-el-nombre-de-la-animacion-no-coincide\" class=\"wp-block-heading\">El nombre de la animaci\u00f3n no coincide<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>.caja {\n  animation: aparecerCaja 1s ease;\n}\n\n@keyframes aparecer {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En este caso, la animaci\u00f3n no se aplicar\u00e1 porque el elemento llama a <code>aparecerCaja<\/code>, pero el <code>@keyframes<\/code> se llama <code>aparecer<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La soluci\u00f3n es usar exactamente el mismo nombre.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.caja {\n  animation: aparecer 1s ease;\n}\n<\/code><\/pre>\n\n\n\n<h3 id=\"h-falta-la-duracion\" class=\"wp-block-heading\">Falta la duraci\u00f3n<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>.caja {\n  animation-name: aparecer;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si no indicamos una duraci\u00f3n, la animaci\u00f3n no tendr\u00e1 tiempo para ejecutarse como esperamos. Por eso siempre conviene a\u00f1adir <code>animation-duration<\/code> o usar el shorthand completo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.caja {\n  animation: aparecer 1s ease;\n}\n<\/code><\/pre>\n\n\n\n<h3 id=\"h-el-elemento-vuelve-a-su-estado-inicial\" class=\"wp-block-heading\">El elemento vuelve a su estado inicial<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Esto ocurre cuando la animaci\u00f3n termina y no se conserva el estado final.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.caja {\n  animation: subir 500ms ease;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Si queremos que el elemento conserve el \u00faltimo estado de la animaci\u00f3n, podemos a\u00f1adir <code>forwards<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.caja {\n  animation: subir 500ms ease forwards;\n}\n<\/code><\/pre>\n\n\n\n<h3 id=\"h-usar-animaciones-donde-bastaria-una-transicion\" class=\"wp-block-heading\">Usar animaciones donde bastar\u00eda una transici\u00f3n<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No todo necesita <code>@keyframes<\/code>. Si solo quieres suavizar un hover, un cambio de color o una apertura sencilla, probablemente <code>transition<\/code> sea suficiente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Usar la herramienta adecuada hace que el CSS sea m\u00e1s limpio y f\u00e1cil de mantener.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este mismo criterio tambi\u00e9n se puede aplicar a otros aspectos del desarrollo frontend. Por ejemplo, cuando eliges entre una soluci\u00f3n sencilla o una m\u00e1s compleja en React, conviene pensar primero en el problema que quieres resolver. Si est\u00e1s en esa fase de aprendizaje, puede ayudarte esta gu\u00eda sobre <a href=\"https:\/\/martagonzalez.dev\/blog\/como-aprender-react-desde-cero-guia-practica-para-empezar-paso-a-paso\/\">c\u00f3mo aprender React desde cero<\/a>.<\/p>\n\n\n\n<h2 id=\"h-ejemplo-completo-boton-con-efecto-de-pulso\" class=\"wp-block-heading\">Ejemplo completo: bot\u00f3n con efecto de pulso<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Veamos ahora un ejemplo completo de un bot\u00f3n que llama la atenci\u00f3n con un pulso suave.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;button class=\"cta-button\"&gt;\n  Ver proyecto\n&lt;\/button&gt;\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>.cta-button {\n  padding: 14px 24px;\n  border: 0;\n  border-radius: 999px;\n  background: #cc2b5e;\n  color: #ffffff;\n  font-size: 1rem;\n  font-weight: 600;\n  cursor: pointer;\n\n  animation: pulsoSuave 2s ease-in-out infinite;\n}\n\n@keyframes pulsoSuave {\n  0% {\n    transform: scale(1);\n    box-shadow: 0 0 0 0 rgba(204, 43, 94, 0.35);\n  }\n\n  70% {\n    transform: scale(1.04);\n    box-shadow: 0 0 0 14px rgba(204, 43, 94, 0);\n  }\n\n  100% {\n    transform: scale(1);\n    box-shadow: 0 0 0 0 rgba(204, 43, 94, 0);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este efecto puede ayudar a destacar una llamada a la acci\u00f3n, pero debe usarse con moderaci\u00f3n. Si todos los botones de una web tienen animaciones infinitas, el efecto deja de ser \u00fatil y puede resultar invasivo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una alternativa m\u00e1s equilibrada ser\u00eda activar la animaci\u00f3n solo en momentos concretos o aplicarla a un \u00fanico CTA principal.<\/p>\n\n\n\n<h2 id=\"h-keyframes-y-diseno-de-interfaces-no-todo-es-decoracion\" class=\"wp-block-heading\">@keyframes y dise\u00f1o de interfaces: no todo es decoraci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Uno de los errores m\u00e1s habituales al hablar de animaciones CSS es pensar que solo sirven para \u201chacer bonito\u201d. En realidad, el movimiento puede tener una funci\u00f3n muy importante dentro de una interfaz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una buena animaci\u00f3n puede:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ayudar a entender que un elemento ha aparecido o desaparecido.<\/li>\n\n\n\n<li>Indicar que una acci\u00f3n est\u00e1 en progreso.<\/li>\n\n\n\n<li>Guiar la atenci\u00f3n hacia una zona concreta.<\/li>\n\n\n\n<li>Reforzar una interacci\u00f3n.<\/li>\n\n\n\n<li>Hacer que los cambios de estado sean m\u00e1s naturales.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, cuando se abre un men\u00fa lateral, una animaci\u00f3n de entrada puede ayudar a entender de d\u00f3nde viene ese panel. Cuando aparece un mensaje de confirmaci\u00f3n, una peque\u00f1a transici\u00f3n puede hacer que el cambio sea m\u00e1s claro. Cuando se carga contenido, un loader evita que el usuario piense que la p\u00e1gina se ha quedado bloqueada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La clave est\u00e1 en usar las <strong>animaciones con keyframes<\/strong> como parte de la comunicaci\u00f3n visual, no como un adorno a\u00f1adido al final.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto tambi\u00e9n tiene relaci\u00f3n con el dise\u00f1o UI\/UX. Una herramienta como Figma puede ayudarte a pensar y prototipar estos comportamientos antes de llevarlos a c\u00f3digo. Si te interesa esa parte del proceso, puedes ampliar con el art\u00edculo sobre <a href=\"https:\/\/martagonzalez.dev\/blog\/figma-pros-y-contras-de-usar-esta-herramienta-de-diseno-ui-ux\/\">pros y contras de usar Figma como herramienta de dise\u00f1o UI\/UX<\/a>.<\/p>\n\n\n\n<h2 id=\"h-como-organizar-keyframes-en-un-proyecto-css\" class=\"wp-block-heading\">C\u00f3mo organizar keyframes en un proyecto CSS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En proyectos peque\u00f1os, puedes escribir los <code>@keyframes<\/code> cerca del componente o bloque donde se utilizan. Pero en proyectos m\u00e1s grandes, conviene mantener cierto orden.<\/p>\n\n\n\n<h3 id=\"h-agrupar-animaciones-reutilizables\" class=\"wp-block-heading\">Agrupar animaciones reutilizables<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si tienes animaciones que se repiten en varias partes del sitio, puedes crear una secci\u00f3n espec\u00edfica para ellas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes fadeIn {\n  from {\n    opacity: 0;\n  }\n\n  to {\n    opacity: 1;\n  }\n}\n\n@keyframes slideUp {\n  from {\n    opacity: 0;\n    transform: translateY(24px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Despu\u00e9s puedes aplicarlas en distintos componentes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.card {\n  animation: slideUp 500ms ease-out forwards;\n}\n\n.modal {\n  animation: fadeIn 300ms ease forwards;\n}\n<\/code><\/pre>\n\n\n\n<h3 id=\"h-crear-clases-utilitarias\" class=\"wp-block-heading\">Crear clases utilitarias<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Otra opci\u00f3n es crear clases reutilizables.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.animate-fade-in {\n  animation: fadeIn 400ms ease forwards;\n}\n\n.animate-slide-up {\n  animation: slideUp 500ms ease-out forwards;\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esto puede ser \u00fatil si trabajas con una metodolog\u00eda de estilos m\u00e1s modular o si quieres aplicar animaciones de forma consistente.<\/p>\n\n\n\n<h3 id=\"h-documentar-las-animaciones-importantes\" class=\"wp-block-heading\">Documentar las animaciones importantes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si una animaci\u00f3n tiene una funci\u00f3n concreta dentro del dise\u00f1o, merece la pena documentarla. No hace falta escribir una novela, pero s\u00ed dejar claro para qu\u00e9 sirve.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@keyframes cardEntrance {\n  from {\n    opacity: 0;\n    transform: translateY(32px);\n  }\n\n  to {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este tipo de organizaci\u00f3n ayuda a que otras personas del equipo entiendan por qu\u00e9 existe esa animaci\u00f3n.<\/p>\n\n\n\n<h2 id=\"h-keyframes-en-css-y-rendimiento-web\" class=\"wp-block-heading\">@keyframes en CSS y rendimiento web<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">El rendimiento es otro aspecto importante cuando hablamos de animaciones. Una animaci\u00f3n puede verse muy bien en un ordenador potente, pero funcionar peor en dispositivos m\u00e1s antiguos o en m\u00f3viles con menos recursos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por eso, al trabajar con <code>@keyframes<\/code>, conviene tener en cuenta tres ideas b\u00e1sicas.<\/p>\n\n\n\n<h3 id=\"h-prioriza-animaciones-ligeras\" class=\"wp-block-heading\">Prioriza animaciones ligeras<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Las propiedades <code>transform<\/code> y <code>opacity<\/code> suelen ser las mejores candidatas para animar porque permiten movimientos fluidos sin forzar tantos rec\u00e1lculos visuales.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En cambio, animar propiedades relacionadas con el layout, como <code>width<\/code>, <code>height<\/code>, <code>top<\/code>, <code>left<\/code>, <code>margin<\/code> o <code>padding<\/code>, puede generar m\u00e1s trabajo para el navegador.<\/p>\n\n\n\n<h3 id=\"h-no-animes-todo-al-cargar-la-pagina\" class=\"wp-block-heading\">No animes todo al cargar la p\u00e1gina<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Animar demasiados elementos al mismo tiempo puede ralentizar la experiencia inicial. Si todo entra, rebota, gira y aparece a la vez, la p\u00e1gina pierde claridad.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es mejor seleccionar algunos elementos clave y usar el movimiento para reforzar la jerarqu\u00eda visual.<\/p>\n\n\n\n<h3 id=\"h-comprueba-la-experiencia-en-movil\" class=\"wp-block-heading\">Comprueba la experiencia en m\u00f3vil<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Muchas veces dise\u00f1amos y probamos animaciones en escritorio, pero gran parte del tr\u00e1fico llega desde m\u00f3vil. Una animaci\u00f3n que parece sutil en una pantalla grande puede resultar excesiva en una pantalla peque\u00f1a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por eso conviene probar siempre c\u00f3mo se siente la animaci\u00f3n en diferentes tama\u00f1os de pantalla.<\/p>\n\n\n\n<h2 id=\"h-preguntas-frecuentes-sobre-keyframes-en-css\" class=\"wp-block-heading\">Preguntas frecuentes sobre @keyframes en CSS<\/h2>\n\n\n\n<h3 id=\"h-que-diferencia-hay-entre-keyframes-y-animation-en-css\" class=\"wp-block-heading\">\u00bfQu\u00e9 diferencia hay entre @keyframes y animation en CSS?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>@keyframes<\/code> define los pasos de la animaci\u00f3n, mientras que <code>animation<\/code> aplica esa animaci\u00f3n a un elemento y controla aspectos como la duraci\u00f3n, la repetici\u00f3n, el retraso o la curva de movimiento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dicho de otra forma: <strong>@keyframes describe qu\u00e9 ocurre<\/strong> y <code>animation<\/code> indica <strong>c\u00f3mo y cu\u00e1ndo se ejecuta<\/strong>.<\/p>\n\n\n\n<h3 id=\"h-puedo-usar-keyframes-para-animar-cualquier-propiedad-css\" class=\"wp-block-heading\">\u00bfPuedo usar @keyframes para animar cualquier propiedad CSS?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">T\u00e9cnicamente, muchas propiedades CSS pueden animarse, pero no todas son igual de recomendables. Para obtener mejores resultados, suele ser preferible animar <code>transform<\/code> y <code>opacity<\/code>, porque ofrecen mejor rendimiento y suelen generar movimientos m\u00e1s fluidos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Animar propiedades como <code>width<\/code>, <code>height<\/code>, <code>top<\/code>, <code>left<\/code> o <code>margin<\/code> puede ser m\u00e1s costoso para el navegador, sobre todo si se aplica a muchos elementos a la vez.<\/p>\n\n\n\n<h3 id=\"h-cuando-deberia-usar-keyframes-en-lugar-de-transition\" class=\"wp-block-heading\">\u00bfCu\u00e1ndo deber\u00eda usar @keyframes en lugar de transition?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Conviene usar <code>@keyframes<\/code> cuando necesitas una secuencia, una repetici\u00f3n o varios pasos intermedios. Por ejemplo, un loader giratorio, un efecto de pulso, una entrada elaborada o una animaci\u00f3n que se repite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En cambio, si solo quieres suavizar el cambio entre dos estados, como un hover o un men\u00fa que se abre y se cierra, probablemente sea mejor usar <code>transition<\/code>.<\/p>\n\n\n\n<h2 id=\"h-cuando-el-movimiento-tambien-comunica\" class=\"wp-block-heading\">Cuando el movimiento tambi\u00e9n comunica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aprender <strong>c\u00f3mo funciona @keyframes en CSS<\/strong> es mucho m\u00e1s que memorizar una sintaxis. Es entender que el movimiento forma parte del dise\u00f1o de una interfaz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una animaci\u00f3n bien planteada no est\u00e1 ah\u00ed para llamar la atenci\u00f3n porque s\u00ed. Est\u00e1 ah\u00ed para acompa\u00f1ar al usuario, explicar un cambio, suavizar una transici\u00f3n o reforzar una acci\u00f3n. Por eso, antes de a\u00f1adir un efecto, conviene preguntarse qu\u00e9 aporta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>@keyframes CSS<\/code> te da mucho control: puedes definir estados, crear secuencias, repetir movimientos y construir efectos visuales complejos sin necesidad de JavaScript. Pero ese control tambi\u00e9n requiere criterio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si est\u00e1s empezando, qu\u00e9date con esta idea: <strong>usa keyframes CSS cuando necesites controlar una animaci\u00f3n paso a paso<\/strong>. Para cambios simples entre dos estados, una <code>transition<\/code> suele ser suficiente. Para secuencias, repeticiones y movimientos m\u00e1s elaborados, <code>@keyframes<\/code> es la herramienta adecuada.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al final, animar bien no significa mover m\u00e1s cosas. Significa moverlas mejor. Y cuando el movimiento tiene intenci\u00f3n, la interfaz se siente m\u00e1s clara, m\u00e1s fluida y mucho m\u00e1s cuidada.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>@keyframes en CSS permite crear animaciones paso a paso definiendo estados como 0%, 50% o 100%. En esta gu\u00eda aprender\u00e1s c\u00f3mo funciona, cu\u00e1ndo usarlo y c\u00f3mo aplicarlo con buenas pr\u00e1cticas.<\/p>\n","protected":false},"author":1,"featured_media":19396,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"mg_rating_sum":0,"mg_rating_count":0,"mg_rating_average":0,"footnotes":""},"categories":[82],"tags":[362,360,361],"class_list":["post-19394","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-keyframes-css-2","tag-animaciones-con-keyframes","tag-keyframes-css"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.6 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil<\/title>\n<meta name=\"description\" content=\"C\u00f3mo funciona @keyframes en CSS paso a paso, buenas pr\u00e1cticas y consejos para crear animaciones CSS \u00fatiles.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil\" \/>\n<meta property=\"og:description\" content=\"C\u00f3mo funciona @keyframes en CSS paso a paso, buenas pr\u00e1cticas y consejos para crear animaciones CSS \u00fatiles.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/\" \/>\n<meta property=\"og:site_name\" content=\"Marta Gonz\u00e1lez - Desarrollo Front-end\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=100031998110346\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/profile.php?id=100031998110346\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-07T05:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-09T16:53:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil.avif\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"marta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"marta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/\"},\"author\":{\"name\":\"marta\",\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/#\\\/schema\\\/person\\\/3df598b4756cd72fec6126546267c738\"},\"headline\":\"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil\",\"datePublished\":\"2026-06-07T05:00:00+00:00\",\"dateModified\":\"2026-06-09T16:53:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/\"},\"wordCount\":3472,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/#\\\/schema\\\/person\\\/3df598b4756cd72fec6126546267c738\"},\"image\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/como-funciona-keyframes-css-explicado-facil.avif\",\"keywords\":[\"@keyframes CSS\",\"animaciones con keyframes\",\"keyframes CSS\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/\",\"url\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/\",\"name\":\"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/como-funciona-keyframes-css-explicado-facil.avif\",\"datePublished\":\"2026-06-07T05:00:00+00:00\",\"dateModified\":\"2026-06-09T16:53:45+00:00\",\"description\":\"C\u00f3mo funciona @keyframes en CSS paso a paso, buenas pr\u00e1cticas y consejos para crear animaciones CSS \u00fatiles.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#primaryimage\",\"url\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/como-funciona-keyframes-css-explicado-facil.avif\",\"contentUrl\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/como-funciona-keyframes-css-explicado-facil.avif\",\"width\":1536,\"height\":1024,\"caption\":\"Representaci\u00f3n visual de una animaci\u00f3n CSS creada con @keyframes, mostrando c\u00f3mo un elemento cambia paso a paso a lo largo del tiempo.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/blog\\\/como-funciona-keyframes-en-css-explicado-facil\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/#website\",\"url\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/\",\"name\":\"Marta Gonz\u00e1lez\",\"description\":\"Desarrollo Front-end\",\"publisher\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/#\\\/schema\\\/person\\\/3df598b4756cd72fec6126546267c738\"},\"alternateName\":\"Marta Gonz\u00e1lez Desarrollo Frontend\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/#\\\/schema\\\/person\\\/3df598b4756cd72fec6126546267c738\",\"name\":\"marta\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/cropped-logo-martagonzalez.avif\",\"url\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/cropped-logo-martagonzalez.avif\",\"contentUrl\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/cropped-logo-martagonzalez.avif\",\"width\":575,\"height\":575,\"caption\":\"marta\"},\"logo\":{\"@id\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/cropped-logo-martagonzalez.avif\"},\"description\":\"Me dedico al desarrollo front-end. Tengo estudios de multimedia, administraci\u00f3n de sistemas y desarrollo de aplicaciones inform\u00e1ticas. Trabajo con lenguajes HTML5, CSS3 y JavaScript. Me gustan los retos, soy autodidacta, creativa y proactiva. Aprendo con facilidad y me adapto a nuevos entornos r\u00e1pidamente.\",\"sameAs\":[\"https:\\\/\\\/martagonzalez.dev\\\/wp\",\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=100031998110346\",\"https:\\\/\\\/www.instagram.com\\\/mcgweb\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/martacg\\\/\",\"marta\"],\"birthDate\":\"1986-01-07\",\"gender\":\"mujer\",\"knowsAbout\":[\"HTML5\",\"CSS3\",\"Javascript\"],\"jobTitle\":\"Desarrollo Frontend\",\"url\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/author\\\/marta\\\/\",\"publishingPrinciples\":\"https:\\\/\\\/martagonzalez.dev\\\/wp\\\/politica-de-privacidad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil","description":"C\u00f3mo funciona @keyframes en CSS paso a paso, buenas pr\u00e1cticas y consejos para crear animaciones CSS \u00fatiles.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/","og_locale":"es_ES","og_type":"article","og_title":"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil","og_description":"C\u00f3mo funciona @keyframes en CSS paso a paso, buenas pr\u00e1cticas y consejos para crear animaciones CSS \u00fatiles.","og_url":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/","og_site_name":"Marta Gonz\u00e1lez - Desarrollo Front-end","article_publisher":"https:\/\/www.facebook.com\/profile.php?id=100031998110346","article_author":"https:\/\/www.facebook.com\/profile.php?id=100031998110346","article_published_time":"2026-06-07T05:00:00+00:00","article_modified_time":"2026-06-09T16:53:45+00:00","og_image":[{"width":1536,"height":1024,"url":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil.avif","type":"image\/jpeg"}],"author":"marta","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"marta","Tiempo de lectura":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#article","isPartOf":{"@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/"},"author":{"name":"marta","@id":"https:\/\/martagonzalez.dev\/wp\/#\/schema\/person\/3df598b4756cd72fec6126546267c738"},"headline":"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil","datePublished":"2026-06-07T05:00:00+00:00","dateModified":"2026-06-09T16:53:45+00:00","mainEntityOfPage":{"@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/"},"wordCount":3472,"commentCount":0,"publisher":{"@id":"https:\/\/martagonzalez.dev\/wp\/#\/schema\/person\/3df598b4756cd72fec6126546267c738"},"image":{"@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#primaryimage"},"thumbnailUrl":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil.avif","keywords":["@keyframes CSS","animaciones con keyframes","keyframes CSS"],"articleSection":["Blog"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/","url":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/","name":"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil","isPartOf":{"@id":"https:\/\/martagonzalez.dev\/wp\/#website"},"primaryImageOfPage":{"@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#primaryimage"},"image":{"@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#primaryimage"},"thumbnailUrl":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil.avif","datePublished":"2026-06-07T05:00:00+00:00","dateModified":"2026-06-09T16:53:45+00:00","description":"C\u00f3mo funciona @keyframes en CSS paso a paso, buenas pr\u00e1cticas y consejos para crear animaciones CSS \u00fatiles.","breadcrumb":{"@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#primaryimage","url":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil.avif","contentUrl":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2026\/06\/como-funciona-keyframes-css-explicado-facil.avif","width":1536,"height":1024,"caption":"Representaci\u00f3n visual de una animaci\u00f3n CSS creada con @keyframes, mostrando c\u00f3mo un elemento cambia paso a paso a lo largo del tiempo."},{"@type":"BreadcrumbList","@id":"https:\/\/martagonzalez.dev\/wp\/blog\/como-funciona-keyframes-en-css-explicado-facil\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/martagonzalez.dev\/wp\/"},{"@type":"ListItem","position":2,"name":"C\u00f3mo funciona @keyframes en CSS explicado f\u00e1cil"}]},{"@type":"WebSite","@id":"https:\/\/martagonzalez.dev\/wp\/#website","url":"https:\/\/martagonzalez.dev\/wp\/","name":"Marta Gonz\u00e1lez","description":"Desarrollo Front-end","publisher":{"@id":"https:\/\/martagonzalez.dev\/wp\/#\/schema\/person\/3df598b4756cd72fec6126546267c738"},"alternateName":"Marta Gonz\u00e1lez Desarrollo Frontend","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/martagonzalez.dev\/wp\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/martagonzalez.dev\/wp\/#\/schema\/person\/3df598b4756cd72fec6126546267c738","name":"marta","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2025\/05\/cropped-logo-martagonzalez.avif","url":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2025\/05\/cropped-logo-martagonzalez.avif","contentUrl":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2025\/05\/cropped-logo-martagonzalez.avif","width":575,"height":575,"caption":"marta"},"logo":{"@id":"https:\/\/martagonzalez.dev\/wp\/wp-content\/uploads\/2025\/05\/cropped-logo-martagonzalez.avif"},"description":"Me dedico al desarrollo front-end. Tengo estudios de multimedia, administraci\u00f3n de sistemas y desarrollo de aplicaciones inform\u00e1ticas. Trabajo con lenguajes HTML5, CSS3 y JavaScript. Me gustan los retos, soy autodidacta, creativa y proactiva. Aprendo con facilidad y me adapto a nuevos entornos r\u00e1pidamente.","sameAs":["https:\/\/martagonzalez.dev\/wp","https:\/\/www.facebook.com\/profile.php?id=100031998110346","https:\/\/www.instagram.com\/mcgweb","https:\/\/www.linkedin.com\/in\/martacg\/","marta"],"birthDate":"1986-01-07","gender":"mujer","knowsAbout":["HTML5","CSS3","Javascript"],"jobTitle":"Desarrollo Frontend","url":"https:\/\/martagonzalez.dev\/wp\/author\/marta\/","publishingPrinciples":"https:\/\/martagonzalez.dev\/wp\/politica-de-privacidad\/"}]}},"_links":{"self":[{"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/posts\/19394","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/comments?post=19394"}],"version-history":[{"count":3,"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/posts\/19394\/revisions"}],"predecessor-version":[{"id":19398,"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/posts\/19394\/revisions\/19398"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/media\/19396"}],"wp:attachment":[{"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/media?parent=19394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/categories?post=19394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/martagonzalez.dev\/wp\/wp-json\/wp\/v2\/tags?post=19394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}