¿Por qué utilizar etiquetas de listas de definiciones (DL, DD, DT) para formularios HTML en lugar de tablas?


85

Recientemente me encontré con algunos ejemplos que hacen cosas como:

<dl>
  <dt>Full Name:</dt>
  <dd><input type="text" name="fullname"></dd>
  <dt>Email Address:</dt>
  <dd><input type="text" name="email"></dd>
</dl>

para hacer formularios HTML. ¿Porqué es eso? ¿Cuál es la ventaja sobre el uso de tablas?


5
La respuesta que ha seleccionado es un marcado completamente inválido: falta "acción", "método" en el formulario, no puede colocar lebel e ingresar allí de esa manera. El ejemplo también se mostrará en una línea, ya que no hay etiquetas <br> (lo que probablemente no sea la intención). El código, además de ser inválido, también es una sopa de códigos en lo que respecta a la semántica. Una lista de definiciones y una tabla son semánticamente equivalentes, en este caso. La diferencia está en la cantidad de código, dl es mucho más corto: pastie.org/1090219 mientras que con la tabla necesita varios para funcionar, es incómodo: pastie.org/1090229 (continúa ...)
srcspider

1
Si no le importa la semántica, esta es la forma de hacer que sea válida y evitar el uso de identificadores: pastie.org/1090225
srcspider

8
srcspider, se requiere el método y, técnicamente, según el navegador, la acción se tomará por defecto. El formato de la respuesta está todo hecho en CSS. no deberías necesitar ninguno <br />. Todo depende completamente de cómo quieras
diseñar

¿Por qué las etiquetas JavaScript (o CSS)? Ahora, el título de esta página comienza con javascript - ...
ᴠɪɴᴄᴇɴᴛ

Respuestas:


105

Supongo que depende de usted determinar la semántica, pero en mi opinión:

En lugar de una lista de definiciones, se deben utilizar propiedades relacionadas con el formulario.

<form>
  <label for="fullname">Full Name:</label>
  <input type="text" name="fullname" id="fullname">
  <label for="email">Email Address:</label>
  <input type="text" name="email" id="email">
</form>

El atributo "for" en la etiqueta <label> debe hacer referencia al atributo "id" de una etiqueta <input>. Tenga en cuenta que cuando las etiquetas están asociadas con campos, hacer clic en la etiqueta pondrá el campo asociado en foco.

También puede usar etiquetas como <fieldset> para agrupar secciones de un formulario y <legend> para poner título a un fieldset.


26
También puede poner la entrada dentro de la etiqueta
nickf

17
+1 por ser la única persona que sugirió la forma lógica de hacer esto. Una "tabla" generalmente no es semánticamente precisa o muy flexible desde una perspectiva de diseño. Una "lista de definiciones" está más cerca pero aún un poco exagerada. ¿Pero "entradas" y "etiquetas"? ¡Eso es exactamente lo que son las cosas!
Chuck

4
Para muchas formas, creo que una tabla / puede / ser semánticamente apropiada. Sin embargo, no en todos los casos. Y como dijo Chuck, las tablas no son muy flexibles desde la perspectiva del diseño. Si va a usar tablas para su formulario, asegúrese de que sea semánticamente apropiado y asegúrese de usar etiquetas también.
sjstrutt

5
nickf: Sí, pero es más flexible no anidarlos, porque luego puedes hacer label {display: block;} para obtener etiquetas sobre los campos, o label {clear: both; float: left; width: 300px;} to obtenga una mirada tabular.
svinto

1
svinto: su segundo ejemplo es el enfoque que suelo usar. El problema es que estás limitado en el ancho de tus etiquetas; agregar una etiqueta larga o aumentar el tamaño del texto puede generar resultados no deseados y ahí es donde la solución de la tabla es más flexible.
jeroen

48

He utilizado con éxito la técnica descrita en este artículo varias veces.

Estoy de acuerdo con sjstrutt en que debe usar etiquetas relacionadas con formularios como labely formen sus formularios, pero el HTML descrito en su ejemplo, a menudo carecerá de código que pueda usar como "ganchos" para diseñar su formulario con CSS.

Como consecuencia de esto, marco mis formularios de esta manera:

<form name="LoginForm" action="thispage">
    <fieldset>
        <legend>Form header</legend>
        <ul>
            <li>
                <label for="UserName">Username: </label>
                <input id="UserName" name="UserName" type="text" />
            </li>
            <li>
                <label for="Password">Password: </label>
                <input id="Password" name="Password" type="text" />
            </li>
        </ul>
    </fieldset>
    <fieldset class="buttons">
        <input class="submit" type="submit" value="Login" />
    </fieldset>
</form>

Este enfoque me deja con un conjunto comprensible de etiquetas, que contiene suficientes ganchos para diseñar los formularios de muchas maneras diferentes.


2
El único problema que he encontrado con este enfoque es que a veces es necesario colocar contenido entre 2 elementos de formulario que no se relacionan con ninguno de los dos. Semánticamente, debe cerrar la lista desordenada y comenzar de nuevo, pero luego puede tener una lista que consta de solo un elemento secundario.
alex

y la lista de casillas de verificación, ¿dónde la pondrás?
Sasha

@msony dentro de un <li>, al igual que las otras entradas.
DaveD

4
¿Eh? Si necesita ganchos, use divs. Para eso son. La semántica es excelente (¡y debería usarse!), Pero cuando necesita un ancla para un estilo, es mejor usar un span o un div que no tenga significado semántico. Un div es una caja y debe usarse como tal.
jedd.ahyoung

1
Si pienso en mis formularios como una colección de conjuntos de campos con leyendas, cada uno con una lista de campos de entrada con o sin etiquetas, ¿no tendría el html anterior un significado semántico perfecto? Además, tiene la ventaja adicional de no requerir nombres de clases adicionales para formatear.
Hauge

23

Este es un subconjunto de la cuestión de la semántica frente al formato. Una lista de definiciones dice cuáles son, una lista de atributos clave / valor relacionados, pero no dice cómo mostrarlos. Una tabla dice más sobre el diseño y cómo mostrar los datos que los datos que contiene. Limita cómo se puede formatear la lista al sobreespecificar el formato y al subespecificar lo que es.

HTML, históricamente, ha mezclado la semántica con el formato. Las etiquetas de fuentes y las tablas son los peores ejemplos. El cambio a CSS para el formateo y la eliminación de muchas de las etiquetas de formato puro de XHTML restaura, en cierto modo, la separación entre el significado y el formato. Al separar el formato en CSS, puede mostrar el mismo HTML de muchas formas diferentes y reformatearlo para un navegador amplio, un navegador móvil pequeño, impresión, texto sin formato, etc.

Para la iluminación, visite CSS Zen Garden .


Yo agregaría que agrega intención, relación. Más tarde, un motor de búsqueda podría consumir esta página y descubrir el código anterior y saber que todo está relacionado.
Chuck Conway

1
Lo extraño dlpara mí es que se basa en el orden de las etiquetas para transmitir la relación entre un término y sus definiciones.
ehdv

15

En este caso, las etiquetas y las entradas son su significado semántico y se mantienen por sí solas.

Imagina que tuvieras que leer la página web, descargarla, a una persona ciega. No diría "Está bien, tengo una lista de definiciones aquí. El primer término es 'nombre'". En su lugar, probablemente diría "Bien, tenemos un formulario aquí y parece que hay un conjunto de campos , la primera entrada tiene la etiqueta 'nombre'".

Por eso la web semántica es importante. Permite que el contenido de la página se represente a sí mismo con precisión tanto para los humanos como para la tecnología. Por ejemplo, existen muchos complementos de navegador que ayudan a las personas a completar rápidamente formularios web con su información estándar (nombre, número de teléfono, etc.). Rara vez funcionan bien si las entradas no tienen etiquetas asociadas.

Espero que ayude.


15

Utilizando dl dt, ddpara las formas es sólo otra manera de estructurar sus formas, junto con ul li, divy table. Siempre se puede poner un labelen dt. De esta manera, mantiene el elemento específico del formulario labelen su lugar.

<form action="/login" method="post"> 
    <dl>
        <dt><label for="login">Login</label></dt>
        <dd><input type="text" name="login" id="login"/></dd>
        <dt><label for="password">Password</label></dt>
        <dd><input type="password" name="password" id="password"/></dd>  
        <dd><input type="submit" value="Add"/></dd>
    </dl>
</form>

9
Su ejemplo va en contra de la especificación, ya que su botón de envío pertenece a la contraseña dt. Tiene varios dd que pertenecen a un solo dt, que es lo que está haciendo aquí. Pondría el botón de envío debajo del dl por completo, porque el dl solo está destinado a grupos de nombre y valor, no a elementos que se destacan por sí mismos como un botón de envío.
jedmao

6
No creo que vaya en contra de la especificación. Puede tener tantas descripciones por término como desee (y viceversa) w3.org/TR/html401/struct/lists.html#h-10.3 Pero tiene razón, el botón de enviar debe moverse fuera de la definición de Contraseña.
ak.

enviar simplemente no tiene que estar en el dl. No es un elemento de entrada (semánticamente) sino un elemento de acción.
redben

1
¡Excelente! Esa es la solución más flexible y compatible con los estándares. Es realmente difícil diseñar un formulario usando solo etiquetas y entradas, pero usar <dl> es mucho más fácil.
Eduardo Cobuci

@Eduardo Cobuci: +1 De hecho, este es el mejor enfoque hasta ahora. Semánticamente casi bien, y podemos darle un estilo más adecuado. También puedo agregar un elemento de conjunto de campos.
MEM

14

Las listas de definiciones tienen un significado semántico. Son para enumerar términos (<dt>) y sus definiciones asociadas (<dd>). Por lo tanto, en este caso, un <dl> representa el significado semántico del contenido con más precisión que una tabla.


1
O menos, ya que la mayoría de las formas no piden definiciones de términos (mientras que las tablas son relaciones de tuplas genéricas).
Quentin

4
No estoy de acuerdo contigo David, cuando un formulario tiene una entrada para que lo llenes con tu nombre, se pregunta "¿Cuál es tu nombre?", Por lo que "Define tu nombre" es completamente válido, por lo tanto dt> nombre dd> tu entrada. Por supuesto que la definición tiene un contexto, tú.
redben

9
Las etiquetas inputy correctamente utilizadas labelya no son ambiguas y, en el mejor de los casos, incluirlas en una lista de definiciones es una tautología. Como es la frase 'significado semántico' :)
Ian Mackinnon

@IanMackinnon De acuerdo con la primera parte, pero "significado semántico" se refiere específicamente al significado fuera de lo que son los elementos en sí mismos (que es más en la línea del "significado literal")
Izkata

6

Las listas de definiciones casi nunca se utilizan porque, semánticamente hablando, rara vez aparecen en Internet.

En su caso, se ha publicado el código correcto:

<form>
    <label for="fullname">Full Name:</label>
    <input type="text" name="fullname" id="fullname">
    <label for="email">Email Address:</label>
    <input type="text" name="email" id="email">
</form>

Estás creando un formulario con entradas y etiquetas para dichas entradas, no estás estableciendo una lista de palabras y definiéndolas.

Si está haciendo algún tipo de sección de ayuda, las listas de definiciones serían apropiadas, por ejemplo:

<dl>
    <dt>HTML</dt>
    <dd>Hypertext Markup Language</dd>
    <dt>CSS</dt>
    <dd>Cascade Stylesheets</dd>
    <dt>PHP</dt>
    <dd>Hypertext Preprocessor</dd>
</dl>

Término: Nombre Definición: Por favor proporcione uno en el cuadro provisto.
J Wynia

Lo siento. Si piensa en el término (el dt) como cosas como "Nombre", "Apellido", etc., la definición (el dd) puede verse como proporcionada por el usuario.
J Wynia

4

Parte de la razón para usar <dl> para marcar el formulario es que es mucho más fácil hacer trucos de diseño CSS sofisticados con un <dl> que con una <table>. La otra parte es que refleja mejor la semántica del formulario (una lista de pares de etiqueta / campo) que una tabla.

Ok, el odio a la mesa también es parte de esto.


2

A veces, una lista de definiciones simplemente presenta la información de la forma deseada, mientras que una tabla no lo hace. Personalmente, probablemente no usaría una lista de definiciones para un formulario, a menos que se adapte al estilo del sitio.


2

Prácticamente todas las formas son tabulares. ¿Alguna vez ha visto un formulario que no es tabular? Las pautas que he leído sugirieron usar la etiqueta de tabla para la presentación tabular y para eso son exactamente los formularios, los calendarios y las hojas de cálculo. ¿Y ahora usan DD y DT en lugar de tablas? ¿A qué se dirige la Web? :)


7
Creo que es un ejemplo de fobia a la mesa;) He visto datos tabulares hechos de anidados <ul>y <ol>diseñados con toneladas de CSS solo porque las tablas son malas .
el.pescado

1
o, porque <ul> y <ol> suelen ser mucho más flexibles en términos de estilo y reorganización del diseño sin cambiar la estructura HTML.
Sean

0

Los datos de la lista de tablas serán así:

<table>
<tr>
	<td class="title">Name: </td>
	<td class="text">John Don</td>
</tr>
<tr>
	<td class="title">Age: </td>
	<td class="text">23</td>
</tr>
<tr>
	<td class="title">Gender: </td>
	<td class="text">Male</td>
</tr>
<tr>
	<td class="title">Day of Birth:</td>
	<td class="text">12th May 1986</td>
</tr>
</table>

Y puede usar datos de lista de etiquetas DL, DT, DD como este:

<dl>
	<dt>Name: </dt>
	<dd>John Don</dd>
	
	<dt>Age: </dt>
	<dd>23</dd>
	
	<dt>Gender: </dt>
	<dd>Male</dd>
	
	<dt>Day of Birth:</dt>
	<dd>12th May 1986</dd>
</dl>


3
Gracias por el enlace, pero sería mejor incluir el código aquí también, porque el enlace puede caducar en algún momento. Por cierto, el ejemplo exagera la diferencia, porque podrían haber usado <th/>elementos para las etiquetas ...
ᴠɪɴᴄᴇɴᴛ
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.