piapia123
es

Laboratorio de calc() en CSS

Estilos

Todo se ejecuta en tu navegador: no se sube nada

Vista previa en vivoCambia cualquier opción de arriba y esto se actualiza al instante
Código CSS

Escribe una expresión `calc()` y mira cuánto da y dónde está mal. La razón principal de que exista esta herramienta es una trampa en la que cae casi todo el mundo: los operadores de suma y resta necesitan un espacio a cada lado. `calc(100% - 2rem)` es válido, `calc(100%-2rem)` no, y este segundo parece completamente normal, no da error y simplemente hace que el navegador descarte la declaración entera, dejando la propiedad en auto. Aquí se señala en el acto. También se comprueban otras dos reglas de sintaxis: uno de los lados de una multiplicación o división tiene que ser un número sin unidad (`1px * 2` vale, `1px * 1px` no), y anidar `calc()` es válido (`calc(100% - calc(2rem + 4px))`). El analizador solo entiende números, unidades, los cuatro operadores, paréntesis y `var()`; todo lo demás da error, y no se usa `eval`. Las tres cantidades (ancho del contenedor, tamaño de fuente y separación) se emiten como propiedades personalizadas (`--cw`, `--fs`, `--gap`), así que en la expresión basta con escribir `var(--gap)` en vez de repetir el número a mano. La unidad se puede cambiar entre px, rem, vw y % para ver cómo cambia el resultado.

Funciones

  • Escribe una expresión calc() con validación y evaluación en vivo
  • ⚠️ Detecta la falta de espacios alrededor de + y −: calc(100%-2rem) es inválido y sin embargo parece correcto
  • ⚠️ Comprueba las unidades: la suma exige magnitudes del mismo tipo y la multiplicación o división, un número sin unidad en un lado
  • Entiende paréntesis y calc() anidado, y avisa de los que no están emparejados
  • Emite el ancho del contenedor, el tamaño de fuente y la separación como propiedades personalizadas (--cw, --fs, --gap)
  • Las expresiones pueden referirse a esas tres cantidades con var()
  • La unidad se cambia entre px, rem, vw y % para ver cambiar el resultado
  • Solo se entienden números, unidades, operadores, paréntesis y var(); no se ejecuta nada (sin eval)
  • Todo se ejecuta en tu navegador y no se sube nada

Cómo se usa

  1. Fija el ancho del contenedor, el tamaño de fuente y la separación, y elige una unidad
  2. Escribe una expresión calc(...), dejando un espacio a cada lado de + y −
  3. Lee las notas de evaluación y los mensajes de error de abajo
  4. Copia el CSS generado, con las propiedades personalizadas y la regla juntas

Preguntas frecuentes

¿Por qué calc(100%-2rem) no hace nada si parece correcto?
Porque los operadores de suma y resta necesitan un espacio a cada lado. La especificación de CSS exige un espacio en blanco alrededor de `+` y `-` cuando actúan como operadores, así que `calc(100%-2rem)` es un valor inválido: el navegador descarta la declaración entera y la propiedad vuelve a su valor inicial o a auto. No hay error ni aviso, y eso es lo que lo hace tan difícil de encontrar. Escribir `calc(100% - 2rem)` lo arregla (la multiplicación y la división no necesitan espacios).
¿Por qué no vale 1px * 1px?
Porque la multiplicación en CSS multiplica también las unidades: `1px * 1px` da píxeles al cuadrado, y CSS no tiene esa unidad. Uno de los lados de una multiplicación o división tiene que ser un número sin unidad, así que lo que funciona es `1px * 2` o `6px / 2`. Es la parte de `calc()` que más se confunde con la aritmética normal.
¿Se ejecuta mi expresión como código?
No. Aquí no hay `eval`: eso ejecutaría como código lo que escriba el usuario. La validación pasa por un analizador pequeño que solo entiende números, unidades, los cuatro operadores, paréntesis y `var()`, y rechaza todo lo demás. De paso, `eval` tampoco detectaría el error de espacios de antes: leería `100%-2rem` tan contento como 98.
¿Un porcentaje es relativo a qué?
A aquello a lo que sea relativa la propiedad en la que lo uses. En `width` es la anchura del bloque contenedor; en `font-size`, el tamaño de fuente del padre. Así que lo que vale `100%` depende de en qué propiedad esté escrito. Por eso también las unidades relativas no se pueden reducir a una cifra concreta fuera de contexto: cuando hay unidades relativas de por medio, esta herramienta da el tipo de unidad y un valor de referencia en vez de inventarse un número de píxeles.

Herramientas relacionadas