<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>el cssar &#187; css columns</title>
	<atom:link href="http://www.elcssar.com/tag/css-columns/feed" rel="self" type="application/rss+xml" />
	<link>http://www.elcssar.com</link>
	<description>Diseño y maquetación accesibles basados en estándares web</description>
	<lastBuildDate>Wed, 24 Feb 2010 09:04:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Columnas CSS</title>
		<link>http://www.elcssar.com/css/columnas-css</link>
		<comments>http://www.elcssar.com/css/columnas-css#comments</comments>
		<pubDate>Sun, 29 Mar 2009 14:13:46 +0000</pubDate>
		<dc:creator>test</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[css columns]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://www.elcssar.com/?p=96</guid>
		<description><![CDATA[Crear una estructura de columnas con css y html sin usar tablas Desde que comencé en este mundo del marcado con etiquetas de hipertexto, muchas veces tuve la necesidad de construir una estructura de 2 o 3 columnas. El problema llegó cuando me inicié en estructuras semánticas y vi que quizás el uso de tablas [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Crear una estructura de columnas con css y html sin usar tablas</strong> Desde que comencé en este mundo del marcado con etiquetas de hipertexto, muchas veces tuve la necesidad de construir una estructura de 2 o 3 columnas. El problema llegó cuando me inicié en estructuras semánticas y vi que quizás el uso de tablas no era el más propicio puesto que me restaba flexibilidad estilística y accesibilidad. Fue entonces cuando comencé a buscar soluciones  ajenas sin encontrar ninguna que me satisficiera y no pude evitar embarcarme en la búsqueda de las mías propias.<br style="font-size: 29.25px; line-height: 42.75px;" /> Lo primero que hice fue plantear la estructura e intentar partir de la solución parcial que todos usábamos ya para construir columnas. Tenemos una caja principal con dos elementos embebidos que queremos se comporten como columnas&#8230;</p>
<div id="attachment_143" class="wp-caption alignnone" style="width: 132px"><a href="http://www.elcssar.com/wp-content/uploads/2009/03/fase0.png"><img class="size-thumbnail wp-image-143" title="fase0" src="http://www.elcssar.com/wp-content/uploads/2009/03/fase0-122x150.png" alt="fase0" width="122" height="150" /></a><p class="wp-caption-text">crosbrowsing fase inicial</p></div>
<p><span id="more-96"></span></p>
<p>Normalmente usaríamos un float en la primera columna para flotar el contenido de la segunda pero eso no nos daría dos culumnas del mismo tamaño sino algo así:</p>
<div id="attachment_149" class="wp-caption alignnone" style="width: 132px"><a href="http://www.elcssar.com/wp-content/uploads/2009/03/fase1.png"><img class="size-thumbnail wp-image-149" title="fase1" src="http://www.elcssar.com/wp-content/uploads/2009/03/fase1-122x150.png" alt="crosbrowsing pimer paso" width="122" height="150" /></a><p class="wp-caption-text">crosbrowsing pimer paso</p></div>
<p style="clear:both">Vemos dos problemas,  el primero es el ya clásico <a title="problemba float" href="http://www.elcssar.com/css/problema-float">problema de los floats</a>. Para solucionarlo podríamos usar las múltiples opciones que nos han proporcionado los gurus, sin embargo para este ejercicio aplicaremos un display-table al contenedor y de ese modo el contenido no desbordará la caja. Para solucionar el segundo de ellos necesitamos ir a la raíz del problema: estamos usando un atributo cuyo fin es flotar contenido en linea al rededor del elemento al cual se le ha aplicado. No parece que sea el mismo que el nuestro, que es crear una estructura de columnas o celdas paralela. Os propongo dos soluciones.</p>
<ol>
<li style="clear:both"> <a href="#inherit">La solución con display table y height inherit(FF)/100%(IE)<br />
</a><strong>Compatibilidad: </strong></p>
<ul>
<li>Gecko (FF): 95%</li>
<li>Webkit (Safari, Chrome): 80%</li>
<li> Presto (Opera):30%</li>
<li>Trident (IE): 60%</li>
</ul>
<p><strong>Bugs:</strong></p>
<ol>
<li>En WebKit, Presto y Trident, al depender de la altura heredada de la ventana por medio del tag &lt;html&gt; una vez superada esa altura por alguna de las columnas, las otras no seguirán creciendo a pesar de que lo haga su contenedor, e incluso pueden llegar a perder la herencia por completo.</li>
<li>IE necesitará una excepción para sustituir <em>height: inherit </em>por <em>height: 100%</em></li>
<li>Los navegadores basados en Webkit pueden sufrir conflictos cuando la caja contenedora esté alojada dentro de otras</li>
<li>Opera se comporta como IE pero puesto que no podemos hacer excepciones para ella, su compatibildad con el método es nula.</li>
<li>En WebKit al usar  <em>padding</em> o <em>border</em> en modo tabla aparecen diferencias en el modelo de caja. Sin embargo se pueden aplicar a los elementos interiores sin problemas</li>
</ol>
<p><strong>Comentarios:</strong> aunque algo compleja, es la única solución mínimamente compatible con IE7 o inferiores.</li>
<li style="clear:both"><a href="#tablecell">Solución mediante la replica de una tabla </a><br />
<strong>Compatibilidad: </strong></p>
<ul>
<li>Gecko (FF): 100%</li>
<li>Webkit (Safari, Chrome): 100%</li>
<li>Presto (Opera): 100%</li>
<li>Trident (IE): 0%</li>
<li>IE8: próximanente</li>
</ul>
<p><strong>Bugs:</strong> al igual que el float el método display: table-cell puede no renderizarse en FF ante cargas extremadamente  lentas.<br />
<em> </em><strong>Comentarios:</strong> Rápido y sencillo de implementar. No tiene secretos y es soportado por todos los navegadores excepto IE7 o inferiores ya que no reconocen <em>display: table</em>.</li>
</ol>
<h2><a id="inherit">La solución con display table y height inherit(FF)/100%(IE)</a></h2>
<p>En esta solución aprovechamos los floats, y digo floats porque nos hará falta flotar ambas columnas y además proporcionarle el ancho a ambas tambien.<br />
<a href="http://www.elcssar.com/wp-content/uploads/2009/03/display_tablewebkit.html">Probrar solución para FF y cia. en directo</a><a href="http://www.elcssar.com/wp-content/uploads/2009/03/display_tableie.html"><br />
</a></p>
<ol>
<li>Lo primero que hacemos es aplicar nuestro <em>display table</em> al elemento contenedor para que los elementos flotados no desborden.
<pre><code>&lt;div style="<strong>display: table;</strong>width: 402px; padding: 2px"&gt;
  &lt;div style="<span style="color: #f00;">float: left; width: 250px;</span> background-color: #666;"&gt;Columna 1&lt;/div&gt;
  &lt;div style="<span style="color: #f00;">float: left; width: 150px;</span> background-color: #f40;"&gt;Columna 2&lt;/div&gt;
&lt;/div&gt; </code></pre>
<p><div id="attachment_150" class="wp-caption alignnone" style="width: 123px"><a href="http://www.elcssar.com/wp-content/uploads/2009/03/fase2.png"><img class="size-thumbnail wp-image-150" title="fase2" src="http://www.elcssar.com/wp-content/uploads/2009/03/fase2-113x150.png" alt="crossbrowsing paso 2" width="113" height="150" /></a><p class="wp-caption-text">crossbrowsing segundo paso</p></div></li>
<li>Vemos que la altura de ambas columnas no se equipara, de modo que racionalicemos el problema.  Necesitamos que, haya las columnas que haya, todas igualen su altura a la de la más alta de ellas. ¿Cual es el elemento que siempre tendrá la altura máxima? Si cualquiera de las columnas puede crecer en función de su contenido, sólo hay un elemento que ahora se está acomodando a la altura de la mayor de las columnas: el contenedor.  Es pues su altura la que nos importa, y los estándares nos permiten trasmitirle esta altura a sus elementos hijo mediante la herencia. Pero como no iba a ser tan fácil, primero tendremos que declarale una altura al contenedor por CSS para que sus hijos la puedan heredar. Y he aquí el dilema. Veamos primero el resultado con una medida fija.
<pre><code>&lt;div style="<strong>display: table; </strong>width: 402px; <span style="color: #ff0000;">height:60px; padding: 2px 0px 2px 2px;</span>"&gt;
  &lt;div style="float: left; width: 250px; <strong>height: inherit;</strong> background-color: #666;"&gt;Columna 1&lt;/div&gt;
  &lt;div style="float: left; width: 150px; <strong>height: inherit;</strong> background-color: #f40;"&gt;Columna 2&lt;/div&gt;
&lt;/div&gt;</code></pre>
<p><div id="attachment_151" class="wp-caption alignnone" style="width: 132px"><a href="http://www.elcssar.com/wp-content/uploads/2009/03/fase3.png"><img class="size-thumbnail wp-image-151" title="fase3" src="http://www.elcssar.com/wp-content/uploads/2009/03/fase3-122x150.png" alt="crossbrosing tercer paso" width="122" height="150" /></a><p class="wp-caption-text">crossbrosing tercer paso</p></div></li>
<li>Lo ideal sería que no tuviésemos que proporcionarle un alto al contenedor sino que éste creciese y automáticamente tomase un valor.  Como esto no es así y proporcionarle un alto fijo nos sirve de poco,  la única solución posible es dotarlo de un alto porcentual. Aunque no sea tampoco lo ideal pues nos obliga a tener un álto mínimo esta solución tiene truco. En principio podemos creer que nuestros &lt;body&gt; cubre el 100% de la ventana, pero eso no es así. No lo puede ser porque su elemento padre &lt;html&gt; no lo hace tampoco. Irónicamente, este comportamiento aparentemente extraño, nos permite que la altura del contenedor sea siempre la de su columna mayor que va forzando su tamaño y a su vez él fuerza la del body. Sin embargo por alguna razón las columnas como elemento de bloque no heredan bien el alto de su contenedor. Tendremos que aplicarles pues también a ellas el atributo display:table.<br />
Hasta aquí tendríamos <a title="columnasFF" href="http://www.elcssar.com/wp-content/uploads/2009/03/display_tableff.html">la solución perfecta para Firefox</a>.  Para que WebKit y Presto reaccionen &lt;html&gt; y &lt;body&gt; no tienen un height: 100% y aún así al superar el contenido la altura de la ventana la magia se rompe. IE directamente no comprende los estándares display:table ni el valor inherit. Pero para él aún hay alguna posibilidad.</p>
<pre><code>&lt;div style="display: table; width: 402px; <strong><span style="color: #ff0000;">height: 100%;</span></strong> padding: 2px 0 2px 2px"&gt;
  &lt;div style="float: left; width: 250px; height: inherit; background-color: #666;"&gt;Columna 1&lt;/div&gt;
  &lt;div style="display: table; float: left; width: 150px; height: inherit; background-color: #999;"&gt;Columna 2&lt;/div&gt;
&lt;/div&gt; </code></pre>
<p><a href="http://www.elcssar.com/wp-content/uploads/2009/03/display_tablewebkit.html">Probrar solución para FF y cia. en directo</a><a href="http://www.elcssar.com/wp-content/uploads/2009/03/display_tableie.html"><br />
</a><a href="http://www.elcssar.com/wp-content/uploads/2009/03/display_tableff.html"></a></p>
<p><div id="attachment_148" class="wp-caption alignnone" style="width: 132px"><a href="http://www.elcssar.com/wp-content/uploads/2009/03/fase4.png"><img class="size-thumbnail wp-image-148" title="fase4" src="http://www.elcssar.com/wp-content/uploads/2009/03/fase4-122x150.png" alt="crossbrowsing último paso" width="122" height="150" /></a><p class="wp-caption-text">crossbrowsing último paso</p></div></li>
<li style="height: 100%;">Corregimos para IE. En el ejercicio aplicamos los CSS sobre los elementos, pero para que la solución nos sirva en la práctica para varios navegadores tendremos que aplicar las excepciones para IE mediante un comentario condicional.
<pre><code>&lt;div style="display: table; padding: 2px 0px 2px 2px; width: 402px; height: 100%; background-color: #333333;"&gt;
  &lt;div style="display: table; float: left; width: 250px; background-color: #999999; <span style="color: #ff0000;"><strong>height: 100%;</strong></span>"&gt;columna 1&lt;/div&gt;
  &lt;div style="display: table; float: left; background-color: #ff9900; width: 150px; <span style="color: #ff0000;"><strong>height: 100%;</strong></span>"&gt;Columna2&lt;/div&gt;
&lt;/div&gt; </code></pre>
<p><a href="http://www.elcssar.com/wp-content/uploads/2009/03/display_tableie.html">Probrar solución para IE en directo</a><br />
Este es el código insertado dentro de otros elementos que limitan su altura.</p>
<div class="sample">
<div style="padding: 2px 0px 2px 2px; width: 402px; display: table; background-color: #333333; height: 100%;">
<div style="display: table; float: left; width: 250px; background-color: #999999; height: 100%;"><strong>Titulo columna 1</strong>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet orci nec enim malesuada sollicitudin. Fusce mattis velit a diam. Nunc interdum.Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
<div style="display: table; float: left; background-color: #ff9900; width: 150px; height: 100%;"><strong>Titulo columna 2</strong>Morbi auctor. In mi neque, volutpat quis, rutrum at, vehicula et, felis.</div>
</div>
</div>
</li>
</ol>
<h2><a id="tablecell">Solución mediante la replica de una tabla<br />
</a></h2>
<p>Para los puristas de los estándares y detractores de IE la solución perfecta para montar una estructura de columnas sin tablas y mediante un método consistente y sencillo.</p>
<ol>
<li>Aplicamos al elemento contenedor el atributo <em>display:table</em></li>
<li>Añadimos un elemento extra con un <em>display: table-row para dar estabilidad*</em></li>
<li>A cada columna le ponemos un <em>display: table-cell</em></li>
<li>Dimensionamos por CSS el contenedor y los columnas.</li>
</ol>
<p>Sí, ya está, no hay más. Aquí tenéis un ejemplo del método embebido y un<a href="http://www.elcssar.com/wp-content/uploads/2009/03/display_table_cell.html"> link al método como contenedor principal</a>.</p>
<pre><code>&lt;div style="border: 1px solid #333333; <span style="color: #ff0000;">display: table;</span> width: 400px;"&gt;
  &lt;div style="display:table-row"&gt;
    &lt;div style="<span style="color: #ff0000;">display: table-cell;</span> width: 250px; background-color: #999999;"&gt;Columna 1&lt;/div&gt;
    &lt;div style="<span style="color: #ff0000;">display: table-cell;</span> width:150px background-color: #ff9900;"&gt;Columna 2&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>
<div class="sample">
<div style="border: 1px solid #333333; display: table; width: 400px;">
<div style="display: table-cell; width: 250px; background-color: #999999;"><strong>Titulo columna 1</strong> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam sit amet orci nec enim malesuada sollicitudin. Fusce mattis velit a diam. Nunc interdum.</div>
<div style="display: table-cell; width: 150px; background-color: #ff9900;"><strong>Titulo columna 2</strong> Morbi auctor. In mi neque, volutpat quis, rutrum at, vehicula et, felis.</div>
</div>
</div>
<p>Puesto que IE no entiende de herencias, obviamente esta es una solución exclusiva para motores de renderizado de verdad. Pero siempre podemos recurrir a la primer solución y aplicarla mediante un comentario condicional.</p>
<p>*Este elemento en principio no es necesario, pero resuelve el problema de firefox con las cargas lentas</p>
]]></content:encoded>
			<wfw:commentRss>http://www.elcssar.com/css/columnas-css/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
