martes, 15 de noviembre de 2016

HTML/CSS - Posicionamientos: estático, relativo, absoluto y fijo

Posicionamiento de elementos de HTML

Hay una gran cantidad de elementos HTML, imágenes, párrafos, listas, contenedores, entre muchos otros, por lo cual hay una infinidad de formas de utilizar dichos elementos para conseguir diferentes efectos. Una de las propiedades más comunes que pueden manipularse para conseguir efectos o comportamientos poco comunes en las páginas, es el atributo position.

Document Flow

Primeramente, es necesario hablar un poco del flujo del documento o document flow. Aunque el nombre suene elegante, en realidad es un concepto muy sencillo de entender.

El flujo del documento, no es otra cosa más que la forma en que los elementos HTML se acomodan al momento de ser renderizados/dibujados por el navegador. Este orden, está plasmado en el código HTML ya que conforme el navegador va interpretando el código, va acomodando los elementos. Cada elemento ocupa su propio lugar dentro del documento y si uno de ellos llegase a desaparecer, los demás ocuparían su lugar.

Otra forma más sencilla de verlo es pensar en el famoso juego de Tetris. En el juego, los bloques (de diferentes formas) van cayendo poco a poco hasta apilarse en el fondo de la pantalla. Cuando un bloque cabe enmedio de otros dos, ocupa ese lugar vacío. Cuando no encuentra un lugar que llenar, simplemente se apila encima de los demás bloques. Es lo mismo que ocurre en el flujo del documento, la diferencia es que los elementos HTML (bloques de Tetris) "caen" de abajo hacia arriba.

La parte importante de hablar sobre el flujo del documento HTML, es que quede razonablemente claro que cada elemento ocupa un lugar dentro de la estructura y que si movemos algún elemento, en mayor o menor medida afectamos también al documento en conjunto. A menos que manipulemos la propiedad position.

Posicionamiento

Ahora bien, habiendo hablado de Document Flow, podemos hablar de los distintos tipos de posicionamiento CSS, sus principales características, cómo funcionan y cómo afectan al flujo del documento.

position: static;
position: relative;
position: absolute;
position: fixed;

Posicionamiento: Estático

position: static;

El posicionamiento estático es aquel con el que los elementos HTML vienen por defecto, viene de fábrica. Éste establece que cada elemento se irá colocando debajo del anterior, ocupando los espacios que le sean posibles (exactamente igual que los bloques de Tetris que mencionábamos anteriormente).

El posicionamiento estático es muy simple, tanto así que no permite desplazar los elementos de su posicion original en el documento a través de CSS.

Ejemplo:

  • 1
  • 2
  • 3

Posicionamiento: Relativo

position: relative;

Es exactamente igual al posicionamiento estático en el sentido de que los elementos se renderizan tal cual vienen en el código HTML y se acomodan uno debajo del otro.

Estático y relativo difieren en que el segundo sí permite despalzar los elementos HTML de su posición original a través de coordenadas, las cuales, se definen tomando como referencia el lugar original del elemento, por medio de las propiedades top, right, bottom y left, donde como se puede deducir, cada propiedad se refiere a la distancia que tiene el elemento respecto a su posicion original.

Los elementos con posicionamiento relativo pueden ser desplazados de su lugar pero este desplazamiento afecta al flujo del documento, ya que aunque el elemento se desplace, el lugar donde estaba se conserva como "ocupado", es decir, como si el elemento siguiera ahí.

Ejemplo:

// código del recuadro desplazado
position: relative;
left:-100px;
background-color:  #088A85;
padding:20px;
width: 30px;
margin: 10px auto;

Como podemos ver, el primer cuadrado está desplazado y a pesar de eso, los demás elementos conservan su posicion en vez de recorrerse hacia arriba.

Posicionamiento: Absoluto

position: absolute;

Es similar, es más, casi igual al posicionamiento relativo. Los elementos con este posicionamiento pueden ser desplazados de su lugar original por medio de las propiedades antes descritas, dichas propiedades se definen respecto al contenedor padre con posicionamiento relativo más próximo.

Ejemplo:

//código de los recuadros
background-color:  #088A85;
padding:20px;
width: 30px;
position: absolute;
left:5px;
top:5px;

En estos dos ejemplos, ambos recuadros verdes tienen los mismos valores en sus propiedades left y top (ambos estan a left:5px; top:5px; de distancia de su contenedor de referencia), pero no están en el mismo lugar debido a que en el primer ejemplo el contenedor externo es el que tiene el posicionamiento relativo mientras que en el segundo ejemplo es el contenedor interno

La diferencia fundamental, es que mover estos elementos de lugar no afecta al flujo del documento, es decir, el lugar donde solía estar el elemento no continúa ocupado.

Ejemplo:

//código del recuadro
left:80px;
position: absolute; 
background-color: #088A85;
padding:20px;
width: 30px;
margin: 10px auto;

En este caso, el primer recuadro está desplazado y a la vez, el resto de los elementos se acomodan como si el recuadro nunca hubiera estado ahí.

Posicionamiento: Fijo

position: fixed;

Los elementos con posicionamiento fijo se comportan de una forma similar a los elementos relativos y absolutos en el sentido de que los tres son relativos a un elemento padre en funcion del cual se definen sus posiciones. Relativos y absolutos se posicionan en relación al contenedor padre más proximo como se menciona anteriormente mientras que los elementos con position: fixed; son relativos al viewport o puerto de visión del navegador. Es decir, los elementos con posicion fija, como su nombre indica, se mantienen fijos siempre en el mismo lugar independientemente de lo que suceda en el documento HTML o si el navegador scrollea hacia abajo o a los lados. Podemos ver un ejemplo en el siguiente enlace: esto es un enlace. Al hacer scroll hacia abajo, llega un punto en el que el menu se queda pegado en la parte de superior de la ventana del navegador.

Dudas, sugerencias, saludos y zings, dejar un comentario por favor c:

lunes, 14 de noviembre de 2016

HTML/CSS - Cómo centrar elementos y no morir en el intento

Centrando elementos

Después de un periodo de inactividad, vacaciones, letargo quizás, de alrededor 3 años, estamos de vuelta para seguir publicando una que otra cosilla útil. En esta ocasión, vamos a hablar un poco de cómo centrar elementos horizontal y verticalmente, lo cual, es muchas veces un dolor de cabeza incluso para aquellos con un poco o un mucho de experiencia en programación web.

Centrando elementos horizontalmente

Esta parte es muy sencilla realmente. Solo es necesario saber qué tipo de elemento HTML es el que estamos tratando de centrar; elementos block o elementos inline (se recomienda ampliamente leer los enlaces anteriores).

Una vez teniendo razonablemente clara la diferencia entre elementos y habiendo identificado a qué categoría pertenece lo que queremos centrar, podemos comenzar.

Centrando elementos horizontalmente: Elementos block

Esta es una tarea sencilla y para ello se usa la propiedad margin. Lo único que hay que hacer es establecer márgenes horizontales automáticos, de esta manera, el navegador sabe que es necesario colocar la misma "porcion" de margen a la izquierda y a la derecha de manera que se pueda "rellenar" horizontalmente el contenedor padre.

<div class="parent">
  <div class="child"></div>
</div>


.parent .child{
  margin: 0 auto;
}

Ejemplo:

  • margen vertical
  • margen automático
  • Elemento centrado
  • margen automático
  • margen vertical

Como podemos ver hay dos márgenes; los horizontales automáticos que se encargan de centrar la imagen y los verticales que están definidos por el usuario/programador que corresponden al 0 de

margin: 0 auto;

Centrado elementos horizontalmente: Elementos inline/inline-block

Por otro lado, tenemos a los elementos inline/inline-block. Los cuales, como podemos leer en los enlaces anteriores, no forman bloques y no ocupan toda la línea donde aparecen sino que ajustan su tamaño a su contenido, entre otras cosas.

Para centrar elementos inline/inline-block es necesario estilizar al padre.

<div class="parent">
  <div class="child"></div>
</div>


.parent{
  text-align: center;
}

Ejemplo:

Elemento centrado

Como vemos, en este caso es el contenedor padre el que hace que su contenido se centre. El elemento a centrar (en este caso del tipo inline/inline-block) no ocupa todo el ancho de su contenedor padre, por lo que queda "espacio libre" donde puede "moverse" a la izquierda/derecha, es precisamente ese "espacio libre" el que permite que el padre pueda centrarlo, muy similar a cuando centramos texto con esa misma propiedad,

text-align: center;

Centrando elementos: verticalmente

Esta parte es quizás una de las más complicadas para algunos (incluído yo). Hay muchos, muchos enfoques y métodos para centrar elementos verticalmente, algunos son más sencillos que otros, otros son más elegantes, algunos brindan soporte crossbrowser y otros simplemente explotan catastroficamente en navegadores no tan recientes. En el sitio donde trabajo, nos vemos obligados a apostar por compatibilidad crossbrowser antes que cualquier cosa, debido a que muchos de los clientes para los que creamos contenido utilizan navegadores un poco retro, por decirlo de una forma bonita.

Teniendo este detalle en mente, el método que vamos a ver aquí sí aporta compatibilidad crossbrowser además de que es bastante sencillo. Se trata de jugar un poco con la propiedad display. A continuación el código.

<div class="parent">
  <span></span>
</div>
 
.parent{
  display: table;
  width: 100%;
}

.parent span{
  display: table-cell;
  vertical-align: middle;
}

Es bien sabido (o quizás no tanto) que los elementos de tipo list item se pueden alinear verticalmente con facilidad, además, las propeidades descritas anteriormente no son nuevas por lo que este enfoque da soporte desde Internet Explorer 9 lo cual ya es decir bastante. El width:100%; que aparece en el codigo CSS es para ajustar el ancho del contenedor padre, ya que al establecer su propiedad display en table, su ancho se ajusta automaticamente a su contenido, igual que los elementos inline/inline-block. Todo lo demás es sencillo y no requiere de explicaciones muy profundas.

Ejemplo:

Elemento centrado verticalmente c:

Como siempre, cualquier duda, pregunta, sugerencia será razonablemente leída y atendida a la brevedad (ahora sí). Saludos c: