Propiedades lógicas CSS

Propiedades lógicas para reemplazar el modelo de cajas


Tras mucho tiempo utilizando un modelo de cajas tradicional en CSS, se ha creado una nueva familia de propiedades lógicas que permiten definir zonas concretas de un elemento de forma que se adecuan mucho mejor a diferentes idiomas donde la escritura o lectura no es de izquierda a derecha, y por lo tanto, palabras como left y right o top y bottom pueden ser confusas o ambiguas.

Es por ello, que entramos en una era de transición donde hay que adaptarse a estas nuevas propiedades y entender como funcionan, para así conseguir crear código mucho más práctico, independientemente del idioma en el que estemos trabajando.

El modelo de cajas de CSS

Antes de empezar, hay que tener claro el modelo de cajas en CSS, ya que nos basaremos en él para entender la nueva familia de propiedades. Lo hemos explicado en capítulos anteriores como en modelo de cajas de CSS, por lo que si no lo conoces, es conveniente que le eches un vistazo antes de continuar.

Modelo de cajas CSS

Básicamente, las propiedades lógicas de CSS son un renombrado de propiedades y valores de CSS que hacen referencia a un concepto que puede ser erróneo en determinadas situaciones. Esta nueva familia de propiedades viene a reemplazar muchas de las propiedades que encontraremos en las siguientes categorías:

NombreDescripción
Modelo de cajasPropiedades de dimensión, como width o height.
Márgenes y rellenosPropiedades relativas a margin y padding.
BordesPropiedades relacionadas con border.
Bordes redondeadosPropiedades relacionadas con border-radius.
Posicionamiento CSSPropiedades relacionadas con position, como top o left.

La idea de todos estos cambios, desde un punto de vista físico a un punto de vista lógico, es que sea mucho más sencillo alterar el orden de flujo de los elementos en bloque y en línea y que podamos alterarlo, de modo que las nuevas disposiciones sean coherentes, por ejemplo, cambiando este flujo con la propiedad writing-mode:

body {
  writing-mode: horizontal-tb;
}

.box {
  /* Propiedades lógicas */
  inline-size: 150px;
  block-size: 150px;
  border-block-start: 50px solid black;
  border-block-end: 50px solid hotpink;

  /* Otras propiedades */
  display: flex;
  justify-content: center;
  align-items: center;
  background: red;
  color: #fff;
  font-size: 42px;
}
<div class="box">Hello</div>

En el ejemplo anterior, prueba a cambiar el valor de la propiedad writing-mode entre horizontal-tb, vertical-rl o vertical-lr. Tras leer este artículo, este ejemplo cobrará sentido.

Propiedades de dimensión

El primer cambio que hay que tener claro, es que en el futuro no hablaremos de ancho (width) y alto (height) de los elementos, sino de un concepto algo más abstracto. Ahora debemos tener en cuenta que los conceptos «en linea** (inline) y en bloque (block), van a reemplazar los anteriores.

Cuando antes hablabamos de ancho, ahora estaremos hablando de espacio en dirección «en línea», mientras que lo que antes denominábamos alto, ahora es espacio en dirección «en bloque». A priori, puede parecer lioso, pero la idea es simplificarlo globalmente, incluyendo todos los idiomas y su forma de escritura o dirección.

Propiedades lógicas CSS

Pero veamos antes como quedarían las propiedades relacionadas con dimensiones:

Propiedad tradicionalNueva propiedadDescripción de la propiedad
widthinline-sizeIndica el espacio que ocupa «en linea» el elemento.
heightblock-sizeIndica el espacio que ocupa «en bloque» el elemento.
min-widthmin-inline-sizeIndica el espacio mínimo «en línea».
max-widthmax-inline-sizeIndica el espacio máximo «en línea».
min-heightmin-block-sizeIndica el espacio mínimo «en bloque».
max-heightmax-block-sizeIndica el espacio máximo «en bloque».

Márgenes y rellenos

En el caso de la familia de propiedades margin-* y padding-*, muchas de sus propiedades individuales sufren cambios debido a que contienen palabras como top, left, right o bottom en su nombre.

Así pues, las propiedades de la familia margin-* cambian a las siguientes:

Propiedad tradicionalNueva propiedadDescripción de la propiedad
margin-leftmargin-inline-startRelleno «en línea» del elemento por donde empieza.
margin-rightmargin-inline-endRelleno «en línea» del elemento por donde acaba.
-margin-inlineRelleno «en línea» del elemento (atajo de las dos anteriores).
margin-topmargin-block-startRelleno «en bloque» del elemento por donde empieza.
margin-bottommargin-block-endRelleno «en bloque» del elemento por donde acaba.
-margin-blockRelleno «en bloque del elemento (atajo de las dos anteriores).
marginmarginEsta propiedad no sufre cambios.

De forma análoga, la familia de propiedades padding-* sufre los cambios correspondientes:

Propiedad tradicionalNueva propiedadDescripción de la propiedad
padding-leftpadding-inline-startRelleno «en línea» del elemento por donde empieza.
padding-rightpadding-inline-endRelleno «en línea» del elemento por donde acaba.
-padding-inlineRelleno «en línea» del elemento (atajo de las dos anteriores).
padding-toppadding-block-startRelleno «en bloque» del elemento por donde empieza.
padding-bottompadding-block-endRelleno «en bloque» del elemento por donde acaba.
-padding-blockRelleno «en bloque del elemento (atajo de las dos anteriores).
paddingpaddingEsta propiedad no sufre cambios.

Propiedades de bordes

Ya en el modelo de cajas tradicional teníamos una amplia variedad de propiedades referentes a bordes, para hacer referencia a las diferentes partes del borde un elemento, y además sus respectivas características como el grosor, el estilo o el color.

Ahora, con las nuevas propiedades lógicas de bordes, tenemos a nuestra disposición una primera serie de propiedades que se separan en dos: propiedades lógicas en línea y propiedades lógicas en bloque:

Propiedad tradicionalPropiedad lógica (inline)Propiedad lógica (block)
borderborder-inlineborder-block
border-widthborder-inline-widthborder-block-width
border-styleborder-inline-styleborder-block-style
border-colorborder-inline-colorborder-block-color

Y como no, una ampia gama de propiedades individuales o específicas, que ahora se dividen en sus versiones en línea y sus versiones en bloque:

Propiedad tradicionalNueva propiedadDescripción de la propiedad
border-left-widthborder-inline-start-widthTamaño del inicio del borde «en línea».
border-right-widthborder-inline-end-widthTamaño del final del borde «en línea».
-border-inline-widthPropiedad de atajo de las dos anteriores.
border-left-styleborder-inline-start-styleEstilo del inicio del borde «en línea».
border-right-styleborder-inline-end-styleEstilo del final del borde «en línea».
-border-inline-stylePropiedad de atajo de las dos anteriores.
border-left-colorborder-inline-start-colorColor del inicio del borde «en línea».
border-right-colorborder-inline-end-colorColor del final del borde «en línea».
-border-inline-colorPropiedad de atajo de las dos anteriores.
border-leftborder-inline-startPropiedad de atajo de border-inline-start-*.
border-rightborder-inline-endPropiedad de atajo de border-inline-end-*.
-border-inlinePropiedad de atajo de las dos anteriores.

De la misma forma que tenemos todas las anteriores, relativas a las antiguas propiedades border-left-* y border-right-*, tenemos las siguientes propiedades «de bloque», que hacen referencia a las antiguas propiedades border-top-* y border-bottom-*:

Propiedad tradicionalNueva propiedadDescripción de la propiedad
border-top-widthborder-block-start-widthTamaño del inicio del borde «en bloque».
border-bottom-widthborder-block-end-widthTamaño del final del borde «en bloque».
-border-block-widthPropiedad de atajo de las dos anteriores.
border-top-styleborder-block-start-styleEstilo del inicio del borde «en bloque».
border-bottom-styleborder-block-end-styleEstilo del final del borde «en bloque».
-border-block-stylePropiedad de atajo de las dos anteriores.
border-top-colorborder-block-start-colorColor del inicio del borde «en bloque».
border-bottom-colorborder-block-end-colorColor del final del borde «en bloque».
-border-block-colorPropiedad de atajo de las dos anteriores.
border-topborder-block-startPropiedad de atajo de border-block-start-*.
border-bottomborder-block-endPropiedad de atajo de border-block-end-*.
-border-blockPropiedad de atajo de las dos anteriores.

Como se habrá podido ver en las tablas anteriores, el modelo clásico pasa a un nuevo modelo similar al que se puede ver en la siguiente imagen:

Classic vs Propiedades lógicas CSS

Redondeo de esquinas

La familia de propiedades border-radius también sufre cambios, ya que muchas de sus propiedades incluían las palabras top, left, right y bottom. Quedan como se ve en la tabla a continuación:

Propiedad tradicionalNueva propiedadDescripción de la propiedad
border-top-left-radiusborder-start-start-radiusEsquina inicial en ambas direcciones.
border-top-right-radiusborder-start-end-radiusEsquina inicial «en bloque» y final «en línea».
border-bottom-left-radiusborder-end-start-radiusEsquina final «en bloque» e inicial «en línea».
border-bottom-right-radiusborder-end-end-radiusEsquina final en ambas direcciones.
border-radiusborder-radiusEsta propiedad no sufre cambios.

La propiedad inset

Por último, otras de la propiedades que sufren cambios, son las que suelen acompañar a la propiedad position, ya que existen varias propiedades denominadas top, left, right y bottom. Tras la adición de las propiedades lógicas, se añaden las siguientes:

Propiedad tradicionalNueva propiedadDescripción de la propiedad
leftinset-inline-startEsta propiedad desplaza el elemento desde el inicio «en línea».
rightinset-inline-endEsta propiedad desplaza el elemento desde el final «en línea».
-inset-inlinePropiedad de atajo de las dos anteriores.
topinset-block-startEsta propiedad desplaza el elemento desde el inicio «en bloque».
bottominset-block-endEsta propiedad desplaza el elemento desde el final «en bloque».
-inset-blockPropiedad de atajo de las dos anteriores.
-insetPropiedad de atajo de inset-inline e inset-block.

La propiedad inset funciona de forma similar a margin o padding, puesto que puede tomar tanto de 1 a 4 parámetros, para indicar lo que antiguamente se hacía con las propiedades individuales top, left, right y bottom:

PropiedadValoresDescripción
inset 1 parámetro: Mismo desplazamiento para todos.
2 parámetros: [block] [inline]
3 parámetros: [block-start] [inline] [block-end]
4 parámetros: [block-start] [inline-end] [block-end] [inline-start]

Propiedades lógicas

A continuación, puedes ver un gráfico de como quedarían las diferentes propiedades lógicas visualmente, junto a sus propiedades de atajo:

Propiedades lógicas CSS (Resumen)

La compatibilidad en navegadores de las propiedades lógicas de CSS es interesante, puesto que hay muy buen soporte.

Otros cambios menores

De la misma forma, las propiedades CSS que antes aceptaban valores como left, right, top o bottom, ahora son reemplazados por inline-start, inline-end, block-start y block-end respectivamente:

PropiedadNuevos valores
caption-sideinline-start, inline-end, o block-start y block-end cuando es aplicable.
floatinline-start e inline-end.
clearinline-start e inline-end.
text-alignstart e end.
resizeblock e inline.

Además, propiedades de paginación como page-break-after o page-break-before reemplazan los valores left y right por verso y recto respectivamente. Por su parte, las pseudoclases :left y :right se reemplazan por :verso y :recto:

Propiedad o PseudoclaseCambios realizados
page-break-beforeSe añaden los valores verso y recto.
page-break-afterSe añaden los valores verso y recto.
:leftLa pseudoclase se renombra como :verso.
:rightLa pseudoclase se renombra como :recto.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev