Pourquoi utiliser des balises de listes de définitions (DL, DD, DT) pour les formulaires HTML au lieu de tableaux?

85

J'ai récemment rencontré quelques exemples qui font des choses comme:

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

pour faire des formulaires HTML. Pourquoi donc? Quel est l'avantage par rapport à l'utilisation de tables?

cletus
la source
5
La réponse que vous avez sélectionnée est un balisage complètement invalide: "action", "méthode" manquante sur le formulaire, vous ne pouvez pas placer lebel et entrer ici comme ça. L'exemple s'affichera également sur une ligne car il n'y a pas de balises <br> (ce qui n'est probablement pas l'intention). Le code en plus d'être invalide est aussi une soupe de code en ce qui concerne la sémantique. Une liste de définitions et une table sont sémantiquement équivalentes, dans ce cas. La différence réside dans la quantité de code, dl est beaucoup plus courte: pastie.org/1090219 alors qu'avec une table, vous en avez besoin de plusieurs pour fonctionner, c'est gênant: pastie.org/1090229 (suite ...)
srcspider
1
Si vous ne vous souciez pas de la sémantique, voici
srcspider
8
srcspider, la méthode est requise et techniquement, selon le navigateur, l'action sera définie par défaut sur self. Le format de la réponse est tout fait en CSS. vous ne devriez pas en avoir besoin <br />. Tout dépend complètement de la façon dont vous voulez
styliser
Pourquoi les balises JavaScript (ou CSS)? Maintenant, le titre de cette page commence par javascript - ...
ᴠɪɴᴄᴇɴᴛ

Réponses:

105

Je suppose que c'est à vous de déterminer la sémantique, mais à mon avis:

Plutôt qu'une liste de définitions, des propriétés liées au formulaire doivent être utilisées.

<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>

L'attribut "for" dans la balise <label> doit faire référence à l'attribut "id" d'une balise <input>. Notez que lorsque des étiquettes sont associées à des champs, cliquer sur l'étiquette mettra le champ associé en évidence.

Vous pouvez également utiliser des balises telles que <fieldset> pour regrouper les sections d'un formulaire et <legend> pour sous-titrer un fieldset.

sjstrutt
la source
26
Vous pouvez également mettre l'entrée à l'intérieur de l'étiquette
nickf
17
+1 pour être la seule personne à suggérer la manière logique de le faire. Un «tableau» n'est généralement pas sémantiquement précis ou très flexible du point de vue de la mise en page. Une "liste de définitions" est plus proche mais toujours un peu extensible. Mais «entrées» et «étiquettes»? C'est exactement ce que les choses sont!
Chuck le
4
Pour beaucoup de formulaires, je crois qu'un tableau / peut / être sémantiquement approprié. Pas dans tous les cas cependant. Et comme Chuck l'a dit, les tableaux ne sont pas très flexibles du point de vue de la mise en page. Si vous envisagez d'utiliser des tableaux pour votre formulaire, assurez-vous qu'ils sont sémantiquement appropriés et assurez-vous également d'utiliser des étiquettes.
sjstrutt le
5
nickf: Oui, mais il est plus flexible de ne pas les imbriquer, car vous pouvez ensuite faire label {display: block;} pour obtenir les libellés au-dessus des champs, ou label {clear: both; float: left; width: 300px;} à obtenez un look tabulaire.
svinto le
1
svinto: votre deuxième exemple est l'approche que j'utilise normalement. Le problème est que vous êtes limité dans la largeur de vos étiquettes; l'ajout d'une longue étiquette ou l'augmentation de la taille du texte peut conduire à des résultats indésirables et c'est là que la solution de table est en fait plus flexible.
jeroen
48

J'ai utilisé avec succès la technique décrite dans cet article à plusieurs reprises.

Je suis d'accord avec sjstrutt pour dire que vous devriez utiliser des balises liées au formulaire comme labelet formdans vos formulaires, mais le code HTML décrit dans son exemple manquera souvent de code que vous pouvez utiliser comme "hooks" pour styliser votre formulaire avec CSS.

En conséquence, je marque mes formulaires comme ceci:

<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>

Cette approche me laisse avec un ensemble compréhensible de balises, qui contient suffisamment de crochets pour styliser les formulaires de différentes manières.

Hauge
la source
2
Le seul problème que j'ai trouvé avec cette approche est que vous devez parfois mettre du contenu entre 2 éléments de formulaire qui ne se rapportent pas à l'un ou l'autre. Sémantiquement, vous devez fermer la liste non ordonnée et recommencer, mais vous pouvez alors avoir une liste composée d'un seul élément enfant.
alex
et que dire de la liste de cases à cocher, où allez-vous le mettre?
Sasha
@msony dans un <li>, tout comme les autres entrées.
DaveD
4
Hein? Si vous avez besoin de hooks, utilisez divs. C'est à ça qu'ils servent. La sémantique est excellente (et devrait être utilisée!) Mais lorsque vous avez besoin d'une ancre pour un style, il est préférable d'utiliser un span ou un div qui n'a pas de signification sémantique. Un div est une boîte et est destiné à être utilisé comme tel.
jedd.ahyoung
1
Si je considère mes formulaires comme une collection d'ensembles de champs avec des légendes, chacun contenant une liste de champs d'entrée avec ou sans étiquettes, le html ci-dessus n'aurait-il pas une signification sémantique parfaite alors. De plus, il a l'avantage supplémentaire de ne pas nécessiter de noms de classe supplémentaires pour le formatage.
Hauge
23

Il s'agit d'un sous-ensemble du problème de la sémantique par rapport au formatage. Une liste de définitions dit ce qu'ils sont, une liste d'attributs clé / valeur associés, mais ne dit pas comment l'afficher. Un tableau en dit plus sur la disposition et la façon d'afficher les données, puis sur les données à l'intérieur. Il limite la façon dont la liste peut être formatée à la fois en surspécifiant le format et en sous-spécifiant de quoi il s'agit.

Le HTML, historiquement, a mélangé la sémantique avec le formatage. Les balises de polices et les tableaux sont les pires exemples. Le passage au CSS pour la mise en forme et la suppression de nombreuses balises de mise en forme pure hors du XHTML restaure, en quelque sorte, la séparation du sens et du formatage. En séparant le formatage en CSS, vous pouvez afficher le même HTML de différentes manières en le reformatant pour un navigateur large, un petit navigateur mobile, une impression, du texte brut, etc.

Pour vous éclairer, visitez le CSS Zen Garden .

Schwern
la source
J'ajouterais que cela ajoute une intention, une relation. Plus tard, un moteur de recherche pourrait consommer cette page et découvrir le code ci-dessus et savoir que tout est lié.
Chuck Conway
1
La chose étrange dlà mon sujet est qu'il repose sur l'ordre des balises pour transmettre la relation entre un terme et ses définitions.
ehdv
15

Dans ce cas, les étiquettes et les entrées sont votre signification sémantique et elles sont autonomes.

Imaginez que vous deviez lire la page Web, hors de charge, à une personne aveugle. Vous ne diriez pas "D'accord, j'ai une liste de définitions ici. Le premier terme est" nom "." Au lieu de cela, vous diriez probablement "Ok, nous avons un formulaire ici et il semble qu'il y ait un ensemble de champs , la première entrée est étiquetée " nom "."

C'est pourquoi le web sémantique est important. Il permet au contenu de la page de se représenter avec précision aux humains et à la technologie. Par exemple, il existe de nombreux plugins de navigateur qui aident les gens à remplir rapidement des formulaires Web avec leurs informations standard (nom, numéro de téléphone, etc.). Ceux-ci fonctionnent rarement bien si les entrées n'ont pas d'étiquettes associées.

J'espère que ça t'as aidé.

Jeremy Ricketts
la source
15

L' utilisation dl dt, ddainsi que des formes est juste une autre façon de structurer vos formes, ul li, divet table. Vous pouvez toujours mettre un labeldans dt. De cette façon, vous gardez l'élément spécifique au formulaire labelen place.

<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>
ak.
la source
9
Votre exemple va à l'encontre de la spécification, car votre bouton d'envoi appartient au mot de passe dt. Vous avez plusieurs dd appartenant à un seul dt, ce que vous faites ici. Je mettrais entièrement le bouton d'envoi sous le dl, car le dl n'est destiné qu'aux groupes nom-valeur - pas aux éléments qui se tiennent seuls comme un bouton d'envoi.
jedmao
6
Je ne pense pas que ce soit contraire aux spécifications. Vous pouvez avoir autant de descriptions par terme que vous le souhaitez (et vice versa) w3.org/TR/html401/struct/lists.html#h-10.3 Mais vous avez raison, le bouton d' envoi doit être déplacé hors de la définition du mot de passe.
ak.
soumettre n'a tout simplement pas besoin d'être sur le dl. Ce n'est pas un élément d'entrée (sémantiquement) mais un élément d'action.
redben
1
Génial! C'est la solution la plus flexible et la plus conforme aux normes. C'est vraiment difficile de styliser un formulaire en utilisant uniquement des étiquettes et des entrées, mais en utilisant <dl> c'est beaucoup plus facile.
Eduardo Cobuci
@Eduardo Cobuci: +1 En effet, c'est la meilleure approche à ce jour. Sémantiquement presque ok, et nous sommes en mesure de le styliser plus correctement. Je peux également ajouter un élément fieldset.
MEM
14

Les listes de définitions ont une signification sémantique. Ils servent à lister les termes (<dt>) et leurs définitions associées (<dd>). Par conséquent, dans ce cas, un <dl> décrit la signification sémantique du contenu avec plus de précision qu'une table.

Bret
la source
1
Ou moins, car la plupart des formulaires ne demandent pas de définitions de termes (alors que les tables sont des relations de tuple génériques).
Quentin
4
Je ne suis pas d'accord avec toi David, quand un formulaire a une entrée à remplir avec ton prénom, il demande "Quel est ton prénom" donc "Définir ton prénom" est totalement valide, donc dt> prénom dd> votre contribution. Bien sûr, la définition a un contexte, vous.
redben
9
Correctement utilisés inputet les labelétiquettes sont déjà sans ambiguïté, et les envelopper dans une liste de définition est au mieux tautologie. Tout comme l'expression `` signification sémantique '' :)
Ian Mackinnon
@IanMackinnon D'accord avec la première partie, mais la "signification sémantique" se réfère spécifiquement à la signification en dehors de ce que sont les éléments eux-mêmes (ce qui est plus
proche
6

Les listes de définitions ne sont presque jamais utilisées car, sémantiquement parlant, elles apparaissent rarement sur Internet.

Dans votre cas, le code correct a été affiché:

<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>

Vous créez un formulaire avec des entrées et des étiquettes pour lesdites entrées, vous ne définissez pas une liste de mots et ne les définissez pas.

Si vous faites une sorte de section d'aide, des listes de définitions seraient appropriées, par exemple:

<dl>
    <dt>HTML</dt>
    <dd>Hypertext Markup Language</dd>
    <dt>CSS</dt>
    <dd>Cascade Stylesheets</dd>
    <dt>PHP</dt>
    <dd>Hypertext Preprocessor</dd>
</dl>
Andrew G. Johnson
la source
Terme: Prénom Définition: Veuillez en fournir un dans la case prévue à cet effet.
J Wynia
Pardon. Si vous considérez le terme (le dt) comme des choses comme «Prénom», «Nom de famille», etc., la définition (le dd) peut être vue comme fournie par l'utilisateur.
J Wynia
4

Une partie de la raison d'utiliser <dl> pour baliser le formulaire est qu'il est beaucoup plus facile de faire des astuces de mise en page CSS avec un <dl> qu'avec une <table>. L'autre partie est qu'il reflète mieux la sémantique du formulaire (une liste de paires étiquette / champ) qu'un tableau.

Ok, la haine de table en fait également partie.

Théran
la source
2

Parfois, une liste de définitions présente simplement les informations de la manière souhaitée, contrairement à un tableau. Personnellement, je n'utiliserais probablement pas de liste de définitions pour un formulaire, sauf si cela convient au style du site.

statique
la source
2

Pratiquement tous les formulaires sont tabulaires. Avez-vous déjà vu un formulaire qui n'est pas tabulaire? Les directives que j'ai lues suggèrent d'utiliser la balise table pour une présentation tabulaire et c'est exactement à quoi servent les formulaires, les calendriers et les feuilles de calcul. Et maintenant, ils utilisent DD et DT au lieu de tables? À quoi le Web arrive-t-il?! :)

netrox
la source
7
Je pense que c'est un exemple de tablephobia;) J'ai vu des données tabulaires imbriquées <ul>et <ol>stylisées avec des tonnes de CSS juste parce que les tables sont mauvaises .
el.pescado du
1
ou parce que <ul> et <ol> sont généralement beaucoup plus flexibles en termes de style et de réorganisation de la mise en page sans changer la structure HTML.
Sean
0

Les données de la liste de table seront comme ceci:

<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>

Et vous pouvez utiliser les données de liste de balises DL, DT, DD comme ceci:

<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>

Kesar Sisodiya
la source
3
Merci pour le lien, mais il serait préférable d'inclure également le code ici, car le lien peut expirer à un moment donné. BTW, l'exemple exagère la différence, car ils auraient pu utiliser des <th/>éléments pour les étiquettes ...
ᴠɪɴᴄᴇɴᴛ