Formularios basados en retículas CSS

30 julio 2007 ~ Software

Esta técnica describe cómo montar formularios básándose en una retícula usando CSS en lugar de tablas. No es la técnica definitiva pero, por ahora, es la mejor conclusión a la que he llegado.

formulario

La idea es definir la anchura de los campos del formulario basándonos en la etiqueta <label>. Esta etiqueta se utiliza para mostrar el nombre de cada campo y puede codificarse de dos maneras:

Una de ellas es aplicándole el parámetro for para relacionar cada label con el input/select/textarea que le corresponda.

<label for="nombre">Nombre:</label><input type="text" name="nombre />

La otra manera, que es la que utilizaremos aquí, es englobar el input/select/textarea dentro de una etiqueta <label>, de modo que ya no es encesario emplear el parámetro for para establecer la relación:

<label>Nombre:<input type="text" name="nombre /></label>

La maqueta basada en retícula supone, antes de nada, establecer la retícula. Para el ejempo usaré pixels, aunque puede hacerse también con porcentajes o con ems.

Vamos a maquetar un formulario de 300px de ancho basado en una retícula de 3 columnas, así que cada columna tendrá 90pixels de ancho y 10px de margen derecho.

Sobre esta retícula, podemos tener campos que ocupen 1, 2 ó 3 columnas, resultados campos de:

  • ancho1 (100) = 90px + 10px de margen
  • ancho2 (200)= 190 +10px de margen
  • ancho3 (300)= 290 +10px de margen

Bueno, ya tenemos las premisas para empezar a construir nuestro CSS.

Primero, al formulario le daremos el ancho de la retícula que nos hemos propuesto: 300px, aunque puede tener más si nos conviene para la estética, añadir padding..: realmente el formulario no influirá en la retícula, lo ponemos así por un cuestión formal.

.formulario 
{padding:0; width:300px;overflow:hidden;}

Ahora, pondremos los labels a flotar para que se vayan apilando uno a continuación del otro. Les daremos un margen derecho de, por ejemplo, 10px para separar las columnas de la retícula del formulario. Además de esto, para que el apilamiento funcione bien, forzaremos la altura de los labels ya que los select y los inputs no pintan igual en IE, de modo que los bloques de labels, al tener distinta altura, no se apilarían bien. Le damos un poco más de lo que pensamos que tendrá de altura un label (un em para el texto, otro em para el input/select y otro em para que exista margen vertical entre cada renglón de campos).

.formulario label
{float:left; margin-right:10px; height:3em}
.ancho1 {width:90px;}
.ancho2 {width:190px;}
.ancho3 {width:290px;}

Sólo falta decirle a los inputs y selects que ocupen todo el ancho de su contenedor, ya que son realmente los labels los que están fijando la anchura de cada campo.


.formulario input, .formulario select, .formulario textarea 
{width:100%;}

Si decoramos los campos con un borde por CSS, debemos reducir un poco el ancho ya que IE sumará al 100% los pixeles del border desbaratándolo todo.


.formulario input, .formulario select, .formulario textarea
{border:1px solid blue; width:99%;}

Ahora sólo nos falta el botón de enviar. Para que haga juego con nuestros labels apilados, lo flotamos a la izquierda y le damos margen superior de 1em para compensar que el botón no lleva el texto de un <label> por encima.


.formulario button
{float:left; margin-top:1em;}

Total, nos quedaría algo así:

CSS


.formulario
{padding:0; width:300px;overflow:hidden;}
.formulario label
{float:left; margin-right:10px; height:3em}
.formulario input, .formulario select, .formulario textarea
{border:1px solid blue; width:99%;}
.ancho1 {width:90px;}
.ancho2 {width:190px;}
.ancho3 {width:290px;}
.formulario button
{float:left; margin-top:1em;}

XHTML


<form class="formulario" action="#">
<label class="ancho1">
Tratamiento:
<select name="tratamiento">
<option value="1">Señor</option>
<option value="2">Señora</option>
<option value="3">Señorita</option>
</label>
<label class="ancho2">Nombre:<input type="text" name="nombre"/>
<label class="ancho3">Apellidos:<input type="text" name="nombre"/>
<label class="ancho1">Edad:
<select name="edad">
<option value="niño">0-15 años</option>
<option value="joven">15-35 años</option>
<option value="maduro">35-60 años</option>
<option value="viejo">60 o más</option>
</select>
</label>
<button type="submit">Enviar</button>
</form>

Y este sería el resultado (añádase algún detalle CSS para dejarlo curioso):

icono de del.icio.usmás...

a ~ 9 agosto 07

gravatar

no he leido detenidamente el artículo. es sólo para decirte que es recomendable que utilices ems en lugar de píxels para definir el ancho de los controles del formulario. en píxels se dificulta la visión de su contenido cuando el usuario cambia el ajuste del tamaño del texto en su navegador.

primo ~ 27 febrero 08

gravatar

en mozilla(2.0.0.12) se mira bien, en netscape(6.2.3) no se mira nada y pues nunca eh podido ver el contenido de una etiqueta label en este navegador, el safari(3.0.4(523.15)) solo aparecen algunos campos, en IE(6.0.2….) al parecer no interpreta bien el segundo campo Nombre y no lo ubica donde debe…..

Jorge ~ 28 febrero 08

gravatar

primo: solo te faltó probarlo en Mosaic, Opera y Konqueror! :-)

Netscape ha muerto hace tiempo, yo al menos lo ignoro por completo. En Safari no sé lo que verás tú, pero a mi este método no me da ningún problema con Safari. De cualquier manera, ya comenté que no está pulido del todo (se admiten sugerencias).

Blubi ~ 26 julio 08

gravatar

¡Uau! Me ha ido de perlas, no sabía cómo empezar a formatear un formulario y tus explicaciones me han ayudado muchísimo. ¡Muchas gracias!
Por cierto que voy a añadir tu página a favoritos…

PS: en name=“nombre” falta la doble comilla que cierra…

nombre
email *
http://
Mensaje
* Tu email no se publicará


Esta web no ha sido hecha con un Mac, no se ha programado con RnR y no pertenece a 9rules,
aun así, puede que te interese.

Construído con ayuda de Textpattern 4.0.4.

©© 2006 Jorge Hernández Condiciones de uso - Publicidad | XHTML - CSS | RSS - Atom