Line-height y vertical-align: cómo trabajan y se calcula la línea base del alineamiento en Css 30.4.15
El concepto de half-leading (medio interlineado) en Css, la relación entre line-height y font-size y cómo se calcula en Css la línea base para la alineación vertical (vertical-align) de los elementos.
Line-height y vertical-align: cómo trabajan y se calcula la línea base del alineamiento en Css
Las dos propiedades Css del título del artículo line-height y vertical-alignson sencillas y fáciles de usar. Pero creo que todos alguna vez nos hemos sorprendido de su "comportamiento" y hemos dicho algo como "pero qué pasa aquí". Especialmente si alguna vez has utilizado un fondo (ya sea una imagen o un gradiente css) para simular un rayado horizontal y ves que no acaba de acomodarse perfectamente el texto a su línea base.
Siempre toca andar retocando algún píxel arriba o abajo para lograr una alineación perfecta respecto a la línea base. Y sin embargo es el comportamiento lógico según la norma establecida
Cálculo del interlineado en Css
La sorpresa anterior se debe, creo yo, a que inicialmente nuestra lógica es la del impresor de imprenta. Sin embargo, la línea base de la alineación en la web (interlineado) difiere de la utilizada en medios impresos.
El "medio interlineado" o half-leading en Css
La diferencia entre el tamaño de la fuente (font-size) y el valor computado de line-height se llama interlineado.
La mitad del valor del interlineado se llama medio interlineado (half-leading) y es este valor el usado en css como línea base para la alineación vertical.
Los navegadores centran verticalmente los carácteres en una caja a nivel de línea, agregando medio interlineado por encima y otro medio por debajo.
Estoy seguro que con un ejemplo queda más claro. Tengamos el siguiente código Css:
font-size: 18px;
line-height: 32px;
El half-leading sería de 7px:
32px - 18px = 14px
14px ÷ 2 = 7px
Así que los navegadores lo que hacen es añadir el "medio interlineado" (los 7px del ejemplo) por abajo y otros tantos por arriba del signo para centrarlo.
Quizás aquí conviene recordar que en las escrituras latinas el valor por defecto de la alineación vertical es baseline.
Ahora ya sabes con la precisión de 1px dónde va a aparecer el texto: a medio interlineado por arriba y medio por abajo. O de otra manera: dónde está la línea imaginaria usada para la alineación (línea base).
Este valor junto a otras propiedades es el responsable del "misterioso" espacio extra que algunas veces aparece en cajas que no tienen declarada altura, como el que ves en la imagen siguiente (franja amarilla bajo las imágenes):
A este particular, sus porqués y cuatro soluciones le dediqué este artículo.
Medio interlineado negativo
Y si el valor del "medio interlineado" es negativo ¿qué ocurre?
Sencillo: los carácteres se sangran. Lo que se traduce en que nos encontramos caracteres que pueden quedar cortados en su parte superior o inferior. La típica letra "g" con su rabito cortado. Amén de apelotonarse las líneas de texto.
Diferentes valores de font-size juntos
Si existen varios valores diferentes de font-size, por ejemplo un span en medio de un párrafo, se toma el valor computado más alto para hacer el cálculo.
Márgenes, bordes y rellenos
Cuando la altura total de una caja de línea (box-model tradicional o modificado con box-sizing) es más corta que los límites externos de las cajas que contiene, el fondo y el color del relleno y los bordes pueden ser "sangrados" dentro de las cajas de línea adyacentes. Pero algunas aplicaciones de usuario pueden "cortar" las zonas del borde y el relleno de las cajas contenidas (es decir, no las procesan).
Documentación oficial y complementaria
- Leading and half-leading en el W3c
- Css half-leading en la Wikipedia
Nota del Editor: este artículo fue publicado originalmente en Octubre de 2012.

Kseso
the obCSServer ᛯ Ramajero Argonauta, Enredique Amanuense de CSS.#impoCSSible inside
Dicen que, en español, EsCss es el mejor blog de CSS. Posíblemente exageren.
@Kseso EsCss Kseso
Muy buena info. Y el "expandir anchura artículo" mejoro la lectura de los temas xD
ResponderEliminarHola, ¿Cual es la línea base para la alineación media?
ResponderEliminar¿Entonces cual seria la linea base, la linea azul de arriba o la de abajo?
EliminarIba a empezar con un "es curioso ...", pero no debe ser así, para el estándar debe tener una lógica.
Usando 'line-height', la base media del contenedor coincide con la mitad exacta de la altura del texto contenido (altura que incluye a todas las medidas que se detallan en el artículo de Kseso).
Pero usando 'vertical-align' el texto se acomoda según la línea roja del gráfico que ilustra el artículo. Que parece ser la media altura del las minúsculas.
Eliminar<!DOCTYPE html>
<html lang="es-ar">
<head>
<meta charset="utf-8" />
<style type="text/css">
div#alfa, div#bravo {
position: relative;
margin: 10px auto;
font: normal 20px/3em sans-serif;
height: 3em; width: 10em;
border: solid 1px black;
text-align: center;
background-image: linear-gradient(yellow 50%, silver 50%);
}
div#bravo {
line-height: normal;
}
#alfa:before, #bravo:before {
content: "";
position: absolute;
top: 0;
display: inline-block;
height: 3em; width: 1px;
background-image: repeating-linear-gradient(lime 0, lime 1px, red 1px, red 2px);
vertical-align: middle;
}
#bravo:before {
position: relative;
}
span {
background-image: linear-gradient(silver 50%, yellow 50%);
}
</style>
</head>
<body>
<div id=alfa><span>QwertyuioP</span></div>
<div id=bravo><span>QwertyuioP</span></div>
</body>
</html>