Botón para abrir el Menú Botón para cerrar el Menú
Logo da empresa Alura
Iniciar Sesión Nuestros Planes
Formaciones Conoce a Luri
  • Programación _
  • Front End _
  • Data Science _
  • DevOps _
  • Innovación y Gestión _
Artículos de Tecnología > Front-end

Flexbox CSS: Guia Completo, Elementos y Ejemplos

Alura
Juliana Amoasei
Juliana Amoasei
01/09/2021

Compartir

Mira este artículo:
  1. Qué es el Flexbox
  2. Elementos
  3. Propiedades del elemento principal
  4. Propiedades de los elementos secundarios
  5. order
  6. Flex-grow
  7. flex-shrink
  8. ¡Importante!
  9. ¿Vamos a practicar?
  10. Enlaces útiles

Flexbox tiene como meta ser una forma más eficiente de crear diseños, alinear y distribuir espacios entre ítems en un contenedor, incluso cuando las dimensiones de esos ítems son desconocidas y/o dinámicas (en virtud de eso el término "flex").

Aprendamos los fundamentos de CSS Flexbox para la alineación y el posicionamiento, y cómo usar sus funcionalidades correctamente.

Qué es el Flexbox

Durante mucho tiempo, las únicas herramientas disponibles para crear diseños CSS y posicionar elementos con buena compatibilidad entre browsers eran float y position. Sin embargo, estas herramientas tienen algunas limitaciones muy frustrantes, especialmente cuando se trata de responsividad. Algunas tareas que consideramos básicas en un diseño, como centrar verticalmente un elemento secundario en relación con un elemento principal o hacer que los elementos secundarios ocupen la misma cantidad de espacio, o que las columnas tengan el mismo tamaño independientemente de la cantidad de contenido interno, fueron imposibles. o muy difícil de manejar con floats o position, al menos de forma práctica y flexible. La herramienta Flexbox (de Flexible Box) fue creada para hacer estas tareas más sencillas y funcionales: los secundarios de un elemento con Flexbox se pueden posicionar en cualquier dirección y pueden tener dimensiones flexibles para adaptarse.

Elementos

Flexbox es un módulo completo y no una propiedad única; algunos de ellos deben declararse en el contenedor (el elemento principal, que llamamos de flex container), mientras que otros deben declararse en los elementos secundarios (el flex ítems). Si el diseño "estándar" se basa en las direcciones block e inline, el diseño Flex se basa en direcciones de "flex flow". A continuación se muestra un diagrama de la especificación, que explica la idea central detrás del diseño Flex.

Diagrama explicando a terminologia do Flex. A dimensão no sentido do eixo principal é chamada de tamanho principal, e a outra direção é chamada de transversal. Estes tamanhos, tanto o principal como o transversa, têm uma borda inicial e uma borda final

Los ítems se distribuirán en el diseño siguiendo el eje principal o transversal.

  • Eje principal: el eje principal de un flex container es el eje primario y a lo largo de él son insertados los flex ítems. Precaución: El eje principal no es necesariamente horizontal; Dependerá de la propiedad flex-direction (vea abajo).

  • Main-start | main-end: los flex ítems se insertan en el contenedor empezando por el lado start, dirigiéndose hacia el lado end.

  • Tamaño principal: El ancho o alto de un flex ítem, dependiendo de la dirección del contenedor, es el tamaño principal del ítem. La propiedad de tamaño principal de un flex ítem puede ser tanto width como height, dependiendo de cuál esté en la dirección principal.

  • Eje transversal: El eje perpendicular al eje principal se llama eje transversal. Su dirección depende de la dirección del eje principal.

  • Cross-start | cross-end: Líneas flex se llenan con ítems y se agregan al contenedor, comenzando desde el lado cross start del flex container hacia el lado cross end.

  • Cross size: El ancho o alto de un flex ítem, dependiendo de lo que haya en la dimensión transversal, es el cross size del ítem. La propiedad cross size puede ser el ancho o el alto del ítem, lo que se encuentre en la transversal.

    Flex container es el elemento que involucra su estructura. Tu defines que un elemento es un Flex Container con la propiedad display y valores flex o inline-flex.

    <div class="flex-container">

    <div>1</div>

    <div>2</div>

    <div>3</div>

    </div>

    .flex-container {

    display: flex;

    }

    Flex Ítem son elementos secundarios del flex container.

    Ejes o Axes son las dos direcciones básicas que existen en un Flex Container: main axis, o eje principal, y cross axis, o eje transversal.

    Propiedades del elemento principal

    container flex

    Cuando usamos el Flexbox, es muy importante saber qué propiedades se declaran en el elemento principal (por ejemplo, una div que contendrá los elementos a alinear) y cuáles se declararán en los elementos secundarios. A continuación, se muestran las propiedades que deben declararse utilizando el elemento principal como selector (para alinear los elementos secundarios):

    Display

    Esta propiedad define un flex container; inline o block dependiendo de los valores pasados. Coloca todos los elementos secundarios directos en un contexto Flex.

    .container {

    display: flex; */\* or inline-flex \*/*

    }

    Tenga en cuenta que la propiedad CSS columns no tiene efecto en un flex container.

    Flex-direction

    flex-direction

    Establece el eje principal, definiendo así la dirección en la que los flex ítems están alineados en el flex container. Flexbox es (con la excepción de un wrapping opcional) un concepto de diseño unidireccional. Piensa en los flex ítems inicialmente posicionaids o en líneas horizontales o en columnas verticales.

    .flex-container { flex-direction: row | row-reverse | column | column-reverse; }

    • row (estándar): de la izquierda a la derecha en ltr (left to right), de la derecha a la izquierda en rtl (right to left)

    • row-reverse: de la derecha a la izquierda en ltr, de la izquierda a la derecha en rtl

    • column: mismo que row, pero de arriba a abajo

    • column-reverse: mismo que row-reverse pero de abajo hacia arriba

      flex-wrap

      flex-wrap

      Por estándar, los flex ítems todos intentarán encajarse en una sola línea. Con esta propiedad puedes modificar este comportamiento y permitir que los ítems pasen a la siguiente línea según sea necesario.

      .flex-container {

      flex-wrap: nowrap | wrap | wrap-reverse;

      }

    • nowrap (estándar): todos los flex ítems estarán en una sola línea

    • wrap: los flex ítems se dividirán en múltiples líneas, de arriba a abajo

    • wrap-reverse: los flex ítems se dividirán en múltiples líneas de abajo hacia arriba

      flex-flow

    • La propiedad flex-flow es una propiedad shorthand (una misma declaración incluye varios valores relacionados con más de una propiedad) que incluye flex-direction y flex-wrap. Determina cuáles serán los ejes principal y transversal del contenedor. El valor estándar es row nowrap.

      .flex-container { flex-flow: row nowrap | row wrap | column nowrap | column wrap; }

      Justify-content

      justify-content

      Esta propiedad define la alineación de los ítems a lo largo del eje principal. Ayuda a distribuir el espacio libre que queda en el contenedor, ya sea que todos los flex ítems de una línea sean inflexibles o flexibles, pero ya hayan alcanzado su tamaño máximo. También ejerce cierto control sobre la alineación de los ítems cuando sobrepasan el límite de la línea.

      .flex-container {

      justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;

      }

    • flex-start (estándar): los ítems se alinean a lo largo del borde de inicio (start) de acuerdo con la flex-direction del contenedor.

    • Flex-end: los ítems se alinean a lo largo del borde final (end) de acuerdo con la flex-direction del contenedor.

    • start: los ítems se alinean a lo largo del borde de inicio de la dirección del writing-mode (modo de escritura).

    • end: los ítems se alinean a lo largo del borde final de la dirección del writing-mode (modo de escritura).

    • left: los ítems están alineados a lo largo del borde izquierdo del contenedor, a menos que esto no tenga sentido con el flex-direction que se está utilizando. En este caso, se comporta como start.

    • right: los ítems están alineados a lo largo del borde derecho del contenedor, a menos que esto no tenga sentido con el flex-direction que se está utilizando. En este caso, se comporta como start.

    • center: los ítems están centrados en la línea.

    • Space-between: los ítems se distribuyen uniformemente a lo largo de la línea; el primer ítem al lado del borde inicial de la línea, el último ítem al lado del borde final de la línea.

    • Space-around: los ítems se distribuyen en línea con el mismo espacio entre ellos. Tenga en cuenta que visualmente el espacio puede no ser igual, ya que todos los ítems tienen la misma cantidad de espacio en ambos lados: el primer ítem solo tendrá una unidad de espacio a lo largo del borde del contenedor, pero dos unidades de espacio entre él y el siguiente ítem, porque el ítem siguiente también tiene su propio espaciamiento que se está aplicando.

    • Space-evenly: los ítems se distribuyen de manera que el espacio entre dos elementos cualesquiera en la línea (incluso entre los ítems y los bordes) sea igual.

      Nota: el soporte dado por los navegadores para estos valores es difuso. Por ejemplo, space-between no tiene soporte en ninguna versión de Edge (hasta la elaboración de este tutorial) y start / end / left / right aún no se han implementado en Chrome. Para obtener tablas detalladas, consulte MDN. Los valores más seguros son flex-start, flex-end y center.

      También hay dos palabras clave adicionales que puedes usar junto con estos valores: safe y unsafe. Safe asegura que, independiente de cómo hagas este tipo de posicionamiento, no sea posible "empujar" un elemento y hacer con que sea renderizado hacia afuera de la pantalla (por ejemplo, sobre el tope) de una manera que haga con que el contenido sea imposible de mover con el desplazamiento de la pantalla (el CSS llama a esto de "pérdida de datos").

      Align-ítems

      align-items

      Establece el comportamiento estándar de cómo flex ítems están alineados según el eje transversal (cross axis). En cierto modo, funciona de manera similar al justify-content, pero en el eje transversal (perpendicular al eje principal).

      . .flex-container {

      align-items: stretch | flex-start | flex-end | center | baseline;

      }

    • Stretch (estándar): estira los ítems para llenar el contenedor, respetando el min-width/max-width).

    • Flex-start/start/self-start: ítems se posicionan al inicio del eje transversal. La diferencia entre ellos es sutil y se refiere a las reglas de flex-direction o writing-mode.

    • center: ítems se centran en el eje transversal.

    • baseline: ítems se alinean de acuerdo con sus baselines.

      Los modificadores safe y unsafe se puede usar junto con todas estas palabras clave (por favor verifique el soporte de cada navegador) y sirven para evitar cualquier alineación de elementos que haga con que el contenido sea inaccesible (por ejemplo, fuera de la pantalla).

      align-content

      align-content

      Organiza las líneas dentro de un flex container cuando hay espacio adicional en el eje transversal, similar a cómo justify-content alinea ítems individuales dentro del eje principal.

      Importante: Esta propiedad no tiene efecto cuando solo hay una línea de flex ítems en el contenedor.

      .flex-container {

      align-content: flex-start | flex-end | center | space-between | space-around | stretch;

      }

    • flex-start / start: ítems alineados con el inicio del contenedor. El valor (con mayor soporte de los navegadores) flex-start se guía por la flex-direction, mientras que start se guía por la dirección del writing-mode.

    • Flex-end/end: ítems alineados con el final del contenedor. El valor (con mayor soporte de los navegadores) flex-end se guía por la flex-direction, mientras que end se guía por la dirección del writing-mode.

    • center: ítems centrados en el contenedor.

    • space-between: ítems distribuidos uniformemente; la primera línea al inicio del contenedor y la última línea al final del contenedor.

    • space-around: ítems distribuidos uniformemente con el mismo espaciamiento entre cada línea.

    • space-evenly: elementos distribuidos uniformemente con el mismo espaciamiento entre ellos.

    • stretch (estándar): ítems en cada línea se estiran para ocupar el espacio remanente entre ellas.

      Los modificadores safe y unsafe se puede usar junto con todas estas palabras clave (por favor verifique el soporte de cada navegador) y sirven para evitar cualquier alineación de elementos que haga con que el contenido sea inaccesible (por ejemplo, fuera de la pantalla).

      Propiedades de los elementos secundarios

      A continuación, veremos propiedades que deben declararse teniendo como selector los elementos secundarios, es decir:

      1
      2
      3

      Esto significa que, donde hay un elemento principal con propiedad flex (o flex-container), también puede asignar propiedades flex específicas a elementos secundarios (flex-ítem).

      Puede definir las propiedades a continuación para solo uno de los elementos secundarios a través de un identificador, como una clase específica.

      order

      Determina el orden en que aparecerán los elementos.

      order

      Por estándar los flex ítems, se organizan en la pantalla en orden de código. Pero la propiedad order controla el orden en que aparecen en el contenedor.

      .flex-item {

      order: <número>; */\* el valor estándar es 0 \*/*

      }

      Flex-grow

      grow

      Define la habilidad de un flex ítem de crecer, según el caso. El valor de esta propiedad es un valor numérico sin indicación de unidad, que se utiliza para calcular la proporción. Este valor dicta la cantidad de espacio disponible en el contenedor que ocupará el ítem.

      Si todos los ítems tienen flex-grow establecido en 1, el espacio remanente en el contenedor se distribuirá de manera uniforme entre todos. Si uno de los ítems tiene el valor 2, ocupará el doble de espacio en el contenedor que los demás (o al menos intentará hacerlo).

      .flex-item {

      flex-grow: <numero>; */\* el valor default(estándar) es 0 \*/*

      }

      La propiedad no acepta valores negativos.

      flex-shrink

      Establece la habilidad de un flex ítem para contraerse, según el caso. .flex-item {

      flex-shrink: <número>; */\* el valor estándar es 0 \*/* }

      La propiedad no acepta valores negativos.

      flex-basis

      Establece el tamaño estándar de un elemento antes de que se distribuya el espacio remanente del contenedor. Puede ser un largo (por ejemplo, 20%, 5rem, etc.) o una palabra clave. La palabra clave auto significa "observe mis propiedades de altura o ancho" (lo que era hecho por la palabra clave t main-size, que fue depreciada). La palabra clave content significa "establezca el tamaño según el contenido interno del ítem"; esta palabra clave aún no tiene mucho soporte, por lo que no es fácil de probar, al igual que sus relacionadas: max-content, min-content y fit-content.

      .flex-item {

      flex-basis: flex-basis: | auto; */\* el valor estándar es auto \*/*

      }

      Con el valor 0, el espacio adicional alrededor del contenido no se considera. Con el valor de auto, el espacio adicional se distribuye con base en el valor de flex-grox del ítem.

      flex

      Esta es la propiedad shorthand para flex-grow, flex-shrink y flex-basis, combinadas. El segundo y tercer parámetros (flex-shrink y flex-basis) son opcionales. El estándar es 0 1 auto, pero si lo defines con un solo número, es equivalente a 0 1.

      .item {

      flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]

      }

      Se recomienda que utilices esta propiedad shorthand en lugar de definir cada una de las propiedades por separado. Shorthand establece los demás valores de forma inteligente.

      align-self

      align-self

      Permite que la alineación estándar (o lo que esté definido por align-items) se sobrescriba para ítems individuales.

      Por favor consulte la explicación de la propiedad align-items para entender cuáles son los posibles valores.

      . .item {

      align-self: auto | flex-start | flex-end | center | baseline | stretch;

      }

      ¡Importante!

    • CSS solo ve la jerarquía de principal-secundario; no aplicará propiedades Flex a elementos que no estén directamente relacionados;

    • Para que las propiedades funcionen en elementos secundarios, los principales deben tener propiedad display: flex;.

    • Las propiedades float, clear y vertical-align no tienen ningún efecto en flex-items.

      ¿Vamos a practicar?

      Flexbox Froggy

      Enlaces útiles

      Al igual que con cualquier otra funcionalidad nueva que hemos aprendido, es fundamental practicar mucho e investigar siempre que tengamos dudas. A continuación se muestran algunos enlaces útiles.

      Este contenido se basa en gran parte en el tutorial de CSS Tricks, ¡con nuestros agradecimientos! Guarda en tus favoritos para consultar siempre que lo necesites.

      La guía CSS Tricks también aborda algunos otros aspectos importantes de Flex: soporte de los navegadores, errores, propiedades relacionadas, prefijos y etc. Si tiene alguna duda que no se haya abordado en este artículo, puedes consultar estos temas relacionados en el enlace.

    • Flexbox en MDN

    • Flexbox en W3Schools

      ¿Te gustó la publicación y quieres saber más? Aquí en Alura tenemos una formación front-end donde aprenderás más sobre HTML y CSS.

      Juliana Amoasei

      Desarrolladora JS con experiencia multidisciplinaria. Siempre aprendiendo para enseñar y viceversa.

Juliana Amoasei
Juliana Amoasei

Desenvolvedora JavaScript com background multidisciplinar, sempre aprendendo para ensinar e vice-versa. Acredito no potencial do conhecimento como agente de mudança pessoal e social. Atuo como instrutora na Escola de Programação da Alura e, fora da tela preta, me dedico ao Kung Fu e a nerdices em geral.

Artículo Anterior
Empezando con fetch en Javascript
Siguiente Artículo
Puntos de ruptura en el diseño responsivo

Ver otros artículos sobre Front-end

Navegación

  • Planes
  • Instructores
  • Blog
  • Política de privacidad
  • Términos de uso
  • Sobre nosotros
  • Preguntas frecuentes

¡CONTÁCTANOS!

  • ¡Quiero entrar en contacto!

Blog

  • Programación
  • Data Science
  • Front End
  • Innovación y Gestión
  • DevOps

AOVS Sistemas de Informática S.A CNPJ 05.555.382/0001-33

SÍGUENOS EN NUESTRAS REDES SOCIALES

YouTube Facebook Instagram Linkedin Whatsapp Spotify

NOVEDADES Y LANZAMIENTOS

Aliados

  • Programa de aceleração Scale-Up Endeavor
  • En Alura somos unas de las Scale-Ups seleccionadas por Endeavor, programa de aceleración de las empresas que más crecen en el país.
  • Growth Academy 2021 do Google For Startups
  • Fuimos unas de las 7 startups seleccionadas por Google For Startups en participar del programa Growth Academy en 2021
Alura

Powered by

Caelum

AOVS Sistemas de Informática S.A CNPJ 05.555.382/0001-33

SÍGUENOS EN NUESTRAS REDES SOCIALES

YouTube Facebook Instagram Linkedin Whatsapp Spotify

Cursos

Cursos de Programación
Lógica de Programación | Java
Cursos de Front End
HTML y CSS | JavaScript | React
Cursos de Data Science
Data Science | Machine Learning | Excel | Base de Datos | Data Visualization | Estadística
Cursos de DevOps
Docker | Linux
Cursos de Innovación y Gestión
Transformación Ágil | Marketing Analytics

Alura

  • Educação em Tecnologia

    • logo fiap FIAP
    • logo casa do codigo Casa do Código
    • logo pm3 PM3 - Cursos de Produto
  • Mais Alura

    • logo alura start START BY Alura
    • logo alura lingua Alura Língua
    • logo alura para empresas Alura Para Empresas
    • logo alura latam Alura LATAM
  • Comunidade

    • logo tech guide Tech Guide
    • logo 7 days of code 7 days of code
    • logo Hipsters ponto Jobs Hipsters ponto Jobs
  • Podcasts

    • logo Hipster Network Hipster Network
    • logo Hipsters ponto Tech Hipsters ponto Tech
    • logo Dev sem fronteiras Dev sem Fronteiras
    • logo Like a Boss Like a Boss
    • logo IA Sob Controle IA Sob Controle
    • logo Mesa de Produto Mesa de Produto
    • logo Decode Decode
    • logo FIAPCast FIAPCast