【CSS】Implementación de animaciones usando elementos span
Aunque los elementos span son elementos en línea, al combinarlos con animaciones CSS puedes agregar efectos dinámicos a porciones de texto. Este artículo explica cómo implementar varios efectos de animación en elementos span usando display: inline-block y @keyframes.
Este texto está animado
Características de las animaciones en span
- Decoración parcial de texto: Permite aplicar efectos a palabras específicas dentro de párrafos
- Implementación ligera: Se logra solo con CSS, sin necesidad de JavaScript
- Alta versatilidad: Utilizable en varios escenarios como botones, etiquetas y avisos
🔹 Código básico
<span class="highlight">Texto animado</span>
<style>
.highlight {
animation: highlight 2s infinite;
display: inline-block; /* Hace posible la animación */
}
@keyframes highlight {
0% { background-color: yellow; }
50% { background-color: orange; transform: scale(1.05); }
100% { background-color: yellow; }
}
</style>
🧩 Personalización de animaciones
Modificando las reglas @keyframes puedes crear varios efectos de animación. Aunque los elementos span normalmente son elementos en línea, configurar display: inline-block permite animar propiedades como ancho, alto y márgenes.
Patrones de animación comunes
/* Animación de rotación - ideal para íconos */
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Fade-in - para elementos que quieres destacar */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
/* Rebote - para botones de llamado a acción */
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
Puntos de configuración de animaciones
animation-iteration-count: infinite para bucles infinitos, o un número para iteraciones específicasanimation-timing-function: ease, linear, ease-in-out etc. para cambiar la calidad del movimientoanimation-delay: Retrasa el inicio de la animación
🎯 Casos prácticos y consideraciones
Escenarios de uso efectivo
1. Énfasis en palabras clave
Cláusulas importantes en contratos o precios que los usuarios deben leer
2. Guías de operación
Indicar campos obligatorios o ejemplos en formularios
3. Indicadores de estado
Expresiones como "Nuevo" o "Limitado"
Consideraciones importantes
✗ Uso excesivo de animaciones
Aplicar animaciones a demasiados elementos simultáneamente puede confundir a los usuarios u ocultar contenido importante.
✓ Consideraciones de accesibilidad
Para usuarios sensibles al movimiento, proporciona una opción para desactivar animaciones usando @media (prefers-reduced-motion: reduce).
✗ Impacto en el rendimiento
Animar propiedades pesadas como box-shadow o filter puede causar problemas de rendimiento en móviles.
💻 Código completo funcional
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Demo de animación span</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
text-align: center;
}
.highlight {
animation: highlight 2s infinite;
padding: 0.2rem 0.4rem;
border-radius: 4px;
display: inline-block;
}
@keyframes highlight {
0% { background-color: #ffeb3b; }
50% { background-color: #ff9800; transform: scale(1.05); }
100% { background-color: #ffeb3b; }
}
</style>
</head>
<body>
<p>Este <span class="highlight">texto</span> está animado</p>
</body>
</html>
💯 Código completo funcional (Todas las animaciones + efectos interactivos)
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Demo completa de animación span</title>
<style>
body {
font-family: 'Arial', sans-serif;
line-height: 1.6;
padding: 20px;
max-width: 800px;
margin: 0 auto;
background: #f5f5f5;
}
.demo-section {
background: white;
border-radius: 8px;
padding: 20px;
margin: 20px 0;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
h2 {
color: #333;
border-bottom: 2px solid #eee;
padding-bottom: 10px;
}
/* Animación básica de resaltado */
.highlight {
animation: highlight 2s infinite;
padding: 0.2rem 0.4rem;
border-radius: 4px;
display: inline-block;
}
@keyframes highlight {
0% { background-color: #ffeb3b; }
50% { background-color: #ff9800; transform: scale(1.05); }
100% { background-color: #ffeb3b; }
}
/* Animación de rotación */
.spin {
animation: spin 3s linear infinite;
display: inline-block;
font-weight: bold;
color: #2196F3;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Animación fade-in */
.fade-in {
animation: fadeIn 2s ease-in-out infinite alternate;
}
@keyframes fadeIn {
from { opacity: 0.3; }
to { opacity: 1; }
}
/* Animación de rebote */
.bounce {
animation: bounce 1.5s ease infinite;
display: inline-block;
color: #4CAF50;
font-weight: bold;
}
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
/* Animación de pulso (ejemplo práctico) */
.pulse {
animation: pulse 1.5s infinite;
color: #e91e63;
font-weight: bold;
padding: 0 5px;
}
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.1); }
100% { transform: scale(1); }
}
/* Mostrar advertencia */
.warning {
animation: warning 1s infinite alternate;
background: #ff5722;
color: white;
padding: 2px 5px;
border-radius: 3px;
}
@keyframes warning {
from { background: #ff5722; }
to { background: #ff9800; }
}
/* Efecto hover interactivo */
.hover-effect {
display: inline-block;
padding: 5px 15px;
background: #4285f4;
color: white;
border-radius: 20px;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
margin-left: 10px;
}
.hover-effect:hover {
background: #3367d6;
transform: translateY(-3px);
box-shadow: 0 5px 15px rgba(0,0,0,0.2);
}
.hover-effect:hover::after {
content: "¡Haz clic!";
position: absolute;
top: -40px;
left: 50%;
transform: translateX(-50%);
background: #333;
color: white;
padding: 5px 10px;
border-radius: 4px;
font-size: 12px;
white-space: nowrap;
animation: fadeIn 0.3s ease-out;
}
.hover-effect:active {
transform: translateY(-1px) scale(0.98);
}
</style>
</head>
<body>
<div class="demo-section">
<h2>Animación básica de resaltado</h2>
<p>Este <span class="highlight">texto</span> tiene animación de cambio de color y escala</p>
</div>
<div class="demo-section">
<h2>Ejemplos de animación personalizada</h2>
<h3>Animación de rotación</h3>
<p>El ícono <span class="spin">⚙️ Configuración</span> está girando</p>
<h3>Animación fade-in</h3>
<p>Mensaje <span class="fade-in">importante</span> aparece lentamente</p>
<h3>Animación de rebote</h3>
<p>¡Por favor <span class="bounce">haz clic aquí</span>!</p>
</div>
<div class="demo-section">
<h2>Casos de uso prácticos</h2>
<h3>Destacar oferta limitada</h3>
<p>Usa la <span class="pulse">oferta limitada</span> ahora</p>
<h3>Mostrar advertencia</h3>
<p><span class="warning">⚠️ Importante</span>: ¡Hoy es la fecha límite!</p>
<h3>Elemento interactivo (versión mejorada)</h3>
<p>Pasa el cursor sobre <span class="hover-effect">👉 aquí</span></p>
<ul>
<li>El botón flota y muestra tooltip al pasar el cursor</li>
<li>El clic produce efecto de presionado</li>
<li>Transiciones suaves</li>
</ul>
</div>
</body>
</html>