Logo Gerardo Perrucci - Full Stack Developer

Dominando la Función CSS attr(): Estilos Dinámicos con Atributos HTML

Función CSS attr()

La función CSS attr() es una joya oculta que conecta HTML y CSS, permitiendo a los desarrolladores crear diseños dinámicos y basados en datos con un mínimo de JavaScript.

Aunque tradicionalmente se usaba para tooltips simples, los avances modernos han expandido sus capacidades para soportar valores específicos de tipo, diseño responsivo e incluso temas. Este artículo explora casos de uso prácticos, ejemplos de código y el rol en evolución de attr() en el desarrollo web moderno.


¿Qué es la Función CSS attr()?

La función attr() recupera el valor de un atributo HTML y lo aplica a una propiedad CSS. Inicialmente limitada a la propiedad content para contenido generado (p.ej., tooltips), CSS3 expandió su alcance para soportar otras propiedades y tipos de datos .

Sintaxis Básica

selector {
  property: attr(attribute-name type);
}
  • attribute-name: El atributo HTML a apuntar (p.ej., data-color).
  • type (opcional): Especifica el tipo de dato (p.ej., string, number, color). Por defecto es string si se omite .

Casos de Uso y Ejemplos Principales

Tooltips con Contenido Dinámico

Utiliza attr() con pseudo-elementos ::before/::after para mostrar metadatos almacenados en atributos HTML.

<button data-tooltip="Guardar cambios">Haz clic aquí</button>
button {
  position: relative;
}

button::after {
  content: attr(data-tooltip);
  position: absolute;
  bottom: 100%;
  left: 50%;
  transform: translateX(-50%);
  background: #333;
  color: white;
  padding: 4px 8px;
  border-radius: 4px;
  white-space: nowrap;
  opacity: 0;
  transition: opacity 0.3s;
}

button:hover::after {
  opacity: 1;
}

Resultado: Al pasar el ratón sobre el botón, se revela un tooltip con el texto de data-tooltip .


Estilos Dinámicos Basados en Atributos

Utiliza attr() para aplicar estilos directamente desde atributos HTML. Por ejemplo, establece el color del texto dinámicamente:

<p data-color="#ff0000">Texto rojo</p>
<p data-color="#00ff00">Texto verde</p>
p {
  color: attr(data-color type(<color>), blue);
}

Nota: El soporte del navegador para propiedades que no son content aún es limitado. Siempre proporciona alternativas .


Imágenes Responsivas con Comportamiento Similar a srcset

Aunque srcset es estándar para imágenes responsivas, attr() puede simular un comportamiento similar en CSS para imágenes de fondo:

<div class="hero" data-mobile-img="mobile.jpg" data-desktop-img="desktop.jpg"></div>
.hero {
  background-image: attr(data-mobile-img url);
}

@media (min-width: 768px) {
  .hero {
    background-image: attr(data-desktop-img url);
  }
}

Limitación: Este enfoque carece de las optimizaciones de rendimiento de srcset nativo, pero funciona para casos simples .


Temas con Atributos de Datos

Centraliza las variables de tema en HTML para el consumo de CSS:

<body data-theme="dark">
  <h1>Tema Oscuro</h1>
</body>
body {
  --primary-color: attr(data-theme color);
}

body[data-theme='dark'] {
  --primary-color: #1a1a1a;
}

body[data-theme='light'] {
  --primary-color: #ffffff;
}

Consejo: Combina con variables CSS para temas más robustos .


Pros y Contras de attr()

ProsContras
Reduce las dependencias de JavaScript

Soporte limitado del navegador para propiedades que no son content

Simplifica el contenido dinámicoSe requieren alternativas para navegadores más antiguos
Centraliza los datos en HTMLMenos potente que las variables CSS para temas

Cuándo Usar attr() vs. Alternativas

  • Usa attr() para:
    • Tooltips o etiquetas simples.
    • Estilos dinámicos únicos vinculados a atributos HTML.
  • Prefiere Variables CSS para:
    • Temas complejos o valores reutilizables.
    • Mayor compatibilidad con navegadores .

Compatibilidad del Navegador

NavegadorSoporte (Básico)Soporte (Conocimiento de Tipos)
Chrome✅ 4+⚠️ Experimental
Firefox✅ 2+⚠️ Experimental
Safari✅ 3.1+
Edge✅ 12+⚠️ Experimental

Datos de MDN y Can I Use (2025)


Decorative quote icon

La función attr() es un testimonio de la evolución de CSS: combinando marcado y estilo de maneras que reducen la sobrecarga de JavaScript.


Ejemplo de Código Final: Sistema de Calificación Interactivo

<div class="rating" data-score="4.5">★★★★☆</div>
.rating {
  font-size: 2rem;
  color: #ccc;
  position: relative;
}

.rating::before {
  content: '★★★★★';
  position: absolute;
  color: gold;
  width: calc(attr(data-score number) * 20%);
  overflow: hidden;
}

Resultado: Una calificación de estrellas que se resalta dinámicamente basada en data-score .

Referencias