The CSS Podcast - 010: Flexbox
Un patrón de diseño que puede ser complicado en el diseño adaptable es una barra lateral que se alinea con algunos contenido. Cuando hay espacio de viewport, este patrón funciona muy bien, pero donde el espacio se condensa, ese diseño rígido puede convertirse en un problema.
El modelo de diseño de caja flexible (flexbox) es un modelo de diseño diseñado para contenido unidimensional. Se destaca por tomar muchos artículos de diferentes tamaños, y mostrar el mejor diseño para esos elementos.
Este es el modelo de diseño ideal para este patrón de la barra lateral. Flexbox no solo ayuda a intercalar la barra lateral y el contenido, pero cuando no hay suficiente espacio restante, la barra lateral se dividirá en una línea nueva. En lugar de establecer dimensiones rígidas para que el navegador las siga, con flexbox, puedes proporcionar límites flexibles para indicar cómo se podría mostrar el contenido.
¿Qué puedes hacer con un diseño flexible?
Los diseños Flex tienen las siguientes características: que podrás explorar en esta guía.
- Pueden mostrarse como una fila o una columna.
- Respetan el modo de escritura del documento.
- De forma predeterminada, son de una sola línea, pero se puede solicitar que se unan en varias líneas.
- Los elementos del diseño se pueden reordenar visualmente, de su orden en el DOM.
- El espacio se puede distribuir dentro de los elementos, por lo que se hacen más grandes y más pequeños según el espacio disponible en sus padres.
- El espacio se puede distribuir alrededor de los elementos y líneas flexibles en un diseño ajustado, con las propiedades de alineación de cuadros.
- Los elementos se pueden alinear en el eje transversal.
El eje principal y el eje transversal
La clave para comprender Flexbox es entender el concepto de un eje principal y un eje transversal.
El eje principal es el que establece tu propiedad flex-direction
.
Si es row
, tu eje principal está a lo largo de la fila. Si es column
, tu eje principal está a lo largo de la columna.
Los elementos flexibles se mueven como un grupo en el eje principal. Recuerda: tenemos muchos elementos y estamos tratando de obtener el mejor diseño para ellos como grupo.
El eje transversal se ejecuta en la otra dirección al eje principal, por lo que, si flex-direction
es row
, el eje transversal se ejecuta a lo largo de la columna.
En el eje cruzado, puedes realizar dos tareas.
Puedes mover los elementos de forma individual o en grupo para que se alineen entre sí y con el
contenedor. Además, si tienes líneas flexibles unidas,
puedes tratar esas líneas como un grupo para controlar cómo se les asigna el espacio.
En esta guía, verás cómo funciona todo esto en la práctica,
Por ahora, ten en cuenta que el eje principal sigue tu flex-direction
.
Crea un contenedor flexible
Veamos cómo se comporta flexbox tomando un grupo de elementos de diferentes tamaños y usándolos para colocarlos y descifrarlos.
<div class="container" id="container">
<div>One</div>
<div>Item two</div>
<div>The item we will refer to as three</div>
</div>
Para usar Flexbox, debes declarar que quieres usar un contexto de formato flexible y no regular.
el diseño intercalado y el bloque.
Para ello, cambia el valor de la propiedad display
a flex
.
.container {
display: flex;
}
Como aprendiste en la guía de diseño, esto te dará un cuadro de nivel de bloque, con elementos secundarios de Flex. Los elementos flex comienzan a mostrar inmediatamente un comportamiento de flexbox con sus valores iniciales.
Los valores iniciales significan lo siguiente:
- Los elementos se muestran como una fila.
- No se unen.
- No crecen para llenar el contenedor.
- Se alinean al comienzo del contenedor.
Cómo controlar la dirección de los elementos
Aunque aún no agregaste una propiedad de flex-direction
,
Los elementos se muestran como una fila porque el valor inicial de flex-direction
es row
.
Si quieres una fila, no es necesario que agregues la propiedad.
Para cambiar la dirección, agrega la propiedad y uno de los cuatro valores:
row
: Los elementos se presentan como una fila.row-reverse:
: Los elementos se presentan como una fila desde el final del contenedor flexible.column
: Los elementos se organizan como una columna.column-reverse
: Los elementos se disponen como una columna desde el final del contenedor flexible.
Puedes probar todos los valores con nuestro grupo de elementos en la siguiente demostración.
Invertir el flujo de elementos y accesibilidad
Debes tener cuidado cuando uses propiedades que reordenen la visualización visual lejos de cómo se ordenan los elementos en el documento HTML, ya que puede afectar negativamente la accesibilidad.
Los valores row-reverse
y column-reverse
son un buen ejemplo de esto.
El reordenamiento solo se produce para el orden visual, no para el orden lógico.
Es importante comprender esto, ya que el orden lógico es el orden en el que un lector de pantalla leerá el contenido y que seguirá cualquier persona que navegue con el teclado.
En el siguiente video, puedes ver cómo en un diseño de fila invertido, la tabulación entre vínculos se desconecta cuando la navegación con teclado sigue el DOM y no el elemento visual pantalla.
Cualquier elemento que pueda cambiar el orden de los elementos en flexbox o cuadrícula puede causar este problema. Por lo tanto, cualquier reordenamiento debe incluir pruebas exhaustivas para verificar que no se modifique el sitio. difícil de usar para algunas personas.
Para obtener más información, consulta lo siguiente:
Modos y dirección de escritura
Los elementos flexibles se organizan como una fila de forma predeterminada. Una fila se ejecuta en la dirección en la que fluyen las oraciones en el modo de escritura y la dirección de la escritura. Esto significa que, si estás trabajando en árabe, que tiene una dirección de secuencia de comandos de derecha a izquierda (rtl), los elementos se alinearán a la derecha. El orden de tabulación también empezaría a la derecha, ya que así es como se leen las oraciones en árabe.
Si trabajas con un modo de escritura vertical,
como algunos tipos de letra japoneses, entonces una fila se ejecutará verticalmente, de arriba abajo.
Intenta cambiar el flex-direction
en esta demostración, que usa un modo de escritura vertical.
Por lo tanto, el comportamiento predeterminado de los elementos flexibles se vincula al modo de escritura del documento. La mayoría de los instructivos se escriben en inglés o en otro formato horizontal, modo de escritura de izquierda a derecha. Esto facilitaría suponer que los elementos flex se alinean a la izquierda y se ejecutan horizontalmente.
Con el eje principal y el eje transversal, además del modo de escritura que se debe tener en cuenta, es posible que sea más fácil comprender el hecho de que hablamos de inicio y final en lugar de arriba, abajo, izquierda y derecha en flexbox. Cada eje tiene un inicio y un final. El inicio del eje principal se denomina main-start. Entonces, nuestros elementos flexibles inicialmente se alinean desde el principio. El final de ese eje es main-end. El inicio del eje cruzado es cross-start y el final cross-end.
Cómo unir elementos flex
El valor inicial de la propiedad flex-wrap
es nowrap
.
Esto significa que, si no hay suficiente espacio en el contenedor, los elementos se desbordarán.
Los elementos que se muestran con los valores iniciales se reducirán lo más que puedan, hasta el tamaño de min-content
, antes de que se produzca el desbordamiento.
Para que los elementos se unan, agrega flex-wrap: wrap
al contenedor de Flex.
.container {
display: flex;
flex-wrap: wrap;
}
Cuando un contenedor flexible se une, crea varias líneas flexibles. En términos de distribución del espacio, cada línea actúa como un nuevo contenedor flexible. Por lo tanto, si estás uniendo filas, no es posible que algo en la fila 2 se alinee con algo que está por encima de ella en la fila 1. Esto es lo que significa que flexbox es unidimensional. Puedes controlar la alineación en un eje, una fila o una columna, pero no en ambos, como podemos hacer en la cuadrícula.
La abreviatura del flujo flexible
Puedes configurar las propiedades flex-direction
y flex-wrap
con el atajo flex-flow
.
Por ejemplo, para establecer flex-direction
en column
y permitir que los elementos unan, haz lo siguiente:
.container {
display: flex;
flex-flow: column wrap;
}
Cómo controlar el espacio dentro de los elementos flex
Si suponemos que nuestro contenedor tiene más espacio del que se necesita para mostrar los elementos,
los elementos se alinean al inicio y no crecen para llenar el espacio.
Dejan de crecer cuando alcanzan su tamaño máximo de contenido.
Esto se debe a que el valor inicial de las propiedades flex-
es el siguiente:
flex-grow: 0
: Los elementos no crecen.flex-shrink: 1
: Los elementos pueden reducirse a un tamaño menor que suflex-basis
.flex-basis: auto
: Los elementos tienen un tamaño base deauto
.
Esto se puede representar con un valor de palabra clave de flex: initial
.
La propiedad abreviada flex
,
o los prefijos generales de flex-grow
, flex-shrink
y flex-basis
se aplican a los elementos secundarios de la
flexible.
Para hacer que los elementos crezcan, mientras permites que los elementos grandes tengan más espacio que los pequeños, usa flex:auto
.
Puedes probar esto con la demostración anterior.
Esto establece las propiedades en los siguientes valores:
flex-grow: 1
: Los elementos pueden crecer más que suflex-basis
.flex-shrink: 1
: Los elementos pueden reducirse más que suflex-basis
.flex-basis: auto
: Los elementos tienen un tamaño base deauto
.
Si usas flex: auto
, los elementos tendrán diferentes tamaños.
ya que el espacio que se comparte entre los elementos se comparte después de que cada elemento se presenta como
el tamaño máximo del contenido.
Por lo tanto, un elemento grande ganará más espacio.
Para forzar que todos los elementos tengan un tamaño coherente y que se ignore el tamaño del contenido, cambia flex:auto
a flex: 1
en la demostración.
Esto se descomprime en la siguiente información:
flex-grow: 1
: Los elementos pueden crecer más que suflex-basis
.flex-shrink: 1
: Los elementos pueden reducirse a un tamaño menor que suflex-basis
.flex-basis: 0
: Los elementos tienen un tamaño base de0
.
El uso de flex: 1
indica que todos los elementos tienen un tamaño igual a cero,
por lo que todo el espacio en el contenedor flexible
está disponible para distribuirse.
Como todos los elementos tienen un factor flex-grow
de 1
, todos crecen de forma equitativa y el espacio se comparte de forma equitativa.
Permite que los elementos crezcan a diferentes velocidades.
No es necesario que todos los elementos tengan un factor flex-grow
de 1
.
Puedes asignar diferentes factores flex-grow
a tus elementos flexibles.
En la demostración que aparece a continuación, el primer elemento tiene flex: 1
, el segundo flex: 2
y el tercer flex: 3
.
A medida que estos elementos crecen desde 0
, el espacio disponible en el contenedor flexible se comparte en seis.
Se le asigna una parte al primer elemento, dos partes al segundo y tres partes al tercero.
Puedes hacer lo mismo desde un flex-basis
de auto
, aunque deberás especificar los tres valores.
El primer valor es flex-grow
, el segundo flex-shrink
y el tercero flex-basis
.
.item1 {
flex: 1 1 auto;
}
.item2 {
flex: 2 1 auto;
}
Este es un caso de uso menos común, ya que se debe usar un flex-basis
de auto
.
es permitir que el navegador descubra la distribución del espacio.
Sin embargo, si deseas que un elemento crezca un poco más de lo que decide el algoritmo, podría ser útil.
Reordenando elementos flexibles
Los elementos de tu contenedor flexible se pueden reordenar con la propiedad order
.
Esta propiedad permite ordenar los elementos en grupos ordinales.
Los elementos se presentan en la dirección que dicta flex-direction
.
los valores más bajos primero.
Si más de un elemento tiene el mismo valor, se mostrará con los demás elementos que tengan ese valor.
En el siguiente ejemplo, se demuestra este orden.
Verifica tus conocimientos
Pon a prueba tus conocimientos sobre flexbox
El valor predeterminado de flex-direction
es
row
column
De forma predeterminada, un contenedor flexible une los elementos secundarios.
flex-wrap: wrap
con display: flex
para unir elementos secundariosUn elemento secundario flexible parece comprimido. ¿Qué propiedad flexible ayuda a mitigar esto?
flex-grow
flex-shrink
flex-basis
Descripción general de la alineación de Flexbox
Flexbox trajo consigo un conjunto de propiedades para alinear elementos y distribuir el espacio entre ellos. Estas propiedades eran tan útiles que se trasladaron a su propia especificación también los encontrarás en Grid Layout. Aquí puede ver cómo funcionan cuando utiliza Flexbox.
El conjunto de propiedades se puede colocar en dos grupos. Propiedades para la distribución del espacio y propiedades para la alineación. Las propiedades que distribuyen el espacio son las siguientes:
justify-content
: Es la distribución espacial en el eje principal.align-content
: Es la distribución espacial en el eje cruzado.place-content
: Es una abreviatura para configurar las dos propiedades anteriores.
Estas son las propiedades que se usan para la alineación en flexbox:
align-self
: Alinea un solo elemento en el eje transversal.align-items
: Alinea todos los elementos como un grupo en el eje transversal.
Si estás trabajando en el eje principal, las propiedades comienzan con justify-
.
En el eje cruzado, comienza con align-
.
Distribución del espacio en el eje principal
Con el código HTML que se usó antes, los elementos flex se organizan como una fila, y hay espacio en el eje principal.
Los elementos no son lo suficientemente grandes como para llenar completamente el contenedor de flex.
Los elementos se alinean al comienzo del contenedor flexible porque el valor inicial de justify-content
es flex-start
.
Los elementos se alinean al comienzo y los espacios adicionales estarán al final.
Agrega la propiedad justify-content
al contenedor de Flex.
asígnale un valor de flex-end
,
Los elementos se alinean al final del contenedor y el espacio libre se coloca al comienzo.
.container {
display: flex;
justify-content: flex-end;
}
También puedes distribuir el espacio entre los elementos con justify-content: space-between
.
Prueba algunos de los valores de la demostración y consulta MDN para ver el conjunto completo valores posibles.
Con flex-direction: column
Si cambiaste tu flex-direction
a column
, entonces justify-content
funcionará en
la columna.
Para tener espacio libre en tu contenedor cuando trabajas como columna, debes darle al contenedor una
height
o block-size
.
De lo contrario, no tendrás espacio libre para distribuir.
Prueba los diferentes valores, esta vez con un diseño de columna de flexbox.
Distribución del espacio entre líneas flexibles
Con un contenedor flexible unido, es posible que tengas espacio para distribuir en el eje cruzado.
En este caso, puedes usar la propiedad align-content
con los mismos valores que justify-content
.
A diferencia de justify-content
, que alinea elementos con flex-start
de forma predeterminada,
el valor inicial de align-content
es stretch
.
Agrega la propiedad align-content
al contenedor de flex para cambiar ese comportamiento predeterminado.
.container {
align-content: center;
}
Pruébala en la demostración.
El ejemplo tiene líneas unidas de elementos flexibles,
y el contenedor tiene un block-size
para que tengamos espacio libre.
La abreviatura place-content
Para configurar justify-content
y align-content
, puedes usar place-content
con uno o dos valores.
Se usará un solo valor para ambos ejes,
si especificas que tanto la primera se usa para align-content
como la segunda para justify-content
.
.container {
place-content: space-between;
/* sets both to space-between */
}
.container {
place-content: center flex-end;
/* wrapped lines on the cross axis are centered,
on the main axis items are aligned to the end of the flex container */
}
Alinear elementos en el eje cruzado
En el eje transversal, también puedes alinear tus elementos dentro de la línea flexible con align-items
y align-self
.
El espacio disponible para la alineación dependerá de la altura del contenedor flexible
o una línea flexible en el caso
de un conjunto de artículos ajustados.
El valor inicial de align-self
es stretch
, por lo que los elementos flex de una fila se extienden a la altura del elemento más alto de forma predeterminada.
Para cambiar esto, agrega la propiedad align-self
a cualquiera de tus elementos flexibles.
.container {
display: flex;
}
.item1 {
align-self: flex-start;
}
Usa cualquiera de los siguientes valores para alinear el elemento:
flex-start
flex-end
center
stretch
baseline
Consulta la lista completa de valores en MDN.
La siguiente demostración tiene una sola línea de elementos flexibles con flex-direction: row
.
El último elemento define la altura del contenedor flexible.
El primer elemento tiene la propiedad align-self
con un valor de flex-start
.
Intenta cambiar el valor de esa propiedad para ver cómo se mueve dentro de su espacio en el eje transversal.
La propiedad align-self
se aplica a elementos individuales.
La propiedad align-items
se puede aplicar al contenedor flex para configurar todas las propiedades align-self
individuales como un grupo.
.container {
display: flex;
align-items: flex-start;
}
En la próxima demostración, intenta cambiar el valor de align-items
para alinear todos los elementos en la cruz.
como un grupo.
¿Por qué no hay justify-self en flexbox?
Los elementos flexibles actúan como un grupo en el eje principal. Por lo tanto, no hay concepto de dividir un elemento individual de ese grupo.
En el diseño de cuadrícula, las propiedades justify-self
y justify-items
funcionan en el eje intercalado para alinear los elementos en ese eje dentro de su área de cuadrícula.
Debido a la forma en que los diseños flexibles tratan los elementos como un grupo,
Estas propiedades no se implementan en un contexto flexible.
Vale la pena saber que Flexbox funciona muy bien con los márgenes automáticos.
Si te encuentras con la necesidad de dividir un elemento de un grupo,
o separarlo en dos, puedes aplicarle un margen.
En el siguiente ejemplo, el último elemento tiene un margen izquierdo de auto
.
El margen automático absorbe todo el espacio en la dirección en la que se aplica.
Esto significa que empuja el elemento hacia la derecha, lo que divide los grupos.
Cómo centrar un elemento de forma vertical y horizontal
Las propiedades de alineación se pueden usar para centrar un elemento dentro de otro cuadro.
La propiedad justify-content
alinea el elemento en el eje principal.
que es la fila. La propiedad align-items
en el eje cruzado.
.container {
width: 400px;
height: 300px;
display: flex;
justify-content: center;
align-items: center;
}
Verifica tus conocimientos
Pon a prueba tus conocimientos sobre flexbox
.container { display: flex; direction: ltr; }
Para alinear verticalmente con Flexbox, usa
.container { display: flex; direction: ltr; }
Para alinear horizontalmente con flexbox, usa
.container { display: flex; direction: ltr; }
De forma predeterminada, los elementos flexibles se alinean con stretch
. Si deseas que el tamaño del contenido se use para los elementos secundarios, ¿cuál de los siguientes estilos usarías?
justify-content: flex-start
align-content: start
content
alinea las líneas flexibles, no la alineación de los elementos secundarios.height: auto
align-items: flex-start
Recursos
- Diseño de cuadro flexible de CSS de MDN incluye una serie de guías detalladas con ejemplos.
- Guía de trucos de CSS para Flexbox
- Qué sucede cuando creas un contenedor de Flexbox
- Todo lo que necesitas saber sobre la alineación en Flexbox
- ¿Qué tan grande es ese cuadro flexible?
- Casos de uso de Flexbox
- Inspecciona y depura diseños de Flexbox de CSS en las Herramientas para desarrolladores de Chrome