<?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 blog de Deigote &#187; vertical-align</title>
	<atom:link href="http://blog.deigote.com/tag/vertical-align/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.deigote.com</link>
	<description>El mundo de Deigote. Un diario de cualquier cosa que me resulte interesante (si a alguien más se lo resulta, es otro cantar). Espero que os guste o disguste. Incluso que os deje indiferentes sería una opción tan buena como cualquier otra.</description>
	<lastBuildDate>Thu, 07 Apr 2011 15:29:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Columnas y centrado vertical, esos grandes amigos</title>
		<link>http://blog.deigote.com/2008/09/11/columnas-y-centrado-vertical-esos-grandes-amigos/</link>
		<comments>http://blog.deigote.com/2008/09/11/columnas-y-centrado-vertical-esos-grandes-amigos/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 17:13:45 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[height]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[maquetación]]></category>
		<category><![CDATA[maquetar con divs]]></category>
		<category><![CDATA[maquetar con tablas]]></category>
		<category><![CDATA[middle]]></category>
		<category><![CDATA[table]]></category>
		<category><![CDATA[table-cell]]></category>
		<category><![CDATA[table-row]]></category>
		<category><![CDATA[vertical-align]]></category>

		<guid isPermaLink="false">http://blog.deigote.com/?p=257</guid>
		<description><![CDATA[O cómo centar verticalmente un div flotante. Elegid el título que queráis, creo que ambos son igual de confusos  .
Todo aquel que haya dedicado algo de tiempo a realizar páginas web, seguro que ha tenido que utilizar hojas de estilo CSS. De no ser así, puede ser poque se tenga una página web sin [...]]]></description>
			<content:encoded><![CDATA[<p><em>O cómo centar verticalmente un div flotante. Elegid el título que queráis, creo que ambos son igual de confusos</em> <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> .</p>
<p>Todo aquel que haya dedicado algo de tiempo a realizar páginas web, seguro que ha tenido que utilizar hojas de estilo <a title="CSS en la Wikipedia" href="http://es.wikipedia.org/wiki/CSS">CSS</a>. De no ser así, puede ser poque se tenga una página web sin decoración alguna <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> o porque se esté decorando la misma utilizando los obsoletos atributos de las etiquetas HTML destinadas a esa tarea (ya se sabe, los atributos <em>color</em>, <em>width</em>, etcétera). En este último caso, se está incurriendo en un error, ya que estos elementos están desaconsejados desde <a title="HTML 4 specs" href="http://www.w3.org/TR/REC-html40/">HTML 4</a>, y <a href="http://www.punkchip.com/2007/02/css-deprecated-attributes-1/">existen alternativas para los mismos</a>.</p>
<p>Con la llegada de dicho estándar y de las mencionadas hojas de estilo, otra de las cosas que se desaconsejan es la maquetación con tablas, siendo su alternativa la utilización de <em>divs</em>. Existen <a title="Maquetación con tablas en Google" href="http://www.google.es/search?q=maquetacion+con+tablas">muchísimos enlaces al respecto</a>, en los que se puede leer acerca de cómo maquetar con tablas, cómo evitar hacerlo, y las razones para ello. Mi resumen de las respuestas sería algo como:</p>
<ul>
<li>Que maquetar con tablas es realmente fácil, ya que por defecto cuentan con columnas, filas y celdas y permiten trabajar con ellas de manera muy flexible e intuitiva.</li>
<li>Que para no maquetar con tablas se debe englobar cada conjunto de información en <em>divs</em> (seguramente, el mismo conjunto que antes englobaríamos en una celda de una tabla) y jugar con las posibilidades que ofrece CSS (sobretodo, las propiedades <em>float</em> y <em>clear</em>)</li>
<li>Y que las razones para no maquetar con tablas son que las tablas sólo deben usarse para, precisamente, representar datos agrupados en forma tabular. En definitiva, la idea es usar cada <em>tag</em> HTML para dar información semántica y nunca estética, ya que de esto último se encargan las propiedades CSS.</li>
</ul>
<p>Sin embargo, es difícil conseguir algunas de las cosas que con tablas son realmente fáciles, debido a que estas últimas tienen un comportamiento muy noble, mientras que algunas propiedades CSS, y en concreto una fundamental como es <a title="W3C: Float property" href="http://www.w3schools.com/css/pr_class_float.asp">float</a>, se comportan de manera realmente extraña en muchas ocasiones. Una de esas cosas es el centrado vertical de algún elemento que se encuentra dentro una columna maquetada con <em>divs</em>.</p>
<h4>¿Qué pretendo?</h4>
<p>Básicamente, lo que quiero conseguir es algo como esto:</p>
<table style="border: 1px solid green; float: left; margin-right: 3em" border="0">
<tbody>
<tr>
<td style="border: 1px solid red">columna uno</td>
<td style="border: 1px solid blue">columna dos,<br />
la cual es bastante<br />
más alta que la anterior</td>
</tr>
</tbody>
</table>
<table style="border: 1px solid green" border="0">
<tbody>
<tr>
<td style="border: 1px solid red">columna uno</td>
<td style="border: 1px solid blue">columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 sigue centrada</td>
</tr>
</tbody>
</table>
<p>Si examináis el código fuente de los ejemplos anteriores, veréis que están maquetados con tablas. Automáticamente, la información de la <em>columna uno</em> se centra verticálmente, aunque posteriormente podemos modificarla con la propiedad <em>vertical-align</em> de CSS. Por ejemplo, la primera tabla tiene este código fuente:</p>
<p><code>&lt;table style="border: 1px solid green"&gt;<br />
&lt;tbody&gt;<br />
&lt;tr&gt;<br />
&lt;td style="border: 1px solid red"&gt;columna uno&lt;/td&gt;<br />
&lt;td style="border: 1px solid blue"&gt;columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 sigue centrada&lt;/td&gt;<br />
&lt;/tr&gt;<br />
&lt;/tbody&gt;&lt;/table&gt;</code></p>
<h4>El problema</h4>
<p>Si esta misma maquetación la hacemos usando divs, obtendríamos el siguiente resultado:</p>
<div class="contendor" style="border: 1px solid green; margin: 0; padding: 0">
<div class="columna1" style="border: 1px solid red; margin: 0pt; padding: 0pt; float: left; width: 10em; height: 100%; vertical-align: middle;">columna uno</div>
<div class="columna2" style="border: 1px solid blue; margin: 0; padding: 0; padding-left: 10em">columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 ya no se centra</div>
</div>
<p>cuyo código fuente es el siguiente:</p>
<p><code>&lt;div class="contendor" style="border: 1px solid green; margin: 0; padding: 0"&gt;<br />
&lt;div class="columna1" style="border: 1px solid red; margin: 0pt; padding: 0pt; float: left; width: 10em; height: 100%; vertical-align: middle;"&gt;columna uno&lt;/div&gt;<br />
&lt;div class="columna2" style="border: 1px solid blue; margin: 0; padding: 0; padding-left: 10em"&gt;columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 ya no se centra&lt;/div&gt;<br />
&lt;/div&gt;</code></p>
<p>Como podemos observar, el comportamiento de los div es bastante diferente al de las tablas por defecto. Por ejemplo, la anchura se adapta a la del contenedor en lugar de a la del contenido, y el alineado vertical se ajusta a la parte superior.</p>
<p>La idea es, sin embargo, que CSS permite modificar dicho comportamiento por defecto, pero en la práctica no podemos alterarlo tan fácilmente, ya que casi siempre estamos obligados a utilizar la propiedad <em>float</em>, que tiene algunas características curiosas, como por ejemplo hacer que el tamaño del <em>div</em> se ajuste al contenido (como en las tablas) y que puedas modificar la anchura con respecto al contenedor, pero no la altura.</p>
<p>Es decir, que podemos decir que el ancho sea de 10em (o podríamos decirle un 50% del <em>div</em> contenedor), pero que le digamos que la altura es de un 100% no le afecta. Las dos cosas se pueden observar en el ejemplo anterior.</p>
<h4>Una posible solución</h4>
<p>La única solución que he encontrado hasta ahora es hacer que los div se comporten como tablas. Esto es posible porque los creadores del estándar CSS incluyeron en la propiedad display una serie de valores para permitir maquetar divs usando la lógica de tablas. El resultado sería algo como lo siguiente:</p>
<div class="contendor" style="border: 1px solid green; margin: 0; padding: 0; display: table">
<div class="contendor-secundario" style="border: 1px solid yellow; margin: 0; padding: 0; display: table-row">
<div class="columna1" style="border: 1px solid red; margin: 0pt; padding: 0pt; vertical-align: middle; display: table-cell">columna uno</div>
<div class="columna2" style="border: 1px solid blue; margin: 0; padding: 0; display: table-cell">columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 se vuelve a centrar</div>
</div>
</div>
<p>Que, como podemos ver, permite el centrado vertical sin mayor problema. Su código fuente es el siguiente:<br />
<code>&lt;div class="contendor" style="border: 1px solid green; margin: 0; padding: 0; display: table"&gt;<br />
&lt;div class="contendor-secundario" style="border: 1px solid yellow; margin: 0; padding: 0; display: table-row"&gt;<br />
&lt;div class="columna1" style="border: 1px solid red; margin: 0pt; padding: 0pt; vertical-align: middle; display: table-cell"&gt;columna uno&lt;/div&gt;<br />
&lt;div class="columna2" style="border: 1px solid blue; margin: 0; padding: 0; display: table-cell"&gt;columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 ya no se centra&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;/div&gt;</code></p>
<p>Podemos observar que necesitamos un <em>div</em> que haga de tabla (<em>contenedor</em>, con la propiedad <em>display</em> como <em>table</em>), uno que haga de una fila de la tabla (<em>contenedor-secundario</em>, con la propiedad <em>display</em> como <em>table-row</em>) y cada una de las celdas (<em>columna1</em> y <em>columna2</em>, con la propiedad <em>display</em> como <em>table-cell</em>).</p>
<p>Si os fijáis, esto añade un <em>div</em> nuevo, el cual no tiene ningún propósito excepto el de ayudar a la maquetación, lo cual nunca es recomendable (se supone que el diseñador no debe tener necesidad de modificar el HTML si este está bien empaquetado en sus correspondientes divs etiquetados con identificadores y clases). Además, resulta irónico tener que simular el comportamiento de las tablas vía CSS para lograr lo mismo que anteriormente se lograba usando tablas directamente. Estas razones hacen que no me guste demasiado esta solución, no obstante es la única que de momento conozco.</p>
<p>Tener que recurrir a este tipo de soluciones me parece la prueba más evidente de que la maquetación usando CSS no está en absoluto depurada, conclusión a la que probablemente habrán llegado la mayoría de diseñadores web <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> .</p>
<h4>Caso particular: la columna a alinear es una imagen</h4>
<p>En el caso de que queramos centrar verticalmente una columna cuyo único contenido es una imagen, podemos conseguirlo haciendo que esa imagen sea la imagen de fondo de la columna, ya que la propiedad <em>background</em> si que permite alinear verticalmente en todos los casos (parece que <em>float</em>, la más utilizada, es la única conflictiva <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-P' title=':-P' class='wp-smiley smiley-15' /> ).</p>
<p>Esto sólo se debería usar en el caso de que la imagen sea méramente decorativa y no forme parte del contenido. Recordemos que idealmente, si eliminamos todas las hojas de estilo, la web no debería perder funcionalidad ni contenido, por lo que si la imagen aporta contenido, debería estar en el HTML. Un ejemplo de cómo hacer esto sería el siguiente:</p>
<div class="contendor" style="border: 1px solid green; margin: 0; padding: 0; background: url(http://blog.deigote.com/wp-content/themes/k2/styles/deigote/info.png) no-repeat scroll 0% 50%; padding-left: 60px">columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 sigue centrada</div>
<p>Cuyo código fuente es el siguiente:</p>
<p><code>&lt;div class="contendor" style="border: 1px solid green; margin: 0; padding: 0; background: url(http://blog.deigote.com/wp-content/themes/k2/styles/deigote/info.png) no-repeat scroll 0% 50%; padding-left: 60px"&gt;columna dos,<br />
la cual es bastante<br />
más alta que la anterior,<br />
y además la podemos hacer<br />
todavía más alta<br />
y la columna 1 sigue centrada<br />
&lt;/div&gt;</code></p>
<p>Podemos ver que en este caso nos evitamos todos los div excepto el contenedor, quedando el código más limpio. Sin embargo, este caso es muy particular y no nos resuelve nada en la mayoría de ocasiones <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-(' title=':-(' class='wp-smiley smiley-18' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2008/09/11/columnas-y-centrado-vertical-esos-grandes-amigos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
