Saltar al contenido
Curso de CSS
Todos los cursos

Ejercicio: Transiciones y animaciones

  • ⏱ 35 minutos
  • 📶 Nivel: principiante

Objetivo

Dar vida a una interfaz con una transición en un botón, una tarjeta que se levanta, tres animaciones con @keyframes y respeto por el movimiento reducido.

La página de partida

Este es el HTML de tu página. No lo modifiques: escribe solo el CSS.

pagina.html
<button class="boton">Pásame el cursor</button>
<div class="tarjeta"><h3>Tarjeta</h3><p>Se levanta al pasar el cursor.</p></div>
<div class="aviso">Hola, aparezco con un fundido</div>
<div class="cargando"><span class="punto"></span></div>
<div class="latido">♥</div>
✏️ Prueba tu CSS aquí (opcional)

Pasos

Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.

💡 Pista 1: mi transición no se nota

Revisa que la transition esté en la regla base (.boton), no solo en .boton:hover, y que nombre una propiedad que realmente cambie.

💡 Pista 2: mi animación no se repite

Para que sea continua necesitas infinite. Y recuerda que @keyframes y animation deben usar exactamente el mismo nombre.

🔎 Comprueba tu trabajo

Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista.

    ✅ Ver una solución de ejemplo

    Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.

    estilos.css
    *, *::before, *::after { box-sizing: border-box; }
    body { margin: 0; padding: 24px; font-family: system-ui, sans-serif; }
    
    .boton {
      background: #4f46e5;
      color: #fff;
      border: 0;
      padding: 10px 20px;
      border-radius: 10px;
      transition: background-color 0.2s, transform 0.2s;
    }
    .boton:hover { background: #3730a3; transform: translateY(-3px); }
    
    .tarjeta {
      width: 240px;
      margin: 16px 0;
      padding: 16px;
      border-radius: 14px;
      box-shadow: 0 1px 2px rgb(0 0 0 / .08);
      transition: transform .25s, box-shadow .25s;
    }
    .tarjeta:hover {
      transform: translateY(-6px);
      box-shadow: 0 14px 30px rgb(0 0 0 / .18);
    }
    
    @keyframes aparecer {
      from { opacity: 0; transform: translateY(12px); }
      to   { opacity: 1; transform: none; }
    }
    .aviso { animation: aparecer 0.5s ease-out both; }
    
    @keyframes latido {
      0%, 100% { transform: scale(1); }
      50%      { transform: scale(1.25); }
    }
    .latido { animation: latido 1.2s ease-in-out infinite; }
    
    @keyframes girar { to { transform: rotate(360deg); } }
    .punto {
      display: block;
      width: 32px;
      height: 32px;
      border: 4px solid #c7d2fe;
      border-top-color: #4f46e5;
      border-radius: 50%;
      animation: girar 0.8s linear infinite;
    }
    
    @media (prefers-reduced-motion: reduce) {
      * { animation: none !important; transition: none !important; }
    }

    💡 🏁 Reto extra (opcional)

    Haz que tres tarjetas aparezcan escalonadas: cada una con un animation-delay distinto. Después comprueba, activando «reducir movimiento» en tu sistema, que desaparece el efecto.