Warum sollten Sie anstelle von Tabellen Definitionslisten-Tags (DL, DD, DT) für HTML-Formulare verwenden?

85

Ich bin kürzlich auf einige Beispiele gestoßen, die Dinge tun wie:

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

für HTML-Formulare. Warum ist das so? Was ist der Vorteil gegenüber der Verwendung von Tabellen?

Cletus
quelle
5
Die Antwort, die Sie ausgewählt haben, ist ein völlig ungültiges Markup: Wenn "Aktion", "Methode" im Formular fehlt, können Sie Lebel und Eingaben dort nicht so platzieren. Das Beispiel wird auch in einer Zeile angezeigt, da keine <br> Tags vorhanden sind (was wahrscheinlich nicht beabsichtigt ist). Der Code ist nicht nur ungültig, sondern auch was die Semantik betrifft. Eine Definitionsliste und eine Tabelle sind in diesem Fall semantisch äquivalent. Der Unterschied liegt in der Menge des Codes, dl ist viel kürzer: pastie.org/1090219 Während Sie für eine Tabelle mehrere benötigen, um zu arbeiten, ist es umständlich: pastie.org/1090229 (Fortsetzung ...)
srcspider
1
Wenn Sie sich nicht für Semantik interessieren, können Sie diese auf diese Weise gültig machen und die Verwendung von IDs vermeiden: pastie.org/1090225
srcspider
8
srcspider, Methode ist erforderlich, und technisch gesehen wird die Aktion je nach Browser standardmäßig auf self gesetzt. Das Format der Antwort erfolgt ausschließlich in CSS. du solltest keine brauchen <br />. Es hängt alles davon ab, wie Sie den Code gestalten
möchten
Warum die JavaScript- (oder CSS-) Tags? Jetzt beginnt der Titel für diese Seite mit javascript - ...
2

Antworten:

105

Ich denke, es liegt an Ihnen, die Semantik zu bestimmen, aber meiner Meinung nach:

Anstelle einer Definitionsliste sollten formularbezogene Eigenschaften verwendet werden.

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

Das "for" -Attribut im <label> -Tag sollte auf das "id" -Attribut eines <input> -Tags verweisen. Wenn Beschriftungen Feldern zugeordnet sind, wird durch Klicken auf die Beschriftung das zugehörige Feld scharfgestellt.

Sie können auch Tags wie <fieldset> verwenden, um Abschnitte eines Formulars zu gruppieren, und <legend>, um eine Feldmenge zu beschriften.

sjstrutt
quelle
26
Sie können die Eingabe auch in das Etikett
einfügen
17
+1 für die einzige Person, die den logischen Weg vorschlägt, dies zu tun. Eine "Tabelle" ist im Allgemeinen aus Layout-Sicht nicht semantisch genau oder sehr flexibel. Eine "Definitionsliste" ist näher, aber immer noch ein Stück weit. Aber "Eingaben" und "Labels"? Genau das sind die Dinge!
Chuck
4
Für viele Formulare halte ich eine Tabelle für semantisch angemessen. Nicht in allen Fällen. Und wie Chuck sagte, sind Tabellen aus Layout-Sicht nicht sehr flexibel. Wenn Sie Tabellen für Ihr Formular verwenden möchten, stellen Sie sicher, dass es semantisch angemessen ist, und verwenden Sie auch Beschriftungen.
Sjstrutt
5
nickf: Ja, aber es ist flexibler, sie nicht zu verschachteln, da Sie dann label {display: block;} verwenden können, um Beschriftungen über Feldern zu erhalten, oder label {clear: both; float: left; width: 300px;} to Holen Sie sich einen tabellarischen Blick.
Svinto
1
svinto: Ihr zweites Beispiel ist der Ansatz, den ich normalerweise verwende. Das Problem ist, dass Sie in der Breite Ihrer Etiketten begrenzt sind. Das Hinzufügen eines langen Etiketts oder das Erhöhen der Textgröße kann zu unerwünschten Ergebnissen führen, und hier ist die Tabellenlösung tatsächlich flexibler.
Jeroen
48

Ich habe die in diesem Artikel beschriebene Technik mehrmals erfolgreich angewendet .

Ich stimme sjstrutt zu, dass Sie formularbezogene Tags wie labelund formin Ihren Formularen verwenden sollten, aber dem in seinem Beispiel beschriebenen HTML-Code fehlt häufig Code, den Sie als "Hooks" für die Gestaltung Ihres Formulars mit CSS verwenden können.

Infolgedessen markiere ich meine Formulare folgendermaßen:

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

Dieser Ansatz hinterlässt mir einen verständlichen Satz von Tags, der genügend Hooks enthält, um die Formulare auf viele verschiedene Arten zu gestalten.

Hauge
quelle
2
Das einzige Problem, das ich bei diesem Ansatz festgestellt habe, ist, dass Sie manchmal Inhalte zwischen zwei Formularelementen einfügen müssen, die sich auch nicht darauf beziehen. Semantisch sollten Sie die ungeordnete Liste schließen und erneut starten. Dann haben Sie möglicherweise eine Liste, die nur aus einem untergeordneten Element besteht.
Alex
und was ist mit der Checkbox-Liste, wo wirst du sie ablegen?
Sasha
@msony in einem <li>, genau wie die anderen Eingänge.
DaveD
4
Huh? Wenn Sie Hooks benötigen, verwenden Sie divs. Dafür sind sie da. Die Semantik ist großartig (und sollte verwendet werden!), Aber wenn Sie einen Anker für einen Stil benötigen, verwenden Sie am besten eine Spanne oder ein Div, das keine semantische Bedeutung hat. Ein div ist eine Box und soll als solche verwendet werden.
jedd.ahyoung
1
Wenn ich meine Formulare als eine Sammlung von Feldsätzen mit Legenden betrachte, die jeweils eine Liste von Eingabefeldern mit oder ohne Beschriftungen enthalten, würde das obige HTML dann keine perfekte semantische Bedeutung haben. Außerdem hat es den zusätzlichen Vorteil, dass keine zusätzlichen Klassennamen für die Formatierung erforderlich sind.
Hauge
23

Dies ist eine Teilmenge des Problems Semantik vs. Formatierung. Eine Definitionsliste sagt, was sie sind, eine Liste verwandter Schlüssel- / Wertattribute, sagt aber nicht, wie sie angezeigt werden sollen. Eine Tabelle enthält mehr Informationen zum Layout und zur Anzeige der Daten als zu den darin enthaltenen Daten. Es schränkt ein, wie die Liste formatiert werden kann, indem sowohl das Format als auch das Format zu wenig angegeben werden.

In der Vergangenheit hat HTML die Semantik mit der Formatierung verwechselt. Schriftarten und Tabellen sind die schlechtesten Beispiele. Die Umstellung auf CSS für die Formatierung und das Entfernen vieler reiner Formatierungs-Tags aus XHTML stellt die Trennung von Bedeutung und Formatierung wieder her. Durch die Trennung der Formatierung in CSS können Sie denselben HTML-Code auf viele verschiedene Arten anzeigen, um ihn für einen breiten Browser, einen kleinen mobilen Browser, Drucken, einfachen Text usw. neu zu formatieren.

Besuchen Sie zur Erleuchtung den CSS Zen Garden .

Schwern
quelle
Ich würde hinzufügen, dass es Absicht, Beziehung hinzufügt. Später könnte eine Suchmaschine diese Seite nutzen und den obigen Code entdecken und wissen, dass alles damit zusammenhängt.
Chuck Conway
1
Das Seltsame dlan mir ist, dass es auf der Reihenfolge der Tags beruht, um die Beziehung zwischen einem Begriff und seinen Definitionen zu vermitteln.
ehdv
15

In diesem Fall, Etiketten und Eingänge sind Ihre semantische Bedeutung und sie stehen auf eigene Faust.

Stellen Sie sich vor, Sie müssten die Webseite einer blinden Person vorlesen. Sie würden nicht sagen "Okay, ich habe hier eine Liste von Definitionen . Der erste Begriff ist 'Name'." Stattdessen würden Sie wahrscheinlich sagen: "Okay, wir haben hier ein Formular und es sieht so aus, als gäbe es eine Reihe von Feldern . Die erste Eingabe trägt die Bezeichnung " Name "."

Deshalb ist das Semantic Web wichtig. Dadurch kann sich der Inhalt der Seite sowohl für den Menschen als auch für die Technologie genau darstellen. Zum Beispiel gibt es viele Browser- Plugins , mit denen Benutzer Webformulare schnell mit ihren Standardinformationen (Name, Telefonnummer usw.) ausfüllen können. Diese funktionieren selten gut, wenn Eingaben keine Beschriftungen zugeordnet sind.

Hoffentlich hilft das.

Jeremy Ricketts
quelle
15

Unter Verwendung dl dt, ddfür Formulare ist nur ein weiterer Weg , um Ihre Formen zu strukturieren, zusammen mit ul li, divund table. Sie können immer ein labelin setzen dt. Auf diese Weise behalten Sie das formularspezifische Element labelbei.

<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.
quelle
9
Ihr Beispiel widerspricht der Spezifikation, da Ihre Senden-Schaltfläche zum Kennwort dt gehört. Sie haben mehrere dds, die zu einem einzelnen dt gehören, was Sie hier tun. Ich würde die Senden-Schaltfläche vollständig unter die dl setzen, da die dl nur für Name-Wert-Gruppen gedacht ist - nicht für Elemente, die wie eine Senden-Schaltfläche für sich stehen.
jedmao
6
Ich denke nicht, dass es gegen die Spezifikation ist. Möglicherweise haben Sie so viele Beschreibungen pro Begriff, wie Sie möchten (und umgekehrt). W3.org/TR/html401/struct/lists.html#h-10.3 Sie haben jedoch Recht, die Schaltfläche zum Senden sollte aus der Kennwortdefinition entfernt werden.
ak.
einreichen muss einfach nicht auf der dl sein. Es ist kein Eingabeelement (semantisch), sondern ein Aktionselement.
Redben
1
Toll! Das ist die flexibelste und standardkonformste Lösung. Es ist wirklich schwierig, ein Formular nur mit Beschriftungen und Eingaben zu gestalten, aber mit <dl> ist es viel einfacher.
Eduardo Cobuci
@Eduardo Cobuci: +1 Dies ist in der Tat der bisher beste Ansatz. Semantisch fast in Ordnung, und wir können es besser stylen. Ich kann auch ein Fieldset-Element hinzufügen.
MEM
14

Definitionslisten haben semantische Bedeutung. Sie dienen zur Auflistung von Begriffen (<dt>) und den zugehörigen Definitionen (<dd>). Daher stellt in diesem Fall ein <dl> die semantische Bedeutung des Inhalts genauer dar als eine Tabelle.

Bret
quelle
1
Oder weniger, da die meisten Formulare nicht nach Definitionen von Begriffen fragen (während Tabellen generische Tupelbeziehungen sind).
Quentin
4
Ich stimme dir nicht zu David, wenn ein Formular eine Eingabe hat, die du mit deinem Vornamen ausfüllen kannst, fragt es "Was ist dein Vorname?", Also ist "Definiere deinen Vornamen" vollständig gültig, also dt> Vorname dd> dein Eingang. Natürlich hat die Definition einen Kontext, Sie.
Redben
9
Richtig verwendet inputund labelTags sind bereits eindeutig, und das Einschließen in eine Definitionsliste ist bestenfalls eine Tautologie. Wie ist der Ausdruck "semantische Bedeutung" :)
Ian Mackinnon
@ IanMackinnon stimmte dem ersten Teil zu, aber "semantische Bedeutung" bezieht sich speziell auf die Bedeutung außerhalb der Elemente selbst (was eher der "wörtlichen Bedeutung" entspricht)
Izkata
6

Definitionslisten werden fast nie verwendet, da sie semantisch gesehen selten im Internet angezeigt werden.

In Ihrem Fall wurde der richtige Code veröffentlicht:

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

Sie erstellen ein Formular mit Eingaben und Beschriftungen für diese Eingaben, Sie erstellen keine Liste von Wörtern und definieren sie.

Wenn Sie einen Hilfeabschnitt ausführen, sind Definitionslisten geeignet, z.

<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
quelle
Begriff: Vorname Definition: Bitte geben Sie einen in der dafür vorgesehenen Box an.
J Wynia
Es tut uns leid. Wenn Sie sich den Begriff (das dt) als Dinge wie "Vorname", "Nachname" usw. vorstellen, kann die Definition (das dd) als vom Benutzer angegeben angesehen werden.
J Wynia
4

Ein Grund für die Verwendung von <dl> zum Markieren des Formulars ist, dass es viel einfacher ist, ausgefallene CSS-Layout-Tricks mit einem <dl> als mit einer <table> auszuführen. Der andere Teil ist, dass es die Semantik des Formulars (eine Liste von Beschriftungs- / Feldpaaren) besser widerspiegelt als eine Tabelle.

Ok, Tischhass ist auch ein Teil davon.

Theran
quelle
2

Manchmal präsentiert eine Definitionsliste die Informationen einfach so, wie es gewünscht wird, während eine Tabelle dies nicht tut. Persönlich würde ich wahrscheinlich keine Definitionsliste für ein Formular verwenden, es sei denn, sie passt zum Stil der Site.

staticsan
quelle
2

Praktisch alle Formulare sind tabellarisch. Sehen Sie jemals ein Formular, das nicht tabellarisch ist? In den Richtlinien, die ich gelesen habe, wurde vorgeschlagen, das Tabellen-Tag für die tabellarische Darstellung zu verwenden. Genau dafür sind Formulare, Kalender und Tabellen gedacht. Und jetzt verwenden sie DD und DT anstelle von Tabellen? Wofür kommt das Web?! :) :)

netrox
quelle
7
Ich denke, es ist ein Beispiel für Tischphobie;) Ich habe tabellarische Daten gesehen, die aus verschachtelten Daten bestehen <ul>und <ol>mit Tonnen von CSS gestaltet sind, nur weil Tabellen böse sind .
el.pescado
1
oder weil <ul> und <ol> in der Regel viel flexibler sind, wenn es darum geht, das Layout zu gestalten und neu anzuordnen, ohne die HTML-Struktur zu ändern.
Sean
0

Tabellenlistendaten sehen folgendermaßen aus:

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

Und Sie können DL-, DT- und DD-Tags-Listendaten wie folgt verwenden:

<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
quelle
3
Vielen Dank für den Link, aber es wäre besser, den Code auch hier einzufügen, da der Link möglicherweise zu einem bestimmten Zeitpunkt abläuft. Übrigens, das Beispiel übertreibt den Unterschied, weil sie <th/>Elemente für die Beschriftungen hätten verwenden können ...
2