Entendiendo Flexbox para el diseño responsive

Muchos desarrolladores están familiarizados con los trucos con los floats y los clearfix de CSS para crear diseños multicolumnas. Estos trucos todavía se siguen utilizando, ya que funciona y cuentan con gran soporte entre una sinfín de navegadores. Sin embargo, en 2009, apareció en el mapa un nuevo estilo de visualización denominado flex.

Desde entonces, flex ha sufrido varios cambios hasta alcanzar su iteración actual. El valor flex es una alternativa para bloquear elementos flotantes y manipulados utilizando media-queries. Debido a esto, los desarrolladores pueden crear contenedores flexibles, es decir, Flexbox, para abreviar. Es genial para pantallas móviles y contenidos responsive para diseños y apps web que sean dinámicos. Esta guía cubre los fundamentos de uso de Flexbox CSS y algunos recursos útiles para ahondar más profundo en el tema.

¿Cuál es un contenedor flexible?

El diseño con contenedores flexibles es una forma de utilizar la propiedad CSS display de una manera totalmente nueva. Los elementos block se apilan verticalmente, mientras que los elementos inline se apilan horizontalmente (hasta que rompen en una nueva línea).

Los elementos FlexBox pueden apilarse vertical u horizontalmente basándose en tu configuración. Pueden estar espaciados uniformemente en la página o exprimidos y apretados unos contra otros. El quid es proporcionar un mayor control a los desarrolladores que deseen crear diseños que respondan de forma natural.

Cualquier elemento referenciado como Flexbox es un elemento contenedor. Este contenedor contendrá elementos dentro, conocidos como items FlexBox. Si quieres más detalles sobre esto, te recomiendo que leas la primera parte de este artículo de Mozilla Dev.

El contenedor display:flex puede tener un ancho fijo o fluido, pero lo mejor es dejarlo como fluido, para que el contenido se adapte a la página. Los elementos internos no tendrán valores específicos de anchura, en vez de eso se mostrarán basándose en proporciones. Puedes utilizar la propiedad CSS lamada flex para definir un radio entre contenedores (mayormente divs HTML). Flex:1 representa un radio de 1:1 en donde cada elemento interno flex se mostra con un mismo ancho en base a la resolución de la pantalla.

Las claves de un diseño Flexbox

Naturalmente, la parte más importante de un flexbox es el contenedor en sí mismo. Este contenedor viene dado por el display:flex, por lo que sus hijos se comportan de la misma manera.

Los elementos de dentro de un flexbox pueden fluir verticalmente u horizontalmente mediante el uso de la propiedad flex-direction. Esta propiedad toma un valor de row o column con opciones inversas también. Ten en cuenta que esta propiedad solo se aplica a los padres, no a los hijos.

Otra propiedad importante es justify-content, que también se aplica directamente al padre. Esta propiedad define cómo se comporta el espacio cuando los elementos internos no llenan el contenedor. Los elementos flexbox pueden estar centrados, alineados a la izquierda/derecha, o espaciados uniformemente tal y como desees. Échale un vistazo al artículo de Codrops para obtener más información.

Ambas propiedades son cruciales cuando personalizamos un contenedor flexible. Pero también necesitarás de más propiedades de configuración para que puedas definir cómo se deben comportar los elementos internos.

Flexbox utiliza la propiedad flex, que es la abreviatura de unas cuantas opciones de configuración. Como hemos dicho anteriormente, la propiedad flex es la unión de tres propiedades distintas: flex-grow, flex-shrink y flex-basis.

Las dos primeras propiedades definen el crecimiento y reducen el ratio para los elementos internos. Los valores son sin unidades por lo que flex:1; es una sintaxis válida. Poniendo un valor de 1 a flex estaríamos definiendo que cada contenedor tendrá un valor flexible de 1 de ratio, basándonos en los demás contenedores.

Al principio, esta característica puede parecer confusa, pero con la práctica y ejemplos claros llegarás a darte cuenta de cómo funciona todo.

HTML

<h1>The Fortean World Times</h1>
<section>
<article class="breaking">
  <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/earth-vs-the-flying-saucers.jpg" alt="Photograph of a flying saucer over the US Capitol building">
    <h1>Washington D.C. Attacked By Flying Saucers</h1>
    <h2>Dateline Washington D.C.</h2>
    <h3>Frank Bragg reporting</h3>
    <p>The country was brought to a standstill today when flying saucers – presumably from Mars, although Venusians have also been suspected – appeared over the nation’s capital, intent on destruction. Curiously, they only attacked Pennsylvania Avenue, and have not appeared elsewhere in the country.
  </article>
 <article>
<img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/bigfoot_1.jpg" alt="Photograph of a Bigfoot">
<h1>Bigfoot Found, Shot, Killed</h1>
<h2>Dateline Washington State</h2> <h3>Jessica Walsh reporting</h3>
<p>The first conclusive proof of the elusive Sasquatch was found today, when one of the ape-men was found and killed by a hunter in the north-eastern corner of the state.
<p>The hunter plans to tour the pelt in the fall.
</article>
<article>
  <img src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/alligator-sewer_1.jpg" alt="Photograph of an alligator emerging from an open manhole cover">
<h1>Nest of Alligators Found in New York Sewers</h1>
<h2>Dateline New York City</h2>
<h3>Ted Sturgis reporting</h3>
<p>Years of rumours were confirmed yesterday when a nest of alligators were found in the sewers of New York City, just south of Times Square. The largest, which locals have dubbed “Mugsy”, measures over 21 feet long.
</article>
</section>

CSS

@import url(http://fonts.googleapis.com/css?family=Oswald:400,300);
@import url(http://fonts.googleapis.com/css?family=Merriweather);
@font-face {
  font-family: 'Queens Park';
  src: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/4273/queens-park.woff') format('woff');
  font-style: normal;
  font-weight: 400;
}
section { display: flex; }
body > h1 { 
  font-family: Queens Park, serif;
  font-size: 4rem;
  text-align: center; 
}
article { 
  margin: 1rem;
  -ms-flex: 1 0 0px;
  flex: 1; 
  /* shortcut for "flex-grow: 1". Note that it MUST be a unitless value to work; defined with a unit (e.g. flex: 1px) the shortcut would alter the flex-basis property. */
}
article.breaking { 
  -ms-flex-grow: 2; 
  flex: 2; 
  /* shortcut for "flex-grow: 2" */
} 
 
article img { 
  width: 100%; height: auto; 
}
article h1, article h2, article h3 { font-family: Oswald, serif; }
article h1 { 
  font-size: 2rem; 
  line-height: 1.3;
}
article h2, article h3 { 
  font-size: 1.2rem; 
  text-align: right; 
  line-height: 1.3;
  margin: .3rem 0;
  font-weight: 300;
}
article h3 { 
  font-size: 1.1rem; 
}
article p { 
  font-family: Merriweather;
  line-height: 1.6; 
}
@media screen and (max-width: 750px) {
  body > h1 { font-size: 3rem; }
  section { 
    -ms-flex-direction: column;
    -webkit-box-orient: vertical;
    flex-direction: column; 
  }
}

La unica propiedad flex que acepta unidades es flex-basis. Esta configuración opcional define el tamaño por defecto de los elementos internos (ancho si es row, alto si es column). Por defecto está puesto a 0 pero puedes establecerlo a lo que quieras.

Fuente: envato.com

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP