Valores Absolutos en CSS con abs()
Tienes una propiedad personalizada de CSS que puede ser positiva o negativa según el contexto, y necesitas usarla en algún lugar que solo acepta valores positivos, como padding o animation-delay. Antes de abs(), tenías que recurrir a JavaScript o escribir una solución verbosa con max(). Ahora puedes manejarlo directamente en CSS.
Puntos Clave
abs()es una función matemática de CSS que devuelve el valor absoluto (no negativo) de una expresión numérica, preservando la unidad original.- Acepta números, longitudes, porcentajes, ángulos y cualquier expresión válida dentro de
calc(). - Los casos de uso comunes incluyen sanitizar propiedades personalizadas para propiedades que rechazan valores negativos, temporización simétrica de animaciones y espaciado responsivo.
- Para navegadores antiguos, usa
max(var(--x), calc(-1 * var(--x)))como alternativa.
¿Qué es la Función abs() de CSS?
abs() es una función matemática de CSS de la especificación CSS Values and Units Module Level 4. Toma una única expresión numérica y devuelve su valor absoluto — siempre no negativo, con la misma unidad que la entrada.
width: abs(-200px); /* → 200px */
padding: abs(20px - 30px); /* → 10px */
font-size: abs(-1.5rem); /* → 1.5rem */
Funciona con números, longitudes, porcentajes, ángulos y cualquier expresión que escribirías dentro de calc(). Las unidades se preservan exactamente.
Sintaxis y Tipos de Valores Soportados
abs( <calc-sum> )
El argumento puede ser cualquier cosa que se resuelva a un valor numérico:
abs(-4) /* número simple → 4 */
abs(-8vh) /* longitud → 8vh */
abs(-60%) /* porcentaje → 60% */
abs(20% - 60%) /* expresión → 40% */
abs(min(-20px, 10px)) /* función anidada → 20px */
Una aclaración importante: abs() opera sobre la expresión matemática que proporcionas, pero valores como porcentajes aún se resuelven posteriormente según las reglas normales de la propiedad. Por ejemplo, abs(25%) en background-position todavía se resuelve a través de la fórmula de dimensionamiento de esa propiedad después.
Casos de Uso Prácticos
Prevenir Valores Negativos Inválidos de Propiedades Personalizadas
Las propiedades personalizadas pueden contener valores con signo que rompen ciertas propiedades CSS cuando son negativos.
:root {
--offset: -30px; /* podría ser positivo o negativo */
}
/* ❌ Antes: padding-top: -30px es inválido */
.card { padding-top: var(--offset); }
/* ✅ Después: siempre se resuelve a 30px */
.card { padding-top: abs(var(--offset)); }
Este patrón es especialmente útil en sistemas de diseño donde los tokens pueden establecerse programáticamente.
Estabilizar animation-delay en Animaciones Simétricas
Al calcular la distancia desde un índice central, la resta puede resultar negativa para elementos antes del centro. Un animation-delay negativo no difiere el inicio — causa que la animación comience a mitad de su ciclo, lo que rompe la temporización simétrica de onda:
.bar {
--distance: abs(var(--my-idx) - var(--center-idx));
animation-delay: calc(var(--distance) * 0.1s);
}
Sin abs(), las barras a la izquierda del centro obtendrían un retraso negativo y saltarían adelante en la animación en lugar de esperar su turno.
Discover how at OpenReplay.com.
Cálculos de Espaciado Responsivo
.section {
gap: abs(10vw - 4rem); /* siempre un gap positivo, independientemente del viewport */
}
abs() vs. Otras Funciones Matemáticas de CSS
| Función | Qué hace | Ejemplo |
|---|---|---|
abs() | Devuelve el valor no negativo | abs(-10px) → 10px |
max() | Devuelve el mayor de N valores | max(0px, var(--val)) |
clamp() | Restringe a un rango | clamp(1rem, 2vw, 3rem) |
calc() | Aritmética arbitraria | calc(100% - 2rem) |
La solución alternativa con max() para valores absolutos — max(var(--x), calc(-1 * var(--x))) — funciona pero es verbosa. Úsala solo cuando necesites compatibilidad con navegadores antiguos que carecen de soporte para abs().
Soporte de Navegadores y Alternativas
abs() está soportado en navegadores modernos incluyendo versiones recientes de Chrome, Edge, Firefox y Safari. El soporte es sólido en las versiones actuales de navegadores, pero versiones antiguas pueden carecer de él. Consulta Can I Use — abs() para datos de compatibilidad actuales.
Para mejora progresiva:
@supports not (width: abs(-10px)) {
.element {
padding: max(var(--val), calc(-1 * var(--val)));
}
}
Errores Comunes
abs() no funciona con palabras clave de CSS:
width: abs(auto); /* ❌ inválido — auto no es una expresión numérica */
Envolver calc() dentro de abs() es redundante:
width: abs(calc(50% - 100px)); /* ⚠️ funciona pero innecesario */
width: abs(50% - 100px); /* ✅ más limpio */
abs() no es lo mismo que el abs() integrado de Sass — Sass lo resuelve en tiempo de compilación con números sin unidades, mientras que el abs() de CSS se ejecuta en el navegador durante el diseño y maneja dimensiones apropiadamente. Si usas ambos, ten en cuenta que Sass puede interceptar la llamada. Para pasarla a CSS, puedes escribir abs(#{...}) o usar la forma con espacio de nombres math.abs() para la versión de Sass explícitamente.
Conclusión
abs() llena un vacío real en las matemáticas de CSS: te permite trabajar con valores con signo de manera segura, sin JavaScript ni soluciones complicadas. Si estás construyendo componentes que usan propiedades personalizadas para espaciado, temporización o cálculos de diseño, vale la pena agregarlo a tu conjunto de herramientas ahora que el soporte de navegadores es sólido en los motores modernos.
Preguntas Frecuentes
Sí. Si tu propiedad personalizada contiene un número sin unidades, abs() devolverá su equivalente no negativo como un número sin unidades. Luego puedes multiplicar el resultado por una unidad dentro de calc(), por ejemplo calc(abs(var(--value)) * 1px), para producir una longitud.
abs(0) devuelve 0. Esto es perfectamente válido y no causará ningún problema. La función simplemente confirma que el valor es no negativo, y cero ya satisface esa condición.
Sí. Las funciones matemáticas de CSS incluyendo abs() pueden usarse en media queries y container queries modernos siempre que la expresión se resuelva a un valor válido. Por ejemplo, @media (min-width: abs(600px)) es CSS válido en navegadores actuales.
Sass tiene su propia función abs() que opera en tiempo de compilación sobre números sin unidades. Para asegurar que la llamada pase al CSS nativo, envuelve el argumento con sintaxis de interpolación como abs(#{50% - 100px}), o usa el math.abs() con espacio de nombres para llamadas específicas de Sass de modo que el abs() simple se deje para el navegador.
Complete picture for complete understanding
Capture every clue your frontend is leaving so you can instantly get to the root cause of any issue with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data.
Check our GitHub repo and join the thousands of developers in our community.