02_css(FlexBox) (1)
02_css(FlexBox) (1)
Tags CSS
CSS (FlexBox) 1
Cuando trabajamos con flexbox necesitamos pensar en términos de dos ejes — el
eje principal y el eje cruzado. El eje principal está definido por la propiedad flex-
direction, y el eje cruzado es perpendicular a este. Todo lo que hacemos con
flexbox está referido a estos dos ejes, por lo que vale la pena entender cómo
trabajan desde el principio.
El eje principal
El eje principal está definido por flex-direction, que posee cuatro posibles valores:
row
row-reverse
column
column-reverse
Si elegimos row o row-reverse, el eje principal correrá a lo largo de la fila según la
dirección de la línea .
CSS (FlexBox) 2
El eje cruzado
El eje cruzado va perpendicular al eje principal, y por lo tanto si flex-direction (del
eje principal) es row o row-reverse el eje cruzado irá por las columnas.
CSS (FlexBox) 3
Entender cuál eje es cuál es importante cuando empezamos a mirar la alineación
y justificación flexible de los ítems; flexbox posee propiedades que permiten
alinear y justificar el contenido sobre un eje o el otro.
Puede leer más acerca de la relación que hay entre flexbox y la especificación de
los Modos de Escritura en un artículo posterior, sin embargo la siguiente
descripción debería ayudar para explicar porqué no se habla de izquierda y
derecha ni de arriba o abajo a la hora de describir la dirección en la que fluyen los
ítems flex.
CSS (FlexBox) 4
Si fuera a trabajar en árabe, entonces el margen inicial de mi eje principal
quedaría a la derecha y el margen final a la izquierda.
En ambos casos el margen inicial del eje cruzado estará en el extremo superior
del contenedor flex y el margen final en el extremo inferior, ya que ambos idiomas
tiene un modo de escritura horizontal.
El contenedor flex
CSS (FlexBox) 5
CSS, se definen algunos valores iniciales, así que cuando creemos un contenedor
flex todos los ítems flex contenidos se comportarán de la siguiente manera.
Los ítems se despliegan sobre una fila (la propiedad flex-direction por defecto
es row).
El resultado es que todos los ítems se alinearán en una solo fila, usando el tamaño
del contenedor como su tamaño en el eje principal. Si hay más ítems de los que
caben en el contenedor, estos no pasarán más abajo si no que sobrepasarán el
margen. Si hay ítems más altos que otros, todos los ítems serán ajustados en el
eje cruzado para alcanzar al mayor.
Se puede ver en el ejercicio en vivo de abajo cómo luce. Intente editar el ítem o
añadir ítems adicionales para así probar el comportamiento inicial de flexbox.
Cambiar flex-direction
CSS (FlexBox) 6
Contenedores flex Multi-línea con flex-wrap
Para lograr repartirse en varias líneas añada la propiedad flex-wrap con el valor
wrap. Cuando los ítems sean demasiados para desplegarlos en una línea, serán
repartidos en la línea siguiente. El ejemplo en vivo de abajo contiene ítems que se
les ha asignando un ancho, donde el ancho total de los ítems excede al del
contenedor flex. Cuando flex-wrap se coloca como wrap, los ítems se repartirán.
Al colocarlo como nowrap, el cual es el valor inicial, estos se contraerán para
calzar con el contenedor ya que usan los valores iniciales de flexbox que permiten
que los ítems se contraigan. Al usar nowrap los ítems podrían salirse del margen si
estos no pudieran contraerse, o no contraerse lo suficiente para ser calzados.
La abreviatura flex-flow
Para obtener más control sobre los ítems flex podemos apuntarlos directamente.
Hacemos esto a través de tres propiedades:
CSS (FlexBox) 7
flex-grow
flex-shrink
flex-basis
Si en cambio quisiéramos que los ítems crecieran para llenar ese espacio,
entonces necesitaremos un método para distribuir el espacio sobrante entre los
ítems. Es justo lo que harán las propiedades flex que aplicaremos a dichos ítems.
La propiedad flex-basis
CSS (FlexBox) 8
Con flex-basis se define el tamaño de un ítem en términos del espacio que deja
como espacio disponible. El valor inicial de esta propiedad es auto — en este caso
el navegador revisa si los ítems definen un tamaño. En el ejemplo de arriba, todos
los ítems tienen un ancho de 100 pixeles así que este es usado como flex-basis.
Si los ítems no tiene un tamaño entonces el tamaño de su contenido es usado
como flex-basis. Y por eso, apenas declarado display: flex en el padre a fin de
crear ítems flex, todos estos ítems se ubicaron en una sola fila y tomaron solo el
espacio necesario para desplegar su contenido.
La propiedad flex-grow
Con la propiedad flex-grow definida como un entero positivo, los ítems flex
pueden crecer en el eje principal a partir de flex-basis. Esto hará que el ítem se
ajuste y tome todo el espacio disponible del eje, o una proporción del espacio
disponible si otro ítem también puede crecer.
La propiedad flex-shrink
CSS (FlexBox) 9
expanda más rápido que otros — un ítem con un valor más alto de flex-shrink se
contraerá más rápido que sus hermanos que poseen valores menores.
El tamaño mínimo del ítem tendrá que ser considerado cuando se determine un
valor de contracción que pueda funcionar, esto significa que flex-shrink tiene el
potencial de comportarse menos consistentemente que flex-grow . Por lo tanto,
haremos una revisión más detallada de cómo este algoritmo trabaja en el artículo
Controlling Ratios de los ítems sobre el eje principal.
flex: initial
flex: auto
CSS (FlexBox) 10
flex: none
flex: <positive-number>
Fijando flex: initial el ítem se restablece con los valores iniciales de Flexbox. Es lo
mismo que flex: 0 1 auto. En este caso el valor de flex-grow is 0, así que los ítems
no crecerán más de su tamaño flex-basis . El valor flex-shrink es 1, así que los
ítems pueden contraerse si es necesario en vez de salirse de los márgenes. El
valor de flex-basis es auto. Los ítems pueden definir un tamaño en la dimensión
del eje principal, o bien obtener su tamaño por el contenido del los mismos.
Usar flex: auto es lo mismo que usar flex: 1 1 auto , es como con flex:initial pero en
este caso los ítems pueden crecer y llenar el contendor así como encoger si se
requiere.
Al usar flex: none se crearán ítems flex totalmente inflexibles. Es como escribir
flex: 0 0 auto. Los ítems no pueden ni crecer ni encoger pero serán colocados
usando flexbox con flex-basis en auto.
CSS (FlexBox) 11
En cambio definimos align-items como flex-start para que los ítems se alineen al
comienzo del contenedor flex, flex-end para alinearlos al final, o center para
alinearlos al centro. Intente esto en el ejemplo en vivo — He definido en el
contenedor flex una altura para que se aprecie que se pueden mover libremente
dentro del contenedor. Vea lo que sucede si se coloca el valor align-items como:
stretch
flex-start
flex-end
center
justify-content
La propiedad justify-content es usada para alinear los ítems en el eje principal,
cuyo flex-direction define la dirección del flujo. El valor inicial es flex-start que
alineará los ítems al inicio del margen del contenedor, pero también se podría
definir como flex-end para alinearlos al final, o center para alinearlos al centro.
CSS (FlexBox) 12