Elementos
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:
El segundo elemento de la página es un enlace. Los enlaces son elementos en línea, por lo que su caja sólo ocupa el espacio necesario para mostrar sus contenidos. Si después de este elemento se incluye otro elemento en línea (por ejemplo otro enlace o una imagen) el navegador mostraría los dos elementos en la misma línea, ya que existe espacio suficiente.
Por último, el tercer elemento de la página es un párrafo que se comporta de la misma forma que el primer párrafo. En su interior, se encuentra un enlace que también se comporta de la misma forma que el enlace anterior. Así, el segundo párrafo ocupa toda una línea y el segundo enlace sólo ocupa el espacio necesario para mostrar sus contenidos.
Por sus características, los elementos de bloque no pueden insertarse dentro de elementos en línea y tan sólo pueden aparecer dentro de otros elementos de bloque. En cambio, un elemento en línea puede aparecer tanto dentro de un elemento de bloque como dentro de otro elemento en línea.
Los elementos en línea definidos por HTML son:
a
, abbr
, acronym
, b
, basefont
, bdo
, big
, br
, cite
, code
, dfn
, em
, font
, i
, img
, input
, kbd
, label
, q
, s
, samp
, select
, small
, span
, strike
, strong
, sub
, sup
, textarea
, tt
, u
, var
.Los elementos de bloque definidos por HTML son:
address
, blockquote
, center
, dir
, div
, dl
, fieldset
, form
, h1
, h2
, h3
, h4
, h5
, h6
, hr
, isindex
, menu
, noframes
, noscript
, ol
, p
, pre
, table
, ul
.Los siguientes elementos también se considera que son de bloque:
dd
, dt
, frameset
, li
, tbody
, td
, tfoot
, th
, thead
, tr
.Los siguientes elementos pueden ser en línea y de bloque según las circunstancias:
button
, del
, iframe
, ins
, map
, object
, script
.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.
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.
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 propiedadeswidth
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.
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.
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 valor de la propiedad
top
se interpreta como el
desplazamiento entre el borde superior de la caja en su posición final y
el borde superior de la misma caja en su posición original.De la misma forma, el valor de las propiedades
left
, right
y bottom
indica respectivamente el desplazamiento entre el borde
izquierdo/derecho/inferior de la caja en su posición final y el borde
izquierdo/derecho/inferior de la caja original.Por tanto, la propiedad
top
se emplea para mover las cajas de forma descendente, la propiedad bottom
mueve las cajas de forma ascendente, la propiedad left
se utiliza para desplazar las cajas hacia la derecha y la propiedad right
mueve las cajas hacia la izquierda. Este comportamiento parece poco
intuitivo y es causa de errores cuando se empiezan a diseñar páginas con
CSS. Si se utilizan valores negativos en las propiedades top
, right
, bottom
y left
, su efecto es justamente el inverso.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.
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
.Si tanto
left
como right
tienen un valor de auto
(que es su valor por defecto) la caja no se mueve de su posición original. Si sólo el valor de left
es auto
, su valor real es -right
. Igualmente, si sólo el valor de right
es auto
, su valor real es -left
.Si tanto
left
como right
tienen valores distintos de auto
,
uno de los dos valores se tiene que ignorar porque son mutuamente
excluyentes. Para determinar la propiedad que se tiene en cuenta, se
considera el valor de la propiedad direction
.La propiedad
direction
permite establecer la dirección del texto de un contenido. Si el valor de direction
es ltr
, el texto se muestra de izquierda a derecha, que es el método de escritura habitual en la mayoría de países. Si el valor de direction
es rtl
, el método de escritura es de derecha a izquierda, como el utilizado por los idiomas árabe y hebreo.Si el valor de
direction
es ltr
, y las propiedades left
y right
tienen valores distintos de auto
, se ignora la propiedad right
y sólo se tiene en cuenta el valor de la propiedad left
. De la misma forma, si el valor de direction
es rtl
, se ignora el valor de left
y sólo se tiene en cuenta el valor de right
.El siguiente ejemplo muestra tres imágenes posicionadas de forma normal:
img.desplazada {
position: relative;
top: 8em;
}
<img class="desplazada" src="imagenes/imagen.png" alt="Imagen genérica" />
<img src="imagenes/imagen.png" alt="Imagen genérica" />
<img src="imagenes/imagen.png" alt="Imagen genérica" />
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.
Si la página se visualiza en un medio paginado (por ejemplo en una impresora) las cajas posicionadas de forma fija se repiten en todas las páginas. Esta característica puede ser útil para crear encabezados o pies de página en páginas HTML preparadas para imprimir.
El posicionamiento fijo apenas se ha utilizado en el diseño de páginas web hasta hace poco tiempo porque el navegador Internet Explorer 6 y las versiones anteriores no lo soportan.
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:
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.
Si existen otras cajas flotantes, al posicionar de forma flotante otra caja, se tiene en cuenta el sitio disponible. En el siguiente ejemplo se posicionan de forma flotante hacia la izquierda las tres cajas:
Si no existe sitio en la línea actual, la caja flotante baja a la línea inferior hasta que encuentra el sitio necesario para mostrarse lo más a la izquierda o lo más a la derecha posible en esa nueva línea:
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.Los elementos que se encuentran alrededor de una caja flotante adaptan sus contenidos para que fluyan alrededor del elemento posicionado:
img {
float: left;
}
float
fue precisamente la posibilidad de colocar imágenes alrededor de las cuales fluye el texto.CSS permite controlar la forma en la que los contenidos fluyen alrededor de los contenidos posicionados mediante
float
.
De hecho, en muchas ocasiones es admisible que algunos contenidos
fluyan alrededor de una imagen, pero el resto de contenidos deben
mostrarse en su totalidad sin fluir alrededor de la imagen:clear
permite modificar el comportamiento
por defecto del posicionamiento flotante para forzar a un elemento a
mostrarse debajo de cualquier caja flotante. La regla CSS que se aplica
al segundo párrafo del ejemplo anterior es la siguiente:<p style="clear: left;">...</p>
clear
se muestra a continuación:Propiedad | clear |
---|---|
Valores | none | left | right | both | inherit |
Se aplica a | Todos los elementos de bloque |
Valor inicial | none |
Descripción | Indica el lado del elemento que no debe ser adyacente a ninguna caja flotante |
La propiedad
clear
indica el lado del elemento HTML que no debe ser adyacente a ninguna caja posicionada de forma flotante. Si se indica el valor left
,
el elemento se desplaza de forma descendente hasta que pueda colocarse
en una línea en la que no haya ninguna caja flotante en el lado
izquierdo.La especificación oficial de CSS explica este comportamiento como "un desplazamiento descendente hasta que el borde superior del elemento esté por debajo del borde inferior de cualquier elemento flotante hacia la izquierda".
Si se indica el valor
right
, el comportamiento es análogo, salvo que en este caso se tienen en cuenta los elementos desplazados hacia la derecha.El valor
both
despeja los lados izquierdo y derecho del
elemento, ya que desplaza el elemento de forma descendente hasta que el
borde superior se encuentre por debajo del borde inferior de cualquier
elemento flotante hacia la izquierda o hacia la derecha.Como se verá más adelante, la propiedad
clear
es imprescindible cuando se crean las estructuras de las páginas web complejas.Si se considera el siguiente código CSS y HTML:
#paginacion {
border: 1px solid #CCC;
background-color: #E0E0E0;
padding: .5em;
}
.derecha { float: right; }
.izquierda { float: left; }
<div id="paginacion">
<span class="izquierda">« Anterior</span>
<span class="derecha">Siguiente »</span>
</div>
Anterior
y Siguiente
se salen
de su elemento contenedor y el resultado es visualmente incorrecto. El
motivo de este comportamiento es que un elemento posicionado de forma
flotante ya no pertenece al flujo normal de la página HTML. Por tanto,
el elemento <div id="paginacion">
en realidad no encierra ningún contenido y por eso se visualiza incorrectamente.La solución consiste en utilizar la propiedad
overflow
(que se explica más adelante) sobre el elemento contenedor:#paginacion {
border: 1px solid #CCC;
background-color: #E0E0E0;
padding: .5em;
overflow: hidden;
}
.derecha { float: right; }
.izquierda { float: left; }
Comenta: