Conozco varios casos donde no es canónico su uso, pero es mucho más sencillo hacerlo con calc
que de cualquier otra manera.
Posicionamiento de imágenes de fondo
Es bastante sencillo posicionar una imagen de fondo
.ejemplo {
width: 500px;
height: 500px;
border: 1px solid black;
background-image: url('https://i.imgur.com/W51iG94.png');
background-repeat: no-repeat;
background-position: 150px 50px;
}
<div class="ejemplo"></div>
Pero ¿qué ocurre cuando queremos posicionar la imagen de fondo en relación a los lados derecho e inferior y no conocemos de antemano el tamaño del elemento contendor? Con calc
es lo más sencillo.
.ejemplo {
width: 100%;
height: 500px;
border: 1px solid black;
background-image: url('https://i.imgur.com/W51iG94.png');
background-repeat: no-repeat;
background-position: calc(100% - 150px) calc(100% - 50px);
}
<div class="ejemplo"></div>
Mucho más sencillo así.
Creación de un sistema GRID
Imagina que quieres diseñar tu propio sistema GRID, pongamos de 7 columnas.
Esto provocaría que en código CSS tuviéramos cifras decimales difíciles de leer y entender:
.col-1 {
border: 1px solid black;
width: 14.2857%;
height: 50px;
}
.col-5 {
border: 1px solid black;
width: 71.4285%;
height: 50px;
}
.col-3 {
border: 1px solid black;
width: 42.8517%;
height: 50px;
}
<div class="col-1"></div>
<div class="col-5"></div>
<div class="col-3"></div>
Podemos conseguir que el código sea más legible e incluso casi "autoexplicativo" sustituyendo los feos decimales por el uso de calc
.
.col-1 {
border: 1px solid black;
width: calc(100% / 7);
height: 50px;
}
.col-5 {
border: 1px solid black;
width: calc(100% / 7 * 5);
height: 50px;
}
.col-3 {
border: 1px solid black;
width: calc(100% / 7 * 3);
height: 50px;
}
<div class="col-1"></div>
<div class="col-5"></div>
<div class="col-3"></div>
Nuevamente, parece más sencillo hacerlo de esta manera.
Posicionar y dimensionar elementos flotantes.
Imagina que tienes que posicionar 2 elementos flotantes en un contenedor de ancho variable (y desconocido) manteniendo la relación de aspecto entre ellos, y con una separación (margen) fijo entre ellos.
.rojo {
width: 40%;
float: left;
height: 100%;
margin-right: 1em;
padding: 30px;
background: red;
color: white;
}
.azul {
width: calc(60% - 1em);
float: right;
height: 100%;
padding: 30px;
color: white;
background: blue;
}
html, body {
height: 100%;
background: #ccc;
padding: 20px;
}
body {
padding: 20px;
background: white;
}
* {
box-sizing: border-box;
}
<div class="rojo">
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</div>
<div class="azul">
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</div>
Consideraciones a tener en cuenta
Sintáxis
Es importante respetar las sintáxis de calc
: calc(100%[espacio]-[espacio]50px)
Cosas como calc(100%[espacio]-50px)
o calc(100%-50px)
No funcionarán en todos los navegadores.
Reglas de respaldo
Aunque la mayoría de navegadores soportan a calc
, es una buena práctica usar una regla de respaldo para navegadores que no lo hagan:
.respaldo {
width: 85%; /* Valor aproximado, para navegadores que no lo soporten */
width: calc(100% - 100px);
}
Tenéis estos y otros casos de uso en https://css-tricks.com/a-couple-of-use-cases-for-calc/