
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 esstring
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()
Pros | Contras |
---|---|
Reduce las dependencias de JavaScript | Soporte limitado del navegador para propiedades que no son |
Simplifica el contenido dinámico | Se requieren alternativas para navegadores más antiguos |
Centraliza los datos en HTML | Menos 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
Navegador | Soporte (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)
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
.