Formulários sem tabelas

Se você é um cara antenado, já deve saber que não é correto utilizar tabelas para layouts de páginas HTML. Tabelas devem ser usadas apenas para seu propósito original: tabulação de dados. Para todo o restante, como alinhamento de textos, imagens e qualquer outro elemento em uma página, existem as folhas de estilo.

Aprenda a montar corretamente um formulário web utilizando CSS, evitando o uso de tabelas para o alinhamento de textos e campos.

Vamos começar falando de tags HTML esquecidas na grande maioria dos formulários encontrados na web, são elas: fieldset, legend e label. Observe o form abaixo:

Login:

Usuário:
Senha:
<form>
<table>
  <tr>
    <td colspan="2">Login:</td>
  </tr>
  <tr>
    <td colspan="2"><hr /></td>
  </tr>
  <tr>
    <td>Usuário:</td>
    <td><input type="text" name="usuario"/></td>
  </tr>
  <tr>
    <td>Senha:</td>
    <td><input type="password" name="senha"/></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="enviar"/></td>
  </tr>
</table>
</form>

Agora vejamos o mesmo formulário utilizando as tags nativas do HTML para forms, eliminando o uso da tabela:

Login:

<form>
  <fieldset>
  <legend>Login:</legend>
  <label for="usuario">Usuário:</label>
  <input type="text" name="usuario" id="usuario"/><br />
  <label for="senha">Senha:</label>
  <input type="password" id="senha" name="senha"/><br />
  </fieldset>
  <input type="submit" value="enviar"/>
</form>

A tag label vem acompanhada do parâmetro “for” (para) contendo o “id” do campo a que se refere (precisa ser o “id” e não o “name”). Note que alguns tipos de input já vem com uma label embutida, como os botões. Neste caso você declara a label no parâmetro value, diretamente na tag.

Fieldset indica um grupo de campos associados a um mesmo tema. No nosse exemplo, o fieldset login possui os campos usuário e senha. Finalizando, legend está para fieldset como label está para input, ou seja, é um rótulo do conjunto de campos.

O código ficou bem mais simples, mas ainda falta alinhar o texto com os campos, como no formulário com tabelas. Nada que um pouco de CSS não resolva:

label,  input {
	display: block;
	float: left;
}

label {	
	text-align: right;
	width: 35px;
	padding-right: 20px;
	padding-bottom: 10px;
}

fieldset {
	border: solid 1px #000;
}

br {
	clear: left;
}
Login:

Observe as possibilidades de formatação com a utilização de CSS e das tags fieldset, legend e label. O formulário fica muito mais organizado e pode ter uma apresentação muito mais agradável, basta caprichar nas bordas e espaçamentos. Hora de conferir um pouco mais sobre algumas das propriedades CSS utilizadas neste exemplo:

display: block - Como o próprio nome sugere, exibe o elemento como um bloco, permitindo maior flexibilidade na hora de alinhá-lo com outros elementos na página.

float: left - A propriedade float move um elemento para a esquerda ou direita de seu elemento “pai”. Por exemplo, um elemento com a propriedade float:left é interpretado como um bloco e é sempre alinhado à esquerda (até encontrar um outro elemento com float ou clear). Caso você esteja iniciando agora na montagem de páginas com CSS, fique ligado nesta propriedade, pois ela será muito utilizada para criação de colunas, posicionamento de imagens etc.

clear: left - No nosso caso, a tag br com a propriedade clear: left impede com que elementos com float: left sejam alinhados à sua esquerda. Funciona, basicamente, como o início de uma nova linha no que se refere a elementos flutuantes.

Legal, não? Neste link você encontra alguns exemplos avançados de formulários CSS. Espero que tenham gostado e até a próxima!

28 comentários.

  • Diego Charles

    29/03/2008
    14:32

    Diego Charles escreveu:

    Muito bom, realmente, o código fica mais legivél, falta apenas comparar os tamanhos dos dois formulários (+ CSS) em casos de muitos campos, e o tempo de renderização, mas pelo menos em estrutura, ficou ótimno. Parabéns.

    Responder

  • Alexandre

    12/02/2010
    09:42

    Alexandre escreveu:

    O internet explorer desanima projetas sites em tableless!!! Nada funciona direito nessa m$#@ de Internet Explorer.

    Responder

  • Rafael Martins

    30/07/2011
    02:38

    Rafael Martins escreveu:

    Vai funcionar direito no dia em que vc aprender a escrever HTML e CSS corretamente, observando os padrões.

    Eu não vivo tendo esses horrores de problemas pra escrever tableless pra IE, o que me faz pensar que 99% dos webdesigners são amadores.

    Responder

  • Rafael

    17/06/2011
    23:49

    Rafael escreveu:

    Nunca funciona direito pra quem não sabe escrever HTML e CSS direito. Se vc codificasse corretamente não teria problemas.

    Responder

  • Marcelo

    21/06/2011
    12:46

    Marcelo escreveu:

    Ah, então todos os desenvolvedores do mundo estão errados, inclusive o autor do html, Tim Berners-Lee, que também fala que o IE não renderiza corretamente html. Até hoje, pras coisas funcionarem corretamente eu precisei usar os padrões pra todos os browsers e de um jeitinho pro IE.

    Responder

  • Rafael Martins

    30/07/2011
    02:47

    Rafael Martins escreveu:

    Uma coisa é falar que não renderiza direito, outra coisa é mostrar em que.

    Além do mais, há uma terrível desonestidade nos reclamões de plantão, que convenientemente nunca especificam a versão do navegador, pois não sei se vc sabe, usar uma falha do IE6 pra falar mal do IE em geral é errado, uma vez que temos 4 versões em uso, inclusive o IE9 tem um suporte melhor que os queridinhos em muitos aspectos, inclusive do HTML5 e CSS3.

    O webdesigner que fala que IE não renderiza nada direito é um amador e nada além disso.

    Um dia desses me deparei com um orgulhoso mal-falador de IE dizendo que este não sabia somar padding com largura e altura e que tinha que usar um "spacer", daí eu vi o código dele e questionei por que ele não estava declarando o infeliz do doctype para que o navegador saiba que versão rodar, isso foi um dos vários exemplos que vi de gente reclamando sem ter razão.

    Já erros grotescos já vi aos montes no firefox, chrome e em especial safari, nunca vi os bonzões falando deles, e eu tb nunca fiquei frescando na internet por essa causa.

    Está sobrando amadorismo e faltando profissionalismo nessa área.

    Responder

  • Lukas

    17/09/2011
    12:26

    Lukas escreveu:

    Se não reconhecer que o IE não tem diferenças de compatibilidade com os outros navegadres é profissionalismo, parabens! Você é um ótimo profissional. Você deveria escrever um livro diferente dos que existem que mostram exemplos de css diferentes para IE. Nos meus sistemas eu tenho que utilizar duas stylesheets diferentes sempre. Codificar direito não é codificar para somente um navegador.

    Responder

  • Cleber

    04/11/2011
    21:59

    Cleber escreveu:

    Não faz muito que iniciei minhas aventuras no mundo da programação web, acertando, errando mas sempre aprendendo e ainda estou longe de ser um "Profissional", agora,o tamanho da tua arrogância é apavorante, faltar com respeito com colegas de profissão é mesmo falta de ética no minimo, você deveria mostrar para nós, pobres mortais, como é o jeito correto de codificar com HTML e CSS.

    Responder

  • thiago

    21/11/2011
    11:02

    thiago escreveu:

    Puxa sou amador, pois nao programo nada pra um projeto de navegador que ja esta na versao 9 e ainda nao passou de um navegador beta

    Responder

  • fabiula

    07/12/2011
    10:32

    fabiula escreveu:

    realmente, a arrogância de algumas pessoas é deprimente. mesmo os profissionais como esse aí em cima se autoproclama, já foram um dia amadores. não se tornaram profissionais do dia pra noite.

    Responder

  • Fabio

    12/07/2009
    16:08

    Fabio escreveu:

    Excelente artigo. Você também pode criar com extrutura de lista utilizando as tags e .

    Responder

  • Mayco Deivid

    23/09/2009
    15:14

    Mayco Deivid escreveu:

    Olá Davi! Como vai essa força? Tudo bem? Aqui na Ilha de São Francisco do Sul - SC graças a Deus está tudo bem! :D Mais uma vez me sinto na obrigação de parabenizá-lo pelo seu blog, pelos tópicos e por sua grande pré-disposição em ajudar e ao mesmo tempo em expor-se. Parabéns! Gostei muito desse tópico também, eu já conhecia HTML, mas com certeza sempre há detalhes que deixa alguma questão em aberto. Seguindo esta estrutura sugerida aqui por você, tenho uma duvida de como aplicar corretamente a tag "label" aos "input type='radio'". Nesse caso eles tem o mesmo atributo "name" e "id", entretanto cada um tem um "label" diferente. Gostaría de saber também se é indiferente a tag "label" ser apresentada antes ou depois da tag "input". Segue o código abaixo referente a estas dúvidas e desde agora agradeço por sua atenção e prestimosidade. Categorias Criar Editar Excluir Nome para nova categoria:

    Responder

  • Mayco Deivid

    23/09/2009
    15:43

    Mayco Deivid escreveu:

    Aproveitando a oportunidade e talvez abusando um pouco de sua cordialidade, tenho mais uma dúvida. Quando utilizamos tags como "input", "br", "hr", ... tags que não tem tag de fechamento. Por exemplo a tab "br" em nosso código ficaría: sinal de menor "br" "espaço" "barra" e sinal de maior. Está correto? Deve haver o "espaço" entre "br" e a "barra"? Qual a maneira mais elegante para proceder nesses cassos? Se quiseres organizar meus comentários sinta-se desde agora a vontade e me desculpe por qualquer inconveniente.

    Responder

  • Davi Ferreira

    24/09/2009
    08:09

    Davi Ferreira escreveu:

    Fala Mayco! Valeu o comentário! Foi mal o lance do código, mas a atualização do Wordpress deve ter feito alguma coisa... depois dou uma olhada. Esse lance do espaço antes da barra no br não tem um padrão, usa como você preferir. Eu costumo deixar o espaço pra ficar mais legível. Sobre o ID nos inputs do tipo radio: o name deve ser o mesmo, mas o ID nunca. ID tem que ser sempre único. <label><input type="radio" name="categoria" id="categoria-1" value="1" /> Categoria 1</label> <label><input type="radio" name="categoria" id="categoria-2" value="2" /> Categoria 2</label> Como você pode ver tambem, outro jeito de solucionar isso, nesse caso nem precisa do ID, é envolvendo o input com a label. Qualquer dúvida é só perguntar!

    Responder

  • Mayco Deivid

    24/09/2009
    13:38

    Mayco Deivid escreveu:

    "Poxa vida!" hehehe Estou muito satisfeito com sua resposta para a questão do "espaço" e com a nova solução apresentada para a tag "label" envolvendo o "input"... Eu já carregava esta questão do "espaço" antes da "barra" há pelo menos 3 anos hehehehe Muito obrigado! :D

    Responder

  • Mayco Deivid

    30/09/2009
    17:16

    Mayco Deivid escreveu:

    Olá Davi! Falando em CSS, formulários, ... Gostaría de saber sobre a tag "input" do tipo "file". Quando utilizamos esta tag em nossos formulários para fazer o upload de um arquivo, ela apresenta um "rótulo" padrão para o botão que é utilizado para localizar o arquivo na maquina do cliente... Ex.: Procurar..., Arquivo..., e pior se o browser não for em português pode aparecer por exemplo em inglês Open file... A questão é, tem como alterar esse "rótulo" padrão que aparece, seja através de CSS, alguma tag especial HTML ou mesmo de alguma outra maneira? Agradeço desde agora por sua atenção. Muito obrigado.

    Responder

  • marcelo

    16/11/2009
    11:00

    marcelo escreveu:

    não funciona no IE8 q acontece

    Responder

  • Alexandre Broggio

    01/12/2009
    13:57

    Alexandre Broggio escreveu:

    Muito interessante o post vlw

    Responder

  • Perroni

    18/02/2010
    11:52

    Perroni escreveu:

    Olá formulário sem tabelas mas com um varias divs? Assim ... Quase sempre coloco mais do que um campo por linha E a cabo tendo de recorrer a uma folha de stilo pronta que tenho na firma ficando assim: Acredito que esta não é a forma correta de se escrever um formulario por acaso você tem alguma dica de como escrever um formulario sem tabelas mas que não use divs em excesso?

    Responder

  • Sérgio Furtado Ferreira

    23/08/2010
    17:12

    Sérgio Furtado Ferreira escreveu:

    As dicas são ótimas, mas tenho um problema: - Tenho mais de um campo (input) na mesma linha. - Não consigo manter uma distância razoavel entre os campos. Como solucionar este problema. Agradeço por uma resposta urgente...

    Responder

  • Luiz Fonseca

    12/12/2010
    19:22

    Luiz Fonseca escreveu:

    É uma maravilha ver alguém que pensa/trabalha da mesma forma que eu :D. Geralmente, eu separo labels de inputs. (sempre utilizando a forma explícita - for='') Interessante que, como eu só uso doctype strict (não por frescura, mas por organização), os elementos label e input devem constar dentro de outro elemento (de bloco ou não). Ex.: Nome

    Responder

  • Marcelo

    12/03/2011
    06:25

    Marcelo escreveu:

    Muito bom! só tem um porém, os elementos inputs e label nao devem ficar sozinhos, ou seja, é necessário que os mesmos estejam em um elemento de bloco.

    Responder

  • gadarf

    16/04/2011
    09:06

    gadarf escreveu:

    Se livras das tabelas as vezes pode ser meio complicado, e dicas são sempre bem vindas.

    Responder

  • Fabio Santos

    05/06/2011
    17:05

    Fabio Santos escreveu:

    muito boa a sua dica de tabelas sem tabelas. era exatamente o que eu estava procurando.

    Responder

  • Paulo Passic

    04/07/2011
    14:56

    Paulo Passic escreveu:

    Olá pessoal, boa tarde.

    Como faço para deixar os textos ( nome, email, cidade, etc) em cima do campo do formulario?
    Importante: Os campos terão que ficar lado a lado e não debaixo de outro campo.

    Grande abraço e desde já conto com a ajuda de todos,

    Paulo Passic

    Responder

  • Andrew Robert

    03/10/2011
    18:15

    Andrew Robert escreveu:

    Gostei de ver a indignação desse tal Rafael Martins...pois pelas observações que tem feito só podemos enteder que ele antes de nascer foi a mãe provavelmente colocava audio em walkman com aquelas fitas cassete, pois para dizer que todos são amadores estranho vcs não acham ao inves meu querido de criticar porque você não ajuda....tenho certeza que um dia voce ja esteve do outro lado das pedras e porque não ajudar que ainda não sabe ....o mudo melhoraria um pouco mais com um pensamento desses do tipo ajudar os outros e criar discipulo ...pode ter certeza Rafael que a galera vai te agradecer e você poderá ganhar muito .....

    Responder

  • Daniel

    12/01/2012
    16:24

    Daniel escreveu:

    Esse Rafael deve ser o cara, muito arrogante.
    Pela saco desse não foz bosta nenhuma, pode apostar.

    Responder

  • Daniel

    12/01/2012
    16:25

    Daniel escreveu:

    * Não faz

    Responder

Deixe seu comentário:

(Seu e-mail não será divulgado - serve apenas para validação e gravatar.)

(Tags HTML permitidas: <strong> <em> <code> <a>)

Ir para a capa do blog Publicado há mais de 4 anos, com 28 comentários.