Por que usar tags de listas de definição (DL, DD, DT) para formulários HTML em vez de tabelas?


86

Eu encontrei alguns exemplos recentemente que fazem coisas 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 fazer formulários HTML. Por que é que? Qual é a vantagem de usar tabelas?


5
A resposta que você selecionou é uma marcação completamente inválida: faltando "ação", "método" no formulário, você não pode colocar lebel e entrada assim. O exemplo também será mostrado em uma linha, pois não há tags <br> (o que provavelmente não é a intenção). O código, além de ser inválido, também é uma sopa de código no que diz respeito à semântica. Uma lista de definições e uma tabela são semanticamente equivalentes, neste caso. A diferença está na quantidade de código, dl é muito mais curto: pastie.org/1090219 enquanto com a tabela você precisa de vários para funcionar, é estranho: pastie.org/1090229 (continuação ...)
srcspider

1
Se você não se importa com a semântica, veja
srcspider

8
srcspider, o método é necessário e, tecnicamente, dependendo do navegador, a ação será definida como self. O formato da resposta é todo feito em CSS. você não deve precisar de nenhum <br />. Tudo depende de como você deseja
definir

Por que as tags JavaScript (ou CSS)? Agora, o título desta página começa com javascript - ...
ᴠɪɴᴄᴇɴᴛ

Respostas:


105

Acho que depende de você determinar a semântica, mas na minha opinião:

Em vez de uma lista de definições, as propriedades relacionadas ao formulário devem ser usadas.

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

O atributo "for" na tag <label> deve fazer referência ao atributo "id" de uma tag <input>. Observe que quando os rótulos são associados a campos, clicar no rótulo colocará o campo associado em foco.

Você também pode usar tags como <fieldset> para agrupar seções de um formulário e <legend> para legendar um fieldset.


26
Você também pode colocar a entrada dentro do rótulo
nickf

17
+1 por ser a única pessoa a sugerir a maneira lógica de fazer isso. Uma "tabela" geralmente não é semanticamente precisa ou muito flexível do ponto de vista do layout. Uma "lista de definições" está mais perto, mas ainda um pouco forçada. Mas "entradas" e "rótulos"? Isso é exatamente o que as coisas são!
Chuck

4
Para muitos formulários, acredito que uma tabela / pode / ser semanticamente apropriada. Porém, não em todos os casos. E, como disse Chuck, as tabelas não são muito flexíveis do ponto de vista do layout. Se você for usar tabelas para o seu formulário, certifique-se de que seja semanticamente apropriado e use rótulos também.
sjstrutt

5
nickf: Sim, mas é mais flexível não aninhá-los, porque você pode então fazer label {display: block;} para obter rótulos acima dos campos ou label {clear: both; float: left; width: 300px;} para obter uma aparência tabular.
svinto

1
svinto: seu segundo exemplo é a abordagem que uso normalmente. O problema é que você está limitado na largura de suas etiquetas; adicionar um rótulo longo ou aumentar o tamanho do texto pode levar a resultados indesejados e é aí que a solução da tabela é realmente mais flexível.
jeroen

48

Usei várias vezes com sucesso a técnica descrita neste artigo .

Concordo com sjstrutt que você deve usar tags relacionadas a formulários como labele formem seus formulários, mas o HTML delineado em seu exemplo, muitas vezes, não terá algum código que você possa usar como "ganchos" para estilizar seu formulário com CSS.

Como consequência disso, eu marco meus formulários assim:

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

Essa abordagem me deixa com um conjunto compreensível de tags, que contém ganchos suficientes para estilizar os formulários de várias maneiras diferentes.


2
O único problema que encontrei com essa abordagem é que às vezes você precisa colocar conteúdo entre 2 elementos de formulário que não se relacionam com nenhum dos dois. Semanticamente, você deve fechar a lista não ordenada e começar novamente, mas então você pode ter uma lista consistindo em apenas um elemento filho.
alex

e a lista de caixas de seleção, onde você vai colocá-la?
Sasha

@msony dentro de um <li>, assim como as outras entradas.
DaveD,

4
Hã? Se você precisar de ganchos, use divs. É para isso que servem. A semântica é ótima (e deve ser usada!), Mas quando você precisa de uma âncora para um estilo, é melhor usar um intervalo ou um div que não tenha significado semântico. Um div é uma caixa e deve ser usado como tal.
jedd.ahyoung

1
Se eu pensar em meus formulários como uma coleção de conjuntos de campos com legendas, cada um contendo uma lista de campos de entrada com ou sem rótulos, o html acima não teria um significado semântico perfeito então. Além disso, tem um bônus adicional de não exigir nomes de classe extras para formatação.
Hauge,

23

Este é um subconjunto da questão de semântica versus formatação. Uma lista de definições diz o que são, uma lista de atributos de chave / valor relacionados, mas não diz como exibi-la. Uma tabela diz mais sobre o layout e como exibir os dados do que os dados dentro dela. Limita a forma como a lista pode ser formatada, especificando excessivamente o formato e subespecificando o que é.

O HTML, historicamente, confundiu semântica com formatação. Tags de fonte e tabelas são os piores exemplos. A mudança para CSS para a formatação e a remoção de muitas das tags de formatação pura do XHTML restaura, de certa forma, a separação do significado da formatação. Ao separar a formatação em CSS, você pode exibir o mesmo HTML de muitas maneiras diferentes, reformatando-o para um navegador amplo, um navegador móvel pequeno, impressão, texto simples, etc ...

Para obter informações, visite o CSS Zen Garden .


Eu acrescentaria que acrescenta intenção, relacionamento. Mais tarde, um mecanismo de busca pode consumir esta página e descobrir o código acima e saber que está tudo relacionado.
Chuck Conway

1
O estranho dlpara mim é que ele depende da ordem de tags para transmitir a relação entre um termo e suas definições.
ehdv

15

Nesse caso, rótulos e entradas são seu significado semântico e são independentes.

Imagine que você tivesse que ler a página da web para uma pessoa cega. Você não diria "Ok, tenho uma lista de definições aqui. O primeiro termo é 'nome'." Em vez disso, você provavelmente diria "Ok, temos um formulário aqui e parece que há um conjunto de campos , a primeira entrada é rotulada como 'nome'."

É por isso que a web semântica é importante. Ele permite que o conteúdo da página se represente com precisão para os humanos e para a tecnologia. Por exemplo, existem muitos plug-ins de navegador que ajudam as pessoas a preencher rapidamente formulários da web com suas informações padrão (nome, número de telefone, etc). Eles raramente funcionam bem se as entradas não tiverem rótulos associados.

Espero que ajude.


15

Usar dl dt, ddfor forms é apenas outra maneira de estruturar seus formulários, junto com ul li, dive table. Você sempre pode colocar um labelem dt. Dessa forma, você mantém o elemento específico do formulário labelno 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
Seu exemplo vai contra a especificação, já que seu botão de envio pertence à senha dt. Você tem vários dd's pertencentes a um único dt, que é o que você está fazendo aqui. Eu colocaria o botão de envio abaixo do dl inteiramente, porque o dl serve apenas para grupos de nome-valor - não elementos que permanecem por conta própria, como um botão de envio.
jedmao

6
Não acho que seja contra a especificação. Você pode ter quantas descrições por termo desejar (e vice-versa) w3.org/TR/html401/struct/lists.html#h-10.3 Mas você está certo, o botão enviar deve ser retirado da definição de senha.
ak.

enviar apenas não precisa estar na dl. Não é um elemento de entrada (semanticamente), mas um elemento de ação.
redben

1
Ótimo! Essa é a solução mais flexível e compatível com os padrões. É realmente difícil definir o estilo de um formulário usando apenas rótulos e entradas, mas usando <dl> é muito mais fácil.
Eduardo Cobuci

@Eduardo Cobuci: +1 Realmente esta é a melhor abordagem até agora. Semanticamente quase ok, e podemos estilizá-lo de forma mais adequada. Também posso adicionar um elemento fieldset.
MEM

14

As listas de definições têm significado semântico. Eles são para listar termos (<dt>) e suas definições associadas (<dd>). Portanto, neste caso, um <dl> retrata o significado semântico do conteúdo com mais precisão do que uma tabela.


1
Ou menos, já que a maioria dos formulários não pede definições de termos (enquanto as tabelas são relacionamentos de tupla genéricos).
Quentin de

4
Não concordo com você David, quando um formulário tem uma entrada para você preencher com seu primeiro nome, ele está perguntando "Qual é o seu primeiro nome", então "Definir seu nome" é totalmente válido, portanto dt> nome dd> seu entrada. Claro que a definição tem um contexto, você.
redben

9
As tags inpute corretamente usadas labeljá são inequívocas, e envolvê-las em uma lista de definições é, na melhor das hipóteses, uma tautologia. Assim como a frase 'significado semântico' :)
Ian Mackinnon

@IanMackinnon Concordou com a primeira parte, mas "significado semântico" refere-se especificamente ao significado fora do que os próprios elementos são (que é mais na linha de "significado literal")
Izkata

6

As listas de definições quase nunca são usadas porque semanticamente falando, raramente aparecem na Internet.

No seu caso, o código correto foi postado:

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

Você está criando um formulário com entradas e rótulos para as referidas entradas, não está estabelecendo uma lista de palavras e definindo-as.

Se você estiver fazendo algum tipo de seção de ajuda, as listas de definição seriam apropriadas, por exemplo:

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

Termo: Primeiro Nome Definição: Forneça um na caixa fornecida.
J Wynia de

Desculpa. Se você pensar no termo (o dt) como coisas como "Nome", "Sobrenome" etc., a definição (o dd) pode ser vista como fornecida pelo usuário.
J Wynia

4

Parte da razão para usar <dl> para marcar o formulário é que é muito mais fácil fazer truques de layout CSS sofisticados com um <dl> do que com uma <table>. A outra parte é que ele reflete melhor a semântica do formulário (uma lista de pares rótulo / campo) do que uma tabela.

Ok, o ódio à mesa também faz parte disso.


2

Às vezes, uma lista de definições simplesmente apresenta as informações da maneira desejada, enquanto uma tabela não. Pessoalmente, provavelmente não usaria uma lista de definições para um formulário, a menos que ela se adeque ao estilo do site.


2

Praticamente todos os formulários são tabulares. Você já viu um formulário que não seja tabular? As diretrizes que li sugeriram usar a tag de tabela para apresentação tabular e é exatamente para isso que os formulários, calendários e planilhas se destinam. E agora eles estão usando DD e DT em vez de tabelas? Aonde a Web está chegando ?! :)


7
Eu acho que é um exemplo de tablephobia;) Eu vi dados tabulares feitos de aninhados <ul>e <ol>estilizados com toneladas de CSS apenas porque tabelas são ruins .
el.pescado de

1
ou, porque <ul> e <ol> são normalmente muito mais flexíveis em termos de estilo e reorganização do layout sem alterar a estrutura HTML.
Sean

0

Os dados da lista de tabelas serão assim:

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

E você pode usar DL, DT, DD Tags List Data 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
Obrigado pelo link, mas seria melhor incluir o código aqui também, porque o link pode expirar em algum momento. BTW, o exemplo exagera a diferença, porque eles poderiam ter usado <th/>elementos para os rótulos ...
ᴠɪɴᴄᴇɴᴛ
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.