POSICIONAMIENTO Y VISUALIZACION
Cuando los navegadores descargan el contenido HTML y CSS de las páginas web, aplican un procesamiento muy complejo antes de mostrar las páginas en la pantalla del usuario.
Tipos de elementos
El estándar HTML clasifica a todos sus elementos en dos grandes grupos: elementos en línea y elementos de bloque.
Los elementos de bloque ("block elements" en inglés) siempre empiezan en una nueva línea y ocupan todo el espacio disponible hasta el final de la línea. Por su parte, los elementos en línea ("inline elements" en inglés) no empiezan necesariamente en nueva línea y sólo ocupan el espacio necesario para mostrar sus contenidos.
Debido a este comportamiento, el tipo de un elemento influye de forma decisiva en la caja que el navegador crea para mostrarlo. La siguiente imagen muestra las cajas que crea el navegador para representar los diferentes elementos que forman una página HTML:
{alt="Cajas creadas por los elementos de línea y los elementos de bloque"}
Posicionamiento
Los navegadores crean y posicionan de forma automática todas las cajas que forman cada página HTML. No obstante, CSS permite al diseñador modificar la posición en la que se muestra cada caja.
Utilizando las propiedades que proporciona CSS para alterar la posición de las cajas es posible realizar efectos muy avanzados y diseñar estructuras de páginas que de otra forma no serían posibles.
El estándar de CSS define cinco modelos diferentes para posicionar una caja:
-
Posicionamiento normal o estático: se trata del posicionamiento que utilizan los navegadores si no se indica lo contrario.
-
Posicionamiento relativo: variante del posicionamiento normal que consiste en posicionar una caja según el posicionamiento normal y después desplazarla respecto de su posición original.
-
Posicionamiento absoluto: la posición de una caja se establece de forma absoluta respecto de su elemento contenedor y el resto de elementos de la página ignoran la nueva posición del elemento.
-
Posicionamiento fijo: variante del posicionamiento absoluto que convierte una caja en un elemento inamovible, de forma que su posición en la pantalla siempre es la misma independientemente del resto de elementos e independientemente de si el usuario sube o baja la página en la ventana del navegador.
-
Posicionamiento flotante: se trata del modelo más especial de posicionamiento, ya que desplaza las cajas todo lo posible hacia la izquierda o hacia la derecha de la línea en la que se encuentran.
El posicionamiento de una caja se establece mediante la propiedad position
:
Propiedad | position |
---|---|
Valores | static | relative | absolute | fixed | inherit |
Se aplica a | Todos los elementos |
Valor inicial | static |
Descripción | Selecciona el posicionamiento con el que se mostrará el elemento |
El significado de cada uno de los posibles valores de la propiedad position
es el siguiente:
-
static
: corresponde al posicionamiento normal o estático. Si se utiliza este valor, se ignoran los valores de las propiedadestop
,right
,bottom
yleft
que se verán a continuación. -
relative
: corresponde al posicionamiento relativo. El desplazamiento de la caja se controla con las propiedadestop
,right
,bottom
yleft
. -
absolute
: corresponde al posicionamiento absoluto. El desplazamiento de la caja también se controla con las propiedadestop
,right
,bottom
yleft
, pero su interpretación es mucho más compleja, ya que el origen de coordenadas del desplazamiento depende del posicionamiento de su elemento contenedor. -
fixed
: corresponde al posicionamiento fijo. El desplazamiento se establece de la misma forma que en el posicionamiento absoluto, pero en este caso el elemento permanece inamovible en la pantalla.
La propiedad position
no permite controlar el posicionamiento flotante, que se establece con otra propiedad llamada float
y que se explica más adelante. Además, la propiedad position
sólo indica cómo se posiciona una caja, pero no la desplaza.
Normalmente, cuando se posiciona una caja también es necesario desplazarla respecto de su posición original o respecto de otro origen de coordenadas. CSS define cuatro propiedades llamadas top
, right
, bottom
y left
para controlar el desplazamiento de las cajas posicionadas:
Propiedades | top, right, bottom, left |
---|---|
Valores | unidad de medida | porcentaje | auto | inherit |
Se aplica a | Todos los elementos posicionados |
Valor inicial | auto |
Descripción | Indican el desplazamiento horizontal y vertical del elemento respecto de su posición original |
En el caso del posicionamiento relativo, cada una de estas propiedades indica el desplazamiento del elemento desde la posición original de su borde superior/derecho/inferior/izquierdo. Si el posicionamiento es absoluto, las propiedades indican el desplazamiento del elemento respecto del borde superior/derecho/inferior/izquierdo de su primer elemento padre posicionado.
En cualquiera de los dos casos, si el desplazamiento se indica en forma de porcentaje, se refiere al porcentaje sobre la anchura (propiedades right
y left
) o altura (propiedades top
y bottom
) del elemento.
Posicionamiento normal
El posicionamiento normal o estático es el modelo que utilizan por defecto los navegadores para mostrar los elementos de las páginas. En este modelo, sólo se tiene en cuenta si el elemento es de bloque o en línea, sus propiedades width
y height
y su contenido.
Los elementos de bloque forman lo que CSS denomina "contextos de formato de bloque". En este tipo de contextos, las cajas se muestran una debajo de otra comenzando desde el principio del elemento contenedor. La distancia entre las cajas se controla mediante los márgenes verticales.
{alt="Posicionamiento normal de los elementos de bloque"}
Si un elemento se encuentra dentro de otro, el elemento padre se llama "elemento contenedor" y determina tanto la posición como el tamaño de todas sus cajas interiores.
Si un elemento no se encuentra dentro de un elemento contenedor, entonces su elemento contenedor es el elemento <body>
de la página. Normalmente, la anchura de los elementos de bloque está limitada a la anchura de su elemento contenedor, aunque en algunos casos sus contenidos pueden desbordar el espacio disponible.
Los elementos en línea forman los "contextos de formato en línea". En este tipo de contextos, las cajas se muestran una detrás de otra de forma horizontal comenzando desde la posición más a la izquierda de su elemento contenedor. La distancia entre las cajas se controla mediante los márgenes laterales.
{alt="Posicionamiento normal de los elementos en línea"}
Si las cajas en línea ocupan más espacio del disponible en su propia línea, el resto de cajas se muestran en las líneas inferiores. Si las cajas en línea ocupan un espacio menor que su propia línea, se puede controlar la distribución de las cajas mediante la propiedad text-align
para centrarlas, alinearlas a la derecha o justificarlas.
Posicionamiento relativo
El estándar CSS considera que el posicionamiento relativo es un caso particular del posicionamiento normal, aunque en la práctica presenta muchas diferencias.
El posicionamiento relativo desplaza una caja respecto de su posición original establecida mediante el posicionamiento normal. El desplazamiento de la caja se controla con las propiedades top
, right
, bottom
y left
.
El desplazamiento relativo de una caja no afecta al resto de cajas adyacentes, que se muestran en la misma posición que si la caja desplazada no se hubiera movido de su posición original.
{alt="Ejemplo de posicionamiento relativo de un elemento"}
En la imagen anterior, la caja 2 se ha desplazado lateralmente hacia la derecha y verticalmente de forma descendente. Como el resto de cajas de la página no modifican su posición, se producen solapamientos entre los contenidos de las cajas.
Las cajas desplazadas de forma relativa no modifican su tamaño, por lo que los valores de las propiedades left
y right
siempre cumplen que left = -right
.
El siguiente ejemplo muestra tres imágenes posicionadas de forma normal:
{alt="Elementos posicionados de forma normal"}
Aplicando el posicionamiento relativo, se desplaza la primera imagen de forma descendente:
Ejemplo:
Archivo html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" type="text/css" href="css/05_ejemplo.css" title="style" />
</head>
<body>
<img class="desplazada" src="imagenes/imagenGenerica.png" alt="Imagen genérica" />
<img src="imagenes/imagenGenerica.png" alt="Imagen genérica" />
<img src="imagenes/imagenGenerica.png" alt="Imagen genérica" />
</body>
</html>
Archivo css
El aspecto que muestran ahora las imágenes es el siguiente:
{alt="Elemento posicionado de forma relativa"}
El resto de imágenes no varían su posición y por tanto no ocupan el hueco dejado por la primera imagen, ya que el posicionamiento relativo no influye en el resto de elementos de la página. El principal problema de posicionar elementos de forma relativa es que se pueden producir solapamientos con otros elementos de la página.
Posicionamiento absoluto
El posicionamiento absoluto se emplea para establecer de forma exacta la posición en la que se muestra la caja de un elemento. La nueva posición de la caja se indica mediante las propiedades top
, right
, bottom
y left
. La interpretación de los valores de estas propiedades es mucho más compleja que en el posicionamiento relativo, ya que en este caso dependen del posicionamiento del elemento contenedor.
Cuando una caja se posiciona de forma absoluta, el resto de elementos de la página se ven afectados y modifican su posición. Al igual que en el posicionamiento relativo, cuando se posiciona de forma absoluta una caja es probable que se produzcan solapamientos con otras cajas.
En el siguiente ejemplo, se posiciona de forma absoluta la caja 2:
{alt="Ejemplo de posicionamiento absoluto de un elemento"}
La caja 2 está posicionada de forma absoluta, lo que provoca que el resto de elementos de la página modifiquen su posición. En concreto, la caja 3 deja su lugar original y pasa a ocupar el hueco dejado por la caja 2.
En los siguientes ejemplos, se utiliza la página HTML que muestra la siguiente imagen:
{alt="Situación original antes de modificar el posicionamiento"}
A continuación, se muestra el código HTML y CSS de la página original:
div {
border: 2px solid #CCC;
padding: 1em;
margin: 1em 0 1em 4em;
width: 300px;
}
<div>
<img src="imagenes/imagen.png" alt="Imagen genérica" />
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus
ullamcorper velit eu ipsum. Ut pellentesque, est in volutpat cursus, risus
mi viverra augue, at pulvinar turpis leo sed orci. Donec ipsum. Curabitur
felis dui, ultrices ut, sollicitudin vel, rutrum at, tellus.</p>
</div>
En primer lugar, se posiciona de forma absoluta la imagen mediante la propiedad position
y se indica su nueva posición mediante las propiedades top
y left
:
div img {
position: absolute;
top: 50px;
left: 50px;
}
El resultado visual se muestra en la siguiente imagen:
{alt="Imagen posicionada de forma absoluta"}
La imagen posicionada de forma absoluta no toma como referencia su elemento contenedor <div>
, sino la ventana del navegador, tal y como demuestra la siguiente imagen:
{alt="La referencia del posicionamiento absoluto es la ventana del navegador"}
Para posicionar la imagen de forma absoluta, el navegador realiza los siguientes pasos:
-
Obtiene la lista de elementos contenedores de la imagen:
<div>
y<body>
. -
Recorre la lista de elementos contenedores desde el más cercano a la imagen (el
<div>
) hasta terminar en el<body>
buscando el primer elemento contenedor que esté posicionado. -
El posicionamiento de todos los elementos contenedores es el normal o estático, ya que ni siquiera tienen establecida la propiedad
position
-
Como ningún elemento contenedor está posicionado, la referencia es la ventana del navegador.
-
A partir de esa referencia, la caja de la imagen se desplaza
50px
hacia la derecha (left: 50px
) y otros50px
de forma descendente (top: 50px
).div { border: 2px solid #CCC; padding: 1em; margin: 1em 0 1em 4em; width: 300px; position: relative; }
div img { position: absolute; top: 50px; left: 50px; }
La siguiente imagen muestra el resultado obtenido:
{alt="Imagen posicionada de forma absoluta"}
En este caso, como el elemento contenedor de la imagen está posicionado, se convierte en la referencia para el posicionamiento absoluto. El resultado es que la posición de la imagen es muy diferente a la del ejemplo anterior:
{alt="La referencia del posicionamiento absoluto es el elemento contenedor de la imagen"}
Por tanto, si se quiere posicionar un elemento de forma absoluta respecto de su elemento contenedor, es imprescindible posicionar este último. Para ello, sólo es necesario añadir la propiedad position: relative
, por lo que no es obligatorio desplazar el elemento contenedor respecto de su posición original.
Posicionamiento fijo
El estándar CSS considera que el posicionamiento fijo es un caso particular del posicionamiento absoluto, ya que sólo se diferencian en el comportamiento de las cajas posicionadas.
Cuando una caja se posiciona de forma fija, la forma de obtener el origen de coordenadas para interpretar su desplazamiento es idéntica al posicionamiento absoluto. De hecho, si el usuario no mueve la página HTML en la ventana del navegador, no existe ninguna diferencia entre estos dos modelos de posicionamiento.
La principal característica de una caja posicionada de forma fija es que su posición es inamovible dentro de la ventana del navegador. El posicionamiento fijo hace que las cajas no modifiquen su posición ni aunque el usuario suba o baje la página en la ventana de su navegador.
Posicionamiento flotante
EL posicionamiento flotante es el más difícil de comprender pero al mismo tiempo es el más utilizado. La mayoría de estructuras de las páginas web complejas están diseñadas con el posicionamiento flotante, como se verá más adelante.
Cuando una caja se posiciona con el modelo de posicionamiento flotante, automáticamente se convierte en una caja flotante, lo que significa que se desplaza hasta la zona más a la izquierda o más a la derecha de la posición en la que originalmente se encontraba.
La siguiente imagen muestra el resultado de posicionar de forma flotante hacia la derecha la caja 1:
{alt="Ejemplo de posicionamiento float de una caja"}
Cuando se posiciona una caja de forma flotante: * La caja deja de pertenecer al flujo normal de la página, lo que significa que el resto de cajas ocupan el lugar dejado por la caja flotante. * La caja flotante se posiciona lo más a la izquierda o lo más a la derecha posible de la posición en la que se encontraba originalmente.
Si en el anterior ejemplo la caja 1 se posiciona de forma flotante hacia la izquierda, el resultado es el que muestra la siguiente imagen:
{alt="Ejemplo de posicionamiento float de una caja"}
La caja 1 es de tipo flotante, por lo que desaparece del flujo normal de la página y el resto de cajas ocupan su lugar. El resultado es que la caja 2 ahora se muestra donde estaba la caja 1 y la caja 3 se muestra donde estaba la caja 2.
Al mismo tiempo, la caja 1 se desplaza todo lo posible hacia la izquierda de la posición en la que se encontraba. El resultado es que la caja 1 se muestra encima de la nueva posición de la caja 2 y tapa todos sus contenidos.
La propiedad CSS que permite posicionar de forma flotante una caja se denomina float
:
Propiedad | float |
---|---|
Valores | left | right | none | inherit |
Se aplica a | Todos los elementos |
Valor inicial | none |
Descripción | Establece el tipo de posicionamiento flotante del elemento |
Si se indica un valor left
, la caja se desplaza hasta el punto más a la izquierda posible en esa misma línea (si no existe sitio en esa línea, la caja baja una línea y se muestra lo más a la izquierda posible en esa nueva línea). El resto de elementos adyacentes se adaptan y fluyen alrededor de la caja flotante.
El valor right
tiene un funcionamiento idéntico, salvo que en este caso, la caja se desplaza hacia la derecha. El valor none
permite anular el posicionamiento flotante de forma que el elemento se muestre en su posición original.
Ejercicio1
A partir del código HTML proporcionado:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
<html xmlns="http://www.w3.org/1999/xhtml"
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Ejercicio posicionamiento float</title>
<style type="text/css">
</style>
</head>
<body>
<div>
« Anterior Siguiente »
</div>
</body>
</html>
Determinar las reglas CSS necesarias para que el resultado sea similar al mostrado en la siguiente imagen:
{alt="Elementos posicionados mediante float"}
Solución Ejercicio 1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Ejercicio posicionamiento float</title>
<style type="text/css">
div#paginacion {
border: 1px solid #CCC;
background-color: #E0E0E0;
padding: .5em;
}
.derecha {
float: right;
}
.izquierda {
float: left;
}
div.clear {
clear: both;
}
</style>
</head>
<body>
<div id="paginacion">
<span class="izquierda">« Anterior</span> <span class="derecha">Siguiente »</span>
<div class="clear"></div>
</div>
</body>
</html>