Semantik und Struktur von Name-Wert-Paaren

77

Mit dieser Frage habe ich schon eine Weile zu kämpfen. Was ist der richtige Weg, um Name / Wert-Paare zu markieren?

Ich mag das <dl> -Element sehr, aber es stellt ein Problem dar: Es gibt keine Möglichkeit, ein Paar von einem anderen zu trennen - sie haben keinen eindeutigen Container. Visuell fehlt dem Code die Definition. Semantisch denke ich jedoch, dass dies das richtige Markup ist.

<dl>
    <dt>Name</dt>
    <dd>Value</dd>
    <dt>Name</dt>
    <dd>Value</dd>
</dl>

Im obigen Code ist es schwierig, die Paare visuell richtig zu versetzen, sowohl im Code als auch gerendert. Wenn ich zum Beispiel nur eine Grenze um jedes Paar haben wollte, wäre das ein Problem.

Wir können auf Tabellen zeigen. Es könnte argumentiert werden, dass Name-Wert-Paare tabellarische Daten sind. Das scheint mir falsch, aber ich sehe das Argument. Der HTML-Code unterscheidet den Namen jedoch nicht vom Wert, außer an der Position oder durch Hinzufügen von Klassennamen.

<table>
    <tr>
        <td>Name</td>
        <td>Value</td>
    </tr>
    <tr>
        <td>Name</td>
        <td>Value</td>
    </tr>
</table>

Dies ist vom visuellen Standpunkt aus viel sinnvoller, sowohl im Code als auch im CSS. Das Styling des oben genannten Randes ist trivial. Wie oben erwähnt, ist die Semantik jedoch bestenfalls unscharf.

Gedanken, Kommentare, Fragen?

Bearbeiten / Aktualisieren Vielleicht hätte ich dies in Bezug auf die Struktur explizit erwähnen sollen, aber eine Definitionsliste hat auch das Problem, die Paare nicht semantisch zu gruppieren. Die Reihenfolge und implizite Grenze zwischen a ddund a dtist leicht zu verstehen, aber sie fühlen sich für mich immer noch etwas unangenehm an.

Ryan Kinal
quelle
Betreff: Ihre Bearbeitung / Aktualisierung - Wenn Sie unbedingt sicherstellen möchten, dass die semantischen Beziehungen zwischen Knoten nicht mehrdeutig sind, können Sie immer sehr ausführlich werden und <dt id = "key1"> Name </ dt> <dd about = "# eingeben. key1 "> Wert 1 </ dd> <dd about =" # key1 "> Wert 2 </ dd>, aber einige würden diesen Overkill nennen. ;)
Lucideer
Sie sollten auch nach dem CSS fragen. ZB <dl>wäre nicht so schlimm, aber es ist schwer zu
stylen
Es gab viele gute Antworten, besonders auf der Codeseite, aber ich zögere immer noch etwas über fast alle. Dies liegt nur daran, dass jede Lösung ein Geben und Nehmen ist. Ich werde bald eine der aktuellen Antworten als die beste für diesen Thread markieren, aber ich weiß, dass es eine schwierige Entscheidung ist.
Ryan Kinal
@Danny Lin's war derjenige! Semantik und Stil mit Leichtigkeit dank der verbesserten Spezifikation! stackoverflow.com/a/50313363/792888
EvilDr

Antworten:

57

Danke für diese interessante Frage. Hier sind noch einige Dinge zu beachten.

Was ist ein Paar? Zwei Elemente zusammen. Dafür brauchen wir ein Tag. Nehmen wir an, es ist ein pairTag.

 <pair></pair>

Das Paar enthält den Schlüssel und den entsprechenden Wert:

 <pair><key>keyname</key><value>value</value></pair>

Dann müssen wir die Paare auflisten:

<pairlist>
     <pair><key>keyname</key><value>value</value></pair>
     <pair><key>keyname</key><value>value</value></pair>
</pairlist>

Als nächstes ist die Anzeige der Paare zu berücksichtigen. Das übliche Layout ist das tabellarische:

key value
key value

und das optionale Trennzeichen, das normalerweise Doppelpunkt ist:

key : value
key : value

Die Doppelpunkte können einfach über CSS hinzugefügt werden, aber dies funktioniert im IE sicherlich nicht.

Der oben beschriebene Fall ist der ideale. Es gibt jedoch kein gültiges HTML-Markup, das problemlos in dieses passt.


Um zusammenzufassen:

dlist semantisch am nächsten, für einfache Fälle von Schlüssel und Wert, aber es ist schwierig, visuelle Stile anzuwenden (z. B. um die Paare inline anzuzeigen oder nur dem schwebenden Paar einen roten Rand hinzuzufügen). Der Fall, der am besten passt, dlist das Glossar. Dies ist jedoch nicht der Fall, den wir diskutieren.

Die einzige Alternative, die ich in diesem Fall sehen kann, ist folgende table:

<table summary="This are the key and value pairs">
    <caption>Some notes about semantics</caption>
    <thead class="aural if not needed">
        <tr><th scope="col">keys</th><th scope="col">values</th></tr>
    </thead>
    <tbody class="group1">  
        <tr><th scope="row">key1</th><td>value1</td></tr>
        <tr><th scope="row">key2</th><td>value2</td></tr>
    </tbody>
    <tbody class="group2">
        <tr><th scope="row">key3</th><td>value3</td></tr>
        <tr><th scope="row">key4</th><td>value4</td></tr>
    </tbody>
</table>

Einer noch:

<ul>
  <li><strong>key</strong> value</li>
  <li><strong>key</strong> value</li>
</ul>

oder:

<ul>
  <li><b>key</b> value</li>
  <li><b>key</b> value</li>
</ul>

oder wenn die Schlüssel verknüpft sein können:

<ul>
  <li><a href="/key1">key1</a> value</li>
  <li><a href="/key2">key1</a> value</li>
</ul>

Die Schlüssel- und Wertepaare werden normalerweise in einer Datenbank gespeichert, und diese speichern normalerweise tabellarische Daten, sodass die Tabelle meiner Meinung nach am besten passt.

Was denken Sie?

Takeshin
quelle
4
Sehr gründliche Antwort. Mir gefällt, wie Sie Ihre Gedanken gezeigt haben. +1
Ryan Kinal
und was ist mit so etwas: <ul> <li><div class="key">key</div><div class="value">value</div></li> </ul>mit dem wir beliebige Schlüssel und Werte haben können (ein Wert könnte eine andere Liste, ein Bild usw. sein)
Enrique
Für die Tabellenlösung können Sie möglicherweise auch das <col class="key"/>Tag verwenden. Wie auch immer, ich denke, die Tabellenlösung ist nicht gut. Was passiert, wenn wir den Schlüssel und den Wert in verschiedenen Zeilen anzeigen können?
Enrique
2
Ich glaube ( na ja , fast wissen ) <strong>sollte durch <b>gemäß der HTML5-Semantik ersetzt werden.
Andreas Rejbrand
1
Diese Frage steht bei Google ganz oben. Könnten Sie bitte erwägen, Ihre Antwort zu aktualisieren, um die Eingabe von @Danny Lin bezüglich der Verwendung von divs in widerzuspiegeln dl? Dies löst das Problem der Semantik und des Stils und vermeidet so das Rauschen von <b>und <strong>: stackoverflow.com/a/50313363/792888
EvilDr
21

Im Anschluss an die Spezifikation (und weitere Informationen ) zur Verfügung gestellt von Alexandr Antonov: Verwendung dl, dt, ddund gegebenenfallsdiv .

Eine Kombination von dl, dt, und ddist gut für semantisch Schlüsselwertpaare:

<dl>
    <dt>Key1</dt>
    <dd>Value1</dd>
    <dt>Key2</dt>
    <dd>Value2</dd>
</dl>

Zur einfacheren Gestaltung oder Analyse können divs als untergeordnete Elemente verwendet werden, dlum die Schlüssel-Wert-Paare zu gruppieren (und machen dtund ddEnkelkinder von dl):

dl { display: table; }
dl > div { display: table-row; }
dl > div > dt, dl > div > dd { display: table-cell; border: 1px solid black; padding: 0.25em; }
dl > div > dt { font-weight: bold; }
<dl>
  <div>
    <dt>Key1</dt>
    <dd>Value1</dd>
  </div>
  <div>
    <dt>Key2</dt>
    <dd>Value2</dd>
  </div>
</dl>

Danny Lin
quelle
Hervorragende Antwort, und IMHO sollte als Antwort akzeptiert werden, insbesondere angesichts des Beispiels in der Spezifikation, das perfekt zu dieser Frage passt. CSS Grid wäre auch eine erstaunliche Möglichkeit, dies einfach und effektiv zu formatieren.
EvilDr
12

XHTML 2 bietet die Möglichkeit, Begriffe und Definitionen mithilfe des diElements zu gruppieren

<!-- Do not us this code! -->
<dl>
    <di>
        <dt>Name</dt>
        <dd>John</dd>
    </di>
    <di>
        <dt>Age</dt>
        <dd>25</dd>
    </di>
</dl>

X / HTML 5 vs XHTML 2> Erweiterung der Definitionslisten

Leider ist XHTML 2 tot und HTML5 hat kein diElement

Sie können also kombinieren ul > limit dl > dt + dd:

<ul>    
    <li>
        <dl>
            <dt>Name</dt>
            <dd>John</dd>
        </dl>
    </li>
    <li>
        <dl>
            <dt>Age</dt>
            <dd>25</dd>
        </dl>
    </li>
</ul>
Yukulélé
quelle
7
Oh Mann. Beeindruckend. Ich möchte das <di>Element. Ich will es jetzt. Schade, dass ich es nicht haben kann. Danke für die Info!
Ryan Kinal
2
Laut Spezifikation divübernimmt die Rolle von di. Siehe meine Antwort für Details.
Danny Lin
6

Ich denke, eine Definitionsliste ist wahrscheinlich eine schlechte Idee. Semantisch werden sie für Definitionen verwendet. Andere Schlüsselwertlisten unterscheiden sich häufig von Definitionstiteln und Beschreibungen.

A tableist ein Weg, aber was ist mit einer ungeordneten Liste?

<ul>
    <li class="key-value-pair">
        <span class="key">foo</span>
        <span class="value">bar</span>
    </li>
</ul>
gpmcadam
quelle
2
Definitionslisten mögen in dieser Hinsicht etwas schlecht benannt sein, aber sie sind nicht nur für Definitionen gedacht (sie wären von relativ begrenztem Anwendungsfall, wenn sie es wären) - die W3C-Spezifikation. Das definiert sie tatsächlich ein Beispiel für die Verwendung von ihnen zum Markieren eines Dialogs.
Lucideer
Wenn ich objektorientiert darüber nachdenke, suche ich vermutlich "eine ungeordnete Liste von Name-Wert-Paaren", bin mir aber nicht sicher, ob dies (vorerst) die beste Antwort ist. +1
Ryan Kinal
1
Dies ist eine Art Mikroformat-Ansatz, aber in Standard-Browser-Rendering oder Screenreader erhalten Sie foo bar, wie foo barohne Tags überhaupt. Eine der Spannweiten muss mehr als eine Spannweite betragen. Vielleicht <strong>? Dann wird der zweite nicht benötigt.
Takeshin
3
In der aktuellen HTML5-Spezifikation wurde dl als Beschreibungsliste umbenannt, wodurch die Verwendung hier korrekter erscheint.
Eric Bock
3

Dies ist nicht meine bevorzugte Lösung, aber es ist ein kluger Missbrauch des semantischen Elements:

Verwenden Sie ein neues <dl>pro <dt>/ <dd>Paar:

<div class="terms">
    <dl><dt>Name 1</dt><dd>Value 1</dd></dl>
    <dl><dt>Name 2</dt><dd>Value 2</dd></dl>
</div>

Ein Beispiel mit CSS-Floats und rotem Rand beim Schweben:

dt:after { content:":"; }
dt, dd { float: left; }
dd { margin-left: 5px }
dl { float: left; margin-left: 20px; border: 1px dashed transparent; }
dl:hover { border-color: red; }
<div class="terms">
    <dl>
        <dt>Name 1</dt>
        <dd>Value 1</dd>
    </dl><!-- etc -->
    <dl><dt>Name 2</dt><dd>Value 2</dd></dl>
    <dl><dt>Name 3</dt><dd>Value 3</dd></dl>
    <dl><dt>Name 4</dt><dd>Value 4</dd></dl>
    <dl><dt>Name 5</dt><dd>Value 5</dd></dl>
    <dl><dt>Name 6</dt><dd>Value 6</dd></dl>
</div>

Iiridayn
quelle
Interessant. Dies würde funktionieren, wenn es nicht erforderlich wäre, eine Liste verwandter Elemente zu erstellen ... obwohl ich vermute, dass jeweils <dl>eines in einem<li>
Armstrongest
3

dl {
  display: grid;
  grid-template-columns: auto auto;
}

dd {
  margin: 0
}
<dl>
  <dt>key</dt>
  <dd>value</dd>
  <dt>key</dt>
  <dd>value</dd>
</dl>

Ich habe <dl> <dt> <dd>sie mit Gitter verwendet und gestylt

Michiel Bruggenwirth
quelle
2

Es ist schwierig, die Paare visuell richtig zu versetzen, sowohl im Code als auch gerendert. Wenn ich zum Beispiel nur eine Grenze um jedes Paar haben wollte, wäre das ein Problem.

Andere vor mir haben sich (ich denke ziemlich gut) mit dem Problem der visuellen Definition im Code befasst. Damit bleibt das Problem von Rendering und CSS. Dies kann in den meisten Fällen sehr effektiv durchgeführt werden. Die größte Ausnahme ist das Platzieren eines Rahmens um jeden Satz von dt / dds, was zugegebenermaßen äußerst schwierig ist - möglicherweise unmöglich, zuverlässig zu stylen.

Du könntest es tun:

dt,dd{ border:solid; }
dt{ margin:10px 0 0 0; border-width:1px 1px 0 1px; }
dd{ margin:0 0 10px 0; border-width:0 1px 1px 1px; padding:0 0 0 10px; }
dd::before{ content:'→ '; }

Was für Schlüsselwert-PAARE funktioniert, aber Probleme aufwirft, wenn Sie mehrere dds innerhalb eines "Satzes" haben, wie:

<dt>Key1</dt>
  <dd>Val1.1</dd>
  <dd>Val1.2</dd>
<dt>Key2</dt>
  <dd>Val2.1</dd>
  <dd>Val2.2</dd>

Abgesehen von Einschränkungen beim Rahmenstil ist es mit CSS durchaus möglich, alles andere zu tun, um Sätze (Hintergründe, Nummerierungen usw.) zuzuordnen. Hier gibt es eine schöne Übersicht: http://www.maxdesign.com.au/articles/definition/


Ein weiterer Punkt, den ich für erwähnenswert halte, wenn Sie Definitionslisten optimal gestalten möchten, um eine visuelle Trennung zu ermöglichen - die automatischen Nummerierungsfunktionen ( counter-incrementund counter-reset) von CSS können sehr nützlich sein: http://www.w3.org/TR/ CSS2 / generate.html # Zähler

lucideer
quelle
2

Natürlich können Sie auch benutzerdefinierte HTML-Elemente verwenden . ( spec ) Sie sind vollständig gültiges HTML5.

Leider ist die Browserunterstützung nicht so gut, aber wenn es uns selten um Dinge wie die Browserunterstützung geht, wenn es um Semantik geht. :-)

Eine solche Art, wie Sie es darstellen könnten:

Nachdem Sie Ihr brandneues ausgefallenes Element wie folgt registriert haben:

var XKey = document.registerElement('x-key');
document.body.appendChild(new XKey());

Sie schreiben Markup wie folgt:

<ul>
  <li>
    <x-key>Name</x-key>
    Value
  </li>
</ul>

Die einzige Bedingung für benutzerdefinierte HTML-Elemente ist, dass sie einen Bindestrich benötigen. Natürlich können Sie jetzt super kreativ sein ... wenn Sie ein Autoteile-Lager mit Teilelisten und Seriennummern bauen:

<ul>
  <li>
    <auto-part>
      <serial-number>AQ12345</serial-number>
      <short-description>lorem ipsum dolor...</short-description>
      <list-price>14</list-price>
    </auto-part>
  </li>
</ul>

Viel semantischer kann man nicht sein!

Es besteht jedoch die Möglichkeit, dass ich zu weit gegangen bin semantic-shangri-la-la(ein realer Ort) und möglicherweise versucht bin , ihn auf etwas Allgemeineres zu reduzieren:

<ul>
  <li class='auto-part' data-serial-number="AQ12345">
      <p class='short-description'>lorem ipsum dolor...</p>
      <p class='list-price'>14</p>
  </li>
</ul>

Oder vielleicht das (wenn ich den Schlüssel visuell stylen und zeigen musste)

<ul>
  <li class='auto-part'>
      <x-key>AQ12345<//x-key>
      <p class='short-description'>lorem ipsum dolor...</p>
      <p class='list-price'>14</p>
  </li>
</ul>
Armstrongest
quelle
Sehr interessant. Ich werde das vielleicht das nächste Mal untersuchen, wenn ich Paare brauche.
Ryan Kinal
1

Hmm. dt/ ddSound am besten für diesen und es ist möglich , sie visuell zu kompensieren, obwohl ich es ist schwieriger als für einen Tisch tun zustimmen.

Wie wäre es mit einer Lesbarkeit des Quellcodes in einer Zeile?

<dl>
    <dt>Name</dt> <dd>Value</dd>
    <dt>Name</dt> <dd>Value</dd>
</dl>

Ich bin damit einverstanden, dass es nicht 100% perfekt ist, aber da Sie Leerzeichen zum Einrücken verwenden können:

<dl>
    <dt>Property with a looooooooooong name</dt>   <dd>Value</dd>
    <dt>Property with a shrt name</dt>             <dd>Value</dd>
</dl>

es könnte der schönste Weg sein.

Unicron
quelle
Das Problem ist, dass a unter der Spezifikation dtmehr als eine haben ddkann, die sein kann oder nicht, was gewünscht wird.
Armstrongest
1

Mit Ausnahme des <dl>Elements haben Sie so ziemlich alle Optionen von HTML zusammengefasst: begrenzte.

Sie sind jedoch nicht verloren, es bleibt nur eine Option: Verwenden einer Auszeichnungssprache, die in HTML übersetzt werden kann. Eine sehr gute Option ist Markdown.

Mit einer Tabellenerweiterung, die einige Markdown-Engines bereitstellen, können Sie folgenden Code haben:

| Table header 1 | Table header 2 |
-----------------------------------
| some key       | some value     |
| another key    | another value  |

Dies bedeutet, dass Sie einen Build-Schritt benötigen, um den Markdown natürlich in HTML zu übersetzen.

Auf diese Weise erhalten Sie ein aussagekräftiges Markup (Tabelle für Tabellendaten) und wartbaren Code.

Florian Margaine
quelle
1
Sie haben also wieder einen Tisch, aber es ist mehr Arbeit, dorthin zu gelangen. Dies scheint überhaupt keine Probleme zu lösen.
Pydsigner
0

Wie wäre es einfach eine Leerzeile zwischen jedem Paar zu setzen?

Dies erfordert keine spezielle Behandlung für lange Werte.

<dl> 
    <dt>Name</dt> 
    <dd>Value</dd> 

    <dt>Name</dt> 
    <dd>Value</dd> 

    <dt>Name</dt> 
    <dd>Value</dd> 
</dl> 
Philip Smith
quelle
Leerzeichen haben in HTML keine semantische Bedeutung. 1 Raum oder mehrere Räume, Wagenrücklauf CR, tabund Zeilenvorschübe LFübersetzen , im wesentlichen alle in einen Raum. Es ist vielleicht optisch ansprechender für einen Menschen, der den Code liest, aber es vermittelt keine semantische Bedeutung.
Armstrongest
0

Was ist mit Listen?

Bestellt:

<ol>
  <li title="key" value="index">value</li></ol>

Oder verwenden Sie <ul>für eine ungeordnete Liste und überspringen Sie das value="index"Bit.

Dave Sag
quelle
0

Die Zeile von spec :

Namenswertgruppen können Begriffe und Definitionen, Metadatenthemen und -werte, Fragen und Antworten oder andere Gruppen von Namenswertdaten sein .

Ich gehe davon aus, dass Elemente verwendet werden <dl>, <dt>und <dd>.

Alexandr Antonov
quelle
2
Vielen Dank für den Link zur Spezifikation. Ja, die Spezifikation erlaubt Name-Wert-Paare, aber die dlvisuelle Anzeige des Elements kann schwierig sein, da für jedes key/ valuePaar kein Container vorhanden ist . Die ursprüngliche Verwendung war wahrscheinlich für die Auflistung von Glossarelementen oder Wörterbucheinträgen mit 1 Begriff und mehreren Definitionen.
Armstrongest
-1

Ich mag die Idee von Unicron, sie alle in eine Zeile zu setzen, aber eine andere Möglichkeit wäre, den Wert unter dem Definitionsnamen einzurücken:

<dl>
    <dt>Name</dt>
       <dd>Value</dd>
    <dt>Name</dt>
       <dd>Value</dd>
</dl>

Dieser Weg könnte bei lächerlich langen Definitionen etwas augenschonender sein (obwohl, wenn Sie lächerlich falsche Definitionen verwenden, eine Definitionsliste vielleicht doch nicht das ist, was Sie wirklich wollen).

Was das Rendern auf dem Bildschirm betrifft, ist ein fetter unterer Rand, der auf das dd angewendet wird, eine ausreichende visuelle Trennung.

Hollsk
quelle