header ¡dios mio, esta lleno de estrellas..!

Publicidad




Hasta siempre, clear:both

A poco que se naveguen un par de horas por Internet, es fácil encontrar multitud de truquitos o hacks que nos pueden hacer la vida más sencilla, a la hora de trabajar con CSS. Eso es bueno, pero tambien lo es, pienso yo, tirar un poco del hilo y tratar de entender el porque de esos trocitos de código mágicos

La maquetación con CSS puede convertirse así en una mezcla de técnica, ciencia y arte.

Aún hay quien piensa que maquetar con tablas es más sencillo, pero seguro que no es tan divertido.

El problema
Cuando tratamos de maquetar nuestras páginas con CSS mediante elementos flotantes, no tarda en aparecer un elemento contenedor, que no rodea a los elementos contenidos, y esto resulta un verdadero incoveniente, ya que a menudo deseamos que los elementos con hijos flotantes, se comporten como dios manda y rodeen por completo a sus hijos.


Es decir, en lugar de un hermoso cuadro verde rodeando a nuestra capa roja tenemos esto:


CSS:
  1. #capa_verde{
  2. border:solid #0F0;
  3. margin-left:10px;
  4. }
  5.  
  6.  
  7. #capa_roja{
  8. background-color:#F00;
  9. width:100px;
  10. height:100px;
  11. float:left;
  12. }

Cuando lo que queriamos ver es algo asi:

CSS:
  1. #capa_verde{
  2. border:solid #0F0;
  3. margin-left:10px;
  4. }
  5.  
  6.  
  7. #capa_roja{
  8. background-color:#F00;
  9. width:100px;
  10. height:100px;
  11. }

Por otra parte, este comportamiento, aunque fastidioso, es bastante lógico. Se debe a lo siguiente:

Cuando no se especifica un valor para el alto de un elemento, este se calcula a partir del alto de los hijos que contiene, además de los margenes y rellenos correspondientes. Pero cuando hacemos que un elemento sea flotante mediante la propiedad float, lo que hacemos realmente es sacarlo del flujo normal del documento, por lo tanto nuestro contenedor se queda sin elementos contenidos que le marquen el alto que debe tener.

Ummm, no. Asi explicado yo tampoco lo entiendo.

A ver si con unas fotos...

bloque

El paquete de tabaco es un elemento no-flotante que obliga a su contenedor (los cd's) a mantener un determinado alto. Si en lugar de un paquete de tabaco, tuviera que contener un libro seguro que los cd's estaria mas separdos, y si fuera una moneda estarian mas próximos. El alto del contenedor se adapta al alto del contenido.

Ahora bien, si convierto a mi paquete de tabaco en un elemento flotante, lo estoy elevando unos centímentros de mi lienzo, y al no tener nada que los mantenga separados, los cd's se dejan llevar por la gravedad.

flotante

Con el siguiente código podemos construir un pequeño ejemplo para ilustrar lo anterior.

el marcado:

HTML:
  1. <div id="contenedor">
  2.         <div id="barra">
  3.             <p>
  4.             Lorem ipsum dolor sit amet, ....
  5.             </p>
  6.             <p>
  7.             Nullam pretium euismod sem...
  8.             </p>
  9.             <p>
  10.             Vestibulum ante ipsum primis...
  11.             </p>           
  12.         </div>
  13.         <div id="cuerpo">
  14.             <p>
  15.             Lorem ipsum dolor sit amet, ....
  16.             </p>
  17.             <p>
  18.             Nullam pretium euismod sem...
  19.             </p>
  20.             <p>
  21.             Vestibulum ante ipsum primis...
  22.             </p>           
  23.         </div>   
  24.     </div>

el estilo:

CSS:
  1. body{
  2.         font-size:100%;  /*necesario para el diseño elastico en ie*/
  3.         text-align:center;
  4.     }
  5.     #contenedor{
  6.         border:solid 1px blue;
  7.         text-align:left;
  8.         margin:auto;
  9.         width:46em;
  10.     }
  11.    
  12.     #barra{
  13.         float:left;
  14.         width:10em;  
  15.         outline:dashed 1px red;
  16.         margin:0.5em;
  17.     }
  18.     #cuerpo{
  19.         margin:0.5em;
  20.         width:33em;  
  21.         float:right;
  22.         outline:dashed 1px green;
  23.     }

Esto es un claro ejemplo de una maquetación sencilla condos capas flotantes sin limpiar

Si no terminas de ver claro el uso de la propiedad outline no dejes de leer este otro articulo

La solución clásica
Tradicionalmente este problema se venía solucionando mediante el uso de la propiedad clear.
Así, si incorporamos el siguiente código a nuestro podemos obligar a crecer a nuestro contenedor.

HTML:
  1. <div id="contenedor">
  2.         ....
  3.         <div class="clear"></div>
  4.     </div>

CSS:
  1. .clear{
  2.         clear:both;
  3.     }

Esta técnica es poco elegante, ensucia nuestro marcado HTML con un elemento ajeno al contenido, e incluye un elemento "vacio" pero funciona, como puedes ver en este ejemplo

La solución definitiva
Pero no todo van a ser problemas, existe una solución alternativa como se presenta en este revelador artículo

La propiedad overflow permite controlar el desbordamiento de los elementos contenidos, y adminte cuatro valores, auto, visible, scroll y hidden.

El valor por defecto es visible, que hace la caja contenedora crezca para adaptarse al tamaño de sus hijos. El resto de valores mantienen las dimensiones especificadas con width y height, pero nos permiten controlar el comportamiento de las barras de desplazamiento, mostrandolas siempre (scroll), ocultandolas siempre (hidden) o mostrandolas solo cuando sea necesario (auto)

Pues resulta todos los valores posibles, menos visible asumen que se han especificado unas dimensiones, y si no es asi... obliga a que se calculen!!

Con overflow le recordamos a una caja que tiene hijos, flotantes, pero hijos.

Aqui os dejo el ejemplo definitivo

Problemas con Internet Explorer
No son demasiado graves, pero hay que tenerlos en cuenta.
Todo lo dicho con anterioridad funciona en IE, siempre y cuando fijemos un ancho para el elemento contenedor, no me pregunteis por que.

Además, si queremos que esta tecnica funcione en IE bajo Mac, deberemos asignar obligatoriamente overflow:hidden.

O eso parece, no he podido comprobar esto último ya que no tengo un Macintosh a mano, y si lo tuviera no instalaría Internet Explorer.

archivado por hari en css, webdesign, ejemplos
el 06 dEurope/Berlin Septiembre dEurope/Berlin 2006
puedes escribir un comentario
o leer los 27 que ya existen

Comentarios

  1. 1

    aCABO DE ENCONTRAR TU PAGINA Y TE FELICITO POR TUS ARTICULOS EN CUANTO A CSS Y HTML.
    ESTAN MUY BUENOS ESO AUNADO ATUS GRAFICAS COMO ILUSTRACION .
    eSTARE VISITANDO CONTINUAMENTE TU WEB PARA LEER TODO LO QUE PUBLIQUE REFERENTE A CSS,XHTML.


    10 Septiembre 2006 Felipe Rguez
  2. 2

    […] Cuando desarrollamos alguna aplicación nos encontramos con problemas de capas que nos sobrepasan, incluso llegamos a añadir código “poco elegante” en nuestras creaciones,una buena solución al problema de superposición de capas, muy ilustrativo y explicativo, nos puede ayudar en muchas situaciones. […]

  3. 3

    Deberias de probar especificando la propiedad float, en el contenedor, ya con eso se resuelven los problemas, ya que los elemento que se encuentran flotando, contienen a los que a todos aquellos que son su hijos y no importa que esten flotando siguen el flujo y asi todo solucionado

    No se si me di a enteneder pues se me hacen un poco dificil de explicar pero dale el float al contenedor

  4. 4

    Muchas gracias Rene, por tu sugerencia.

    Si algo tiene de bueno e interesante CSS es la gran cantidad de posibilidades que nos ofrece.

    Investigaremos

  5. 5

    ¿Tuviste oportunidad de probarlo en IE7?

  6. 6

    Que va, aun no ha caido una beta de IE7 en mis manos. Ya me gustaría.

    De cualquier forma, ahora mismo, mucho me equivoco o el grueso del mercado se lo reparten IE6 / Firefox.

    Ojala IE7 solucione todos los problemas que tiene IE6, y si es así que se extienda muy muy rápido.

    Pero creo que eso es mucho pedir, ¿tu que piensas?

  7. 7

    Yo soy novata en esto del css, pero al mirar el código del ejemplo definitivo vi que te habías dejao el en el código y no lo entendia….pero ya me he enterao! Gracias

  8. 8

    Vaya no ha salido…que te habías dejado el Clear

  9. 9

    No hay de que, para eso estamos, pequeña saltamontes

    Por cierto, tu blog engancha…

    Gracias por comentar!!!

  10. 10

    […] el plan seldon — Hasta siempre, clear:both Solucion a las cajitas flotantes rebeldes, sin el feo clear: both (tags: css diseño HTML programming tips web web2.0 webdev) […]

  11. 11

    Hola a todos, me ha venido muy bien la explicación , pero al probarlo en mozilla, nada, no funciona, alguna sugerencia?

  12. 12

    Siglink.14…

    Una vez más, el listado de enlaces teóricamente semanales que nunca se sabe que día de la semana del año aparecerán™.

    Aprovecho para comentar que los Siglinks como tales, desaparecen. Si el hombre es un animal de costumbres, yo lo debo de s…

  13. 14

    […] Tutoriales y artículos: Tutorial de posicionamiento y layout en CSS || Cristalab Geekipollas » Solución a las Columnas en CSS Liquid layouts using CSS - the joy, the pain, the tears Progressive Layout | Web Design | PRO.HTML.IT A List Apart: Articles: In Search of the Holy Grail CollyLogic: Redesign Notes 1: Width-based layout Drop Column Layout | Muffin Research Labs Componer un diseño de 3 columnas en XHTML y CSS + Cristalab Learn CSS Positioning in Ten Steps CSSLab » Layout Fijo: resucitando los frames CSSLab » Layout fijo a elástico en sólo 4 caracteres Create a simple liquid layout - .net magazine A List Apart: Switchy McLayout: An Adaptive Layout Technique el plan seldon — Hasta siempre, clear:both EstadoBeta » Despejando Floats para IE7 « Anterior: Alojamiento gratuito de imágenes Siguiente: Centrar » […]

  14. 15

    Muy buena solución y muy ilustrativa la explicación. Gracias.


    13 Febrero 2007 Mastropiero
  15. 16

    A esto realmente no lo sabia, y eso que consideraba saber bastante sobre CSS.
    Veo que lo tomaste de quirksmode, excelente sitio.
    Gracias por tu aporte.

  16. 17

    el ejemplo fotografico me encanto. muy novedoso

  17. 18

    Maravilloso, plas plas plas… una explicación de lo más reveladora… Gracias. Y outline… también… incrrei ble ble ble ble…

  18. 19

    Gracias!!
    Muchísimas gracias. Estuve un par de horas solucionando un problemilla de posicionamiento, y leyendo esto lo resolví.

  19. 20

    Es dificil explicarlo mejor. Gracias.


    14 Mayo 2007 daigual
  20. 21

    Muy buena la explicación, por cierto… ¿cuanto te ha aforado Ducados por hacer apología del tabaquismo?.

    Saludos.

  21. 22

    […] [para profundizar un poco más en este tema…] […]

  22. 23

    […] La luz ha venido de un post viejo de El Plan Seldon, y básicamente consiste en modificar la cláusula overflow en el contenedor, para asignarle un valor diferente del que viene por defecto (visible), lo que obliga a calcular las dimensiones del mismo a partir de las de sus hijos flotantes. Por cierto, las fotos ilustrativas son fantásticas. […]

  23. 24

    grasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssggrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssgrasiasssrasiasss

  24. 25

    […] Pero si el problema es que tenemos elementos “flotados”, y queremos que el contenedor los envuelva, nada más fácil que aplicar al contenedor la propiedad overflow: hidden. La explicación la encontraréis aquí […]

  25. 26

    Gracias por tu artículo. Me estaba volviendo loco modificando un tema para Drupal. Con tu artículo ya he superado mi bloqueo ;-)

    ¡Gracias!

    Por cierto, muy útil y divertido el ejemplo de los cds y el tabaco :-D

  26. 27

    Hola,
    Soy nuevo en esto y ando un poco perdido la verdad. Tengo una pregunta, yo tengo 2 div que contienen 1 imagen cada uno. ¿Cómo puedo hacer para que uno esté al lado del otro?

    Los 2 div no pueden estar englobados dentro de un div común y por ello me he creado una clase css donde le indico float:left pero no me funciona.

    Gracias por la ayuda.


    25 Marzo 2008 Parleño

Añade tu opinión

*

*