Las medidas relativas en CSS son una bendición… hasta que dejan de serlo. En cuanto entran en juego padding, márgenes o bordes, los porcentajes empiezan a fallar y los layouts se rompen sin avisar. En mi caso, este problema aparece constantemente cuando intento alinear contenedores fluidos y mantener márgenes fijos sin perder espacio útil.
Aquí es donde entra en juego la función calc() de CSS, una de las herramientas más prácticas de CSS3 para hacer cálculos directamente en el navegador y recuperar el control del diseño.
Las medidas relativas en CSS pueden darnos muchos problemas al momento de llevarlas a cabo en CSS; aplicar porcentajes en donde existen márgenes, bordes o márgenes internos también llamados
paddinges prácticamente imposible si sólo empleamos porcentajes.
La gente de CSS pensó en todo y crearon una nueva función llamada calc() que es provista a partir de CSS3 con la cual podemos realizar cálculos u operaciones matemáticas; es decir, sumas, restas, multiplicaciones y por supuesto divisiones; además de esto hay una excelente noticia y es la buena acogida que ha tenido ya que es soportada por los principales navegadores modernos.
¿Qué es la función calc() en CSS y para qué sirve?
calc() es una función disponible en CSS3 que permite realizar cálculos con medidas u operaciones matemáticas desde el propio CSS: operaciones de sumar ( + ), restar ( - ), multiplicar ( * ) y división ( / ) son soportadas a través de la función calc().
calc() es una función de CSS que permite realizar operaciones matemáticas directamente en el valor de una propiedad. Gracias a ella podemos sumar, restar, multiplicar o dividir medidas sin conocer de antemano el tamaño final del elemento o del viewport.
Por qué los porcentajes y las medidas relativas fallan en CSS
Cuando defines un ancho del 25%, ese porcentaje no tiene en cuenta:
- padding
- border
- margin
Esto provoca que varios contenedores que deberían ocupar el 100% del ancho terminen superándolo. En proyectos reales, especialmente responsive, esto ocurre más de lo que parece.
calc(): dejar los cálculos en manos del navegador
Con calc() delegamos el cálculo al navegador del usuario, que sí conoce el tamaño real del viewport y del elemento en cada momento. Esa es su gran ventaja frente a valores fijos o cálculos “a ojo”.
Suma, resta, multiplica y divide distintos tipos de medidas con la función calc de CSS
La sintaxis es sencilla:
selector {
propiedad: calc(expresión);
}Con la función calc podemos aplicar operaciones matemáticas a los distintos tipos de medidas en una misma operación; es decir podemos hacer operaciones como la siguiente:
calc(100% - 2*5px - 2*10px - 2px);Finalmente, asignamos la función a cualquier propiedad de medida de algún elemento HTML; por ejemplo:
.miclase {
height : calc(100% - 2*5px - 2*10px - 2px);
}Cómo ves, la función calc() es ideal para trabajar con el problema más que recurrente que tenemos cuando queremos definir los márgenes de un contenedor que define sus dimensiones en porcentajes; como el mostrado anteriormente.
Operaciones matemáticas permitidas
calc() soporta:
- ➕ suma (+)
- ➖ resta (-)
- ✖️ multiplicación (*)
- ➗ división (/)
Ejemplo simple:
.elemento {
width: calc(200px + 50px);
}Mezclar unidades: porcentajes, píxeles, em y viewport
Uno de los grandes puntos fuertes de calc() es que permite mezclar unidades distintas:
.elemento {
width: calc(100% - 20px);
}Este tipo de cálculo es imposible de resolver previamente porque depende del tamaño real del contenedor en tiempo de ejecución.
Espacios, paréntesis y precedencia de operadores
Hay dos reglas que siempre respeto porque evitan errores difíciles de detectar:
- Siempre deja espacios alrededor de + y -
- Usa paréntesis cuando el orden de las operaciones no sea obvio
/* Correcto */
width: calc(100% - 2 * 10px);
/* Incorrecto */
width: calc(100%-20px);La función calc ideal para el diseño responsive
En diseño responsive trabajamos casi siempre con porcentajes. El problema es que los porcentajes por sí solos no ofrecen precisión.
En más de una ocasión, al adaptar un diseño a móviles, he tenido que afinar posiciones combinando valores fluidos con márgenes fijos. calc() encaja perfecto en ese escenario.
Entre los cálculos que hacemos para crear sitios adaptables en base al responsive web design esta la de porcentajes (%) ampliamente utilizados para hacer que los sitios se adaptan a múltiples resoluciones.
Los porcentajes en conjunto con esta función permite personalizar a un mayor grado la exactitud de la posición de los objetos en el contenido HTML; veamos unos ejemplos para entender en detalle cómo funciona.
La función calc() en la práctica
Muchas veces queremos dibujar contenedores consecutivos que se adapten al espacio disponible y con un margen entre ellos digamos de 10 pixeles y cuando nos ponemos ha realizar cálculos como los siguientes:

Vemos que tiene varios propiedades definidas presentes como margen (margin), margen interno (padding), bordes (border), etc, lo que conlleva a aumentar el tamaño del contenedor y por ende complicar cuando queremos tener varios contenedores del mismo tamaño alineados en el eje horizontal y minimizar el espacio perdido (es decir espacio, que no forme parte del contenedor); pero con calc de CSS podemos solventar esto fácilmente.
Supongamos que queremos crear cuatro (4) contenedores que deben de estar alineados y tener el mismo ancho, largo y ocupar el mayor tamaño posible dejando un espacio entre ellos como vimos en la imagen anterior; con CSS tradicional quedaría muy mal porque si empleamos medidas estáticas en los márgenes en un punto se rompe el orden y el cálculo falla, algo similar sucede si empleamos porcentajes en todos los niveles, en donde el espacio sería demasiado grande en un punto; entonces cómo podemos hacer el cálculo.
Lo primero que se nos ocurre es colocarle a todos los contenedores con un mismo ancho (width) de 25%; además necesitaremos algunas otras propiedades como las siguientes con un cálculo fijo para el margen:
.example1 div{
float : left;
margin : 10px 0 10px 10px;
padding : 5px;
background:#CCC;
}Y obtenemos el siguiente resultado; esto es sin emplear la función calc de CSS:
Lo que se aleja del diseño original ya que solo tres (3) de los contenedores están posicionados conjuntamente y hay algo malo con el cálculo anterior.
Problema con los cálculos: márgenes y padding de los contenedores junto con los porcentajes
Como indicamos anteriormente, cuando empleamos otras propiedades como márgenes (margin), márgenes internos (padding), bordes (border) estos afectan directamente el tamaño de nuestro contenedor y por lo tanto resulta en contenedores de un tamaño algo mayor a 25%; para ser precisos y siguiendo nuestro ejemplo el tamaño de cada contenedor sería algo como lo mostrado en el siguiente cálculo:
/* ancho + margen derecho + margen izquierdo + padding derecho + padding izquierdo + borde derecho + borde izquierdo*/
largo contenedor = 25% + 10px + 10px + 5px + 5px + 3px + 3px;O lo que es lo mismo:
largo contenedor = 25% + 2*10px + 2*5px +2*3px;Obviamente sumando los cuatro contenedores darían un valor mayor a 100% y no podemos alinear los contenedores en la misma línea por lo dicho anteriormente y nuestro cálculo falla.
Con la función calc podemos restar todas estas propiedades del ancho (margen (margin), margen interno (padding) y bordes (border)) y obtener el efecto deseado:
width : calc(25% - 2*5px - 10px - 2px);Un caso parecido ocurre cuando queramos calcular el largo del contenedor:
height : calc(100% - 2*5px - 2*10px - 2px);Finalmente queda definida la regla como:
.example1 div{
float : left;
margin : 10px 0 10px 10px;
padding : 5px;
width : calc(25% - 2*5px - 10px - 2px);
min-height : calc(100% - 2*5px - 2*10px - 2px);
background:#CCC;
}Ahora obtenemos como resultado:
La función calc(), contenedores y la propiedad position
Veamos otro ejemplo empleando la función calc en conjunto de la propiedad position.
Queremos obtener el mismo efecto; es decir, alinear contenedores en el eje horizontal maximizando el espacio total en cada contenedor; pero a diferencia del caso anterior, los contenedores rompen con el flujo normal de la página a través de la propiedad position; aun así podemos ingeniarnosla y emplear la función calc de CSS:
.example1 div{
position: absolute;
width : 25%;
height : 60%;
background:#CCC;
top:calc(50% - 60% / 2);
border: 1px solid #F00;
}Esta vez solo tendremos 3 contenedores al cual aplicar el cálculo y por lo tanto cada uno debe de ocupar un 33% de su espacio; en este 33% debe de comprender los márgenes (margin), márgenes internos (padding) y bordes (border.
Al ser contenedores posicionados con la propiedad position, emplear propiedades como el margen no tendrán ningún efecto en el mismo, por lo tanto debemos de simular el margen con la propiedad left o right para que queden espaciados entre los contenedores:
.example1 div:nth-child(1) {
left : calc(0% + 6.25%);
}
.example1 div:nth-child(2) {
left : calc(25% + 6.50%*2);
}
.example1 div:nth-child(3) {
left : calc(50% + 6.25%*3);
}Y obtenemos:
Cómo podemos darnos cuenta, la función calc() es ideal para realizar cálculos matemáticos sobre las proporciones y posiciones de nuestros elementos, podemos mezclar porcentajes con valores numéricos fácilmente.
Calcular anchos sin que padding y border rompan el diseño
Supongamos cuatro contenedores alineados en horizontal, cada uno con:
- width: 25%
- padding: 5px
- border: 1px solid
El cálculo real sería:
25% + 2*5px + 2*1pxAl sumar cuatro contenedores, el total supera el 100% y el layout se rompe. Este es un problema que me he encontrado infinidad de veces al maquetar grids manuales.
La solución con calc()
.item {
width: calc(25% - 2*5px - 2px);
padding: 5px;
border: 1px solid #ccc;
}Ahora sí, los cuatro elementos encajan perfectamente sin desbordes inesperados.
Calcular también la altura correctamente:
.item {
min-height: calc(100% - 2*5px - 2*10px - 2px);
}Combinar porcentajes y píxeles sin media queries
.card {
width: calc(100% - 40px);
}Este enfoque reduce la necesidad de múltiples media queries y evita saltos bruscos en el layout.
Cuándo calc() es mejor que valores fijos
- Cuando el ancho depende del viewport
- Cuando hay padding o border involucrados
- Cuando el diseño debe adaptarse de forma fluida
Alinear contenedores con calc(): casos prácticos
calc() con el flujo normal del documento:
.box {
float: left;
width: calc(25% - 10px);
margin-left: 10px;
}Este patrón me ha permitido crear filas completas de contenedores sin perder espacio útil.
calc() junto a position: absolute:
.box:nth-child(1) {
left: calc(0% + 6.25%);
}
.box:nth-child(2) {
left: calc(25% + 6.25% * 2);
}No es la solución más común, pero es extremadamente útil en layouts complejos.
Distintas unidades con la función calc de CSS3
Hasta ahora hemos empleado los píxeles en cada uno de los ejemplos anteriores que variamos los cálculos con la función calc(), pero también podemos emplear otros tipos de unidades y de manera conjunta; por ejemplo:
line-height: calc(3em + 2px);Unidades compatibles con calc() en CSS
Puedes usar prácticamente cualquier unidad numérica:
- px
- %
- em / rem
- vw / vh
- vmin / vmax
- tiempos y ángulos
Ejemplo:
line-height: calc(3em + 2px);Errores comunes al usar calc() en CSS
Algunos fallos que veo con frecuencia:
- Olvidar los espacios en + y -
- Multiplicar dos valores con unidad
- Dividir por valores con unidad incompatible
- Intentar usar calc() en media queries
Evitar estos errores ahorra mucho tiempo de depuración.
Compatibilidad de calc() con navegadores modernos
calc() es compatible con todos los navegadores modernos. En proyectos actuales se puede usar con total seguridad.
Un fallback sencillo sería:
.elemento {
width: 92%;
width: calc(100% - 2rem);
}Cuándo deberías usar calc() (y cuándo no)
- Usa calc() cuando:
- Necesites mezclar unidades
- Trabajes con layouts fluidos
- Padding y márgenes afecten al tamaño final
- Evítalo cuando:
- Un valor fijo resuelve el problema
- El cálculo no aporta claridad
Preguntas frecuentes sobre la función calc() de CSS
- ¿Se pueden mezclar porcentajes y píxeles con calc()?
- Sí, es uno de sus principales usos.
- ¿calc() afecta al rendimiento?
- No de forma apreciable. El navegador gestiona estos cálculos sin problema.
- ¿Se puede usar calc() en cualquier propiedad?
- Solo en propiedades que acepten valores numéricos.
Conclusión: por qué calc() es clave para layouts modernos en CSS
Después de usarla durante años, tengo claro que calc() no es una función “avanzada”, sino una herramienta esencial cuando trabajas con layouts reales. Permite combinar flexibilidad y precisión, algo que los porcentajes por sí solos no consiguen.
Si alguna vez tus contenedores no encajan como deberían, probablemente calc() sea la pieza que falta.
En definitiva, te podríamos dar muchísimos otros ejemplos, pero creo que la idea a quedado clara, la función calc() de CSS3 permite realizar cálculos matemáticos para mezclarlos con porcentajes, píxeles y otras medidas y de esta manera adaptar perfectamente las dimensiones de un contenedor o grupo de los mismos sobre nuestra página web.
Acepto recibir anuncios de interes sobre este Blog.
Calc es una función disponible en CSS3 que permite realizar operaciones matemáticas desde el propio CSS; las operaciones de sumar ( + ), restar ( - ), multiplicar ( * ) y división ( / ) son soportadas a través de la función calc.