Ejercicio: Transiciones y animaciones
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.
<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>
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.
*, *::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.