🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【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íficas
  • animation-timing-function: ease, linear, ease-in-out etc. para cambiar la calidad del movimiento
  • animation-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>
¡Copiado!