Diferença Entre ID (#) e Classes (.)

Bom eu estava “dando aula” pra um amigo meu pelo Skype e surgiu essa pergunta: Qual é  a diferença entre ID (#) e Classes (.)? E é este tema que será abordado neste post:

Intrudução
É comum haver confusões entre IDs e Classes, utilizados e necessários em XHTML, CSS e Javascript. Há muitos tutoriais na internet explicando alguns pontos básicos e algumas dicas, que não são o suficiente. Resultado: as dúvidas persistem e a diferença entre ID e Classe ainda não é “desvendada”. Vamos acaber com esse mitério de uma vez por todas…

IDs e classes são “anzóis”

Precisamos definir uma propriedade (estilos) para os elementos da página. Para isso, usamos e IDs e Classes.

Por exemplo:

<ul id="nav">

Isso dá a oportunidade de visar e aplicar especificamente as propriedades para esta lista, então há uma maneira de manipular esta lista exclusivamente em relação a outras listas não-ordenadas da página. Ou talvez tivéssemos uma seção na página que não possui uma tag relevante para signifcar, por exemplo, um rodapé, onde poderíamos fazer algo como:

<div id="footer">

Ou talvez tenhamos boxes na barra lateral para manter o conteúdo separado de alguma forma:

<ul class="sidebar-box">

Esses IDs e classes são os “anzóis” que precisamos fazer na marcação para colocarmos as mãos neles. O CSS obviamente precisa disso para que possa fazer seletores e montar folhas de estilos, mas outras linguagens web, como javascript, também dependem deles. Mas quais as diferenças entre IDs e classes?

IDs são únicos

  • Cada elemento pode ter apenas um ID;
  • Cada página pode ter apenas um elemento com aquele ID.

Quando se está aprendendo sobre isso, é comum ouvir que só se deve usar IDs uma vez, mas é possível usar uma classe várias vezes. Basicamente, isso entra num ouvido e sai no outro, porque soa mais como uma “regrinha” de algo realmente importante. Se você trata somente com HTML / CSS, isso pode acontecer com você, também, porque eles realmente não parecem fazer nada de diferente.

Atenção: seu código não vai passar pelo validador se você usar o mesmo ID em mais de um elemento. A validação deve ser importante para todos nós, de modo que, por si só, é algo muito importante. Adiante, mais razões pelas quais um ID deve ser único.

Classes não são únicas

  • Você pode usar a mesma classe para vários elementos;
  • Você pode usar várias classes para um mesmo elemento.

Qualquer informação de estilo que precise ser aplicada a múltiplos elementos em uma página deve ser feita com uma classe. Tomemos como uma exemplo uma página com vários “widgets“:

<div class="widget"></div>
<div class="widget"></div>
<div class="widget"></div>

Agora, é possível usar a mesma classe “widget” como gancho para aplicar o mesmo conjunto de estilos para cada um deles. Mas, e se for preciso ter um deles maior que os outros, mas continuar com um estilo que compartilhe dos outros atributos? É possível aplicar mais de uma classe a um elemento:

<div class="widget"></div>
<div class="widget big"></div>
<div class="widget"></div>

Não há necessidade de fazer e nomear uma nova classe aqui, apenas colocar o nome da nova classe no atributo class, juntamente com o nome da classe que já está lá.  As diferentes classes são delimitadas por espaços e a maioria dos navegadores permite quaisquer números delas (na verdade, é mais como milhares, o que é muito mais do que realmente é preciso).

Não existem padrões de IDs e Classes em nenhum navegador

Colocar um nome de classe ou ID em um elemento, por padrão não faz nada a esse elemento.

Isso é algo que intriga quem é iniciante. Você está trabalhando em um site e descobre que a aplicação de uma classe com um nome em particular resolve um problema que você tem. Então você mexe em outro site, com o mesmo problema, e tenta corrigí-lo da mesma maneira, usando aquele mesmo nome de classe, pensando que o nome da classe, por si só, tem alguma propriedade mágica, apenas para descobrir que não funciona assim…

Classes e IDs não têm qualquer estilo por si mesmos. É preciso CSS para orientar e aplicar estilos.

Códigos de Barra e Números de Série

Talvez códigos de barra e números de série sejam uma boa analogia. Tome um iPod, numa loja. Na embalagem há um código de barras. Ele indica à loja que produto é esse; então, quando é escaneado, o código de barras informa exatamente que produto é aquele e quanto custa. É possível saber até sua cor e em qual lugar do armazém ele era mantido. Todos esses iPods têm exatamente o mesmo tipo de código de barras.

O iPod tem também um número de série que é absolutamente único em relação a qualquer outro iPod (ou outro dispositivo) em todo o mundo. O número de série não informa o preço. Poderia, mas para a loja que o vende esta não seria uma maneira eficaz de armazenar e utilizar essa informação. É muito mais fácil usar um código de barras porque se, por exemplo, o preço muda, é preciso apenas alterar o preço para aquele código de barras, e não para cada número serial do sistema.

Isso é muito parecido com IDs e Classes. Informações que são reusadas devem ser mantidas em uma classe e informações que são totalmente únicas devem ser mantidas em um ID.

IDs têm uma funcionalidade especial nos navegadores

Classes não tem funcionalidades especiais no browser, mas IDs têm um truque muito especial na manga: um “valor de hash” para URLs. Se você tiver um URL como http://seudominio.com#comments, o navegador vai tentar localizar o elemento com o id “comments” e vai automaticamente rolar a página até chegar nesse elemento.

É importante observar que o browser vai rolar a página até onde quer que o elemento esteja; então, se houver algo de especial, como uma DIV com barra de rolagem (propriedade CSS overflow com valor “auto” ou “scroll”), esta barra de rolagem vai ser deslocada – rolar para baixo -, também.

Esta é uma razão importante sobre o porquê é importante ter um ID absolutamente único. Com isso, o navegador sabe até quando rolar.

Elementos podem ter ambos, ID e Classes

Não é nada ruim você usa ambos, ID e classes em um único elemento. Na verdade, fazer isso na maioria das vezes é uma boa idéia. Tomemos como exemplo o padrão de marcação para item de lista de um comentário no WordPress:

<li id="comment-27299" class="item">

Tem uma classe que foi aplicada que talvez se queira usar para estilizar todos os comentários na página, mas também há um único valor de ID (dinamicamente gerado pelo WordPress). Com isso, é facilmente possível fazer um link diretamente a um comentário, em uma página, em especial.

CSS sem limites

Quanto ao CSS, não há nada que você possa fazer com um ID que não possa fazer com uma Classe e vice-versa. Às vezes, quando se está iniciando no estudo de CSS e se tem um problema, tenta-se alternar entre usar ID ou usar Classe. O CSS não se importa, faça o que quiser.

Javascript se importa

Aqueles que mexem com javascript provavelmente já estão mais em sintonia entre as diferenças entre as Classes e IDs. Javascript depende da existência de um elemento de página com ID único, ou então a comumente utilizada função getElementById não seria confiável. Aqueles acostumados com jQuery sabem o quão fácil é adicionar e remover classes de elementos de página. É uma função nativa no jQuery. Veja que tal função não existe para IDs. Não é responsabilidade do javascript manipular estes valores, porque ele causaria mais problemas, deixando de ser útil…

Se você não precisa deles, não os use

Como você pode ver, classes e IDs são muito importantes e nós os utilizamos todos os dias para estilizar páginas e manipular aquilo que é preciso. Entretanto, você deve usá-los com critério e semanticamente.

Isto significa evitar coisas do tipo:

<a href="http://css-tricks.com" class="link">CSS-Tricks.com</a>

Já sabemos: este elemento é um link, é um elemento âncora. Não há nada de especial aqui a ponto de ser preciso especificar uma classe, já que é possível aplicar o estilo na própria tag (”a”).

Evite este tipo de coisa, também:

<div id="coluna-direita">

O ID é corretamente utilizado aqui, já que, provavelmente, a página terá somente uma única coluna da direita, mas o nome é inadequado. Descreva o contexto do elemento, não onde está ou como se parece. Um ID “barra-lateral” seria melhor, mas isso não tem tanta importacia, eu prego o seguinte: se você entende o que fez e está certo, então faça a sua maneira…

Ta bom né, agora vamos aos creditos:
Eu é claro, e também ao site CSS tricks de onde foi retirado parte desse post… espero que tenham gostado e entendido (ficou meio técnico o post).

Até a próxima.

11 Comentários

  1. Tárcio Zemel disse:
    6 de dezembro de 2008 às 08:28

    E eu, não mereço constar nos “créditos”? ;-)

    Afinal, até os negritos da sua tradução são iguais os que eu coloquei na minha

  2. Mateus Souza disse:
    6 de dezembro de 2008 às 18:56

    ué? eu num coloquei não…rsrs
    foi mal cara, te juro q pensei q tinha colocado

  3. Tim disse:
    7 de dezembro de 2008 às 21:20

    Great blog, good information.

  4. GutoMuniz disse:
    22 de janeiro de 2009 às 10:38

    Valeu :D
    Muito bom…
    :) :) :) :)

  5. Dajano disse:
    6 de fevereiro de 2009 às 09:26

    Muito bom, esclareceu mt. Abraço

  6. Igor disse:
    22 de maio de 2009 às 01:09

    Ficou otimo! parabens!

  7. Washington Botelho disse:
    25 de maio de 2009 às 20:36

    Muito bom a matéria, porém tenho dúvida e um complemento a fazer:

    Dúvida:
    Qual a diferença de se usar div#minhaDiv {}, table#minhaDiv {} ou #minhaDiv {}? Antes da tralha seria considerado apenas um comentário? Seria legal esclarecer isso também.

    Pra complementar o que você falou sobre não usar class em tags já âncoras como é válido, porém se você o estiliza, fica para todo o site, e nem sempre queremos um estilo global. No meu site mesmo no menu eu quero um estilo para o link e no home outro.

    Parabéns pelo blog, estou aprendendo muito aqui.
    Abraço. : :)

  8. Mateus Souza disse:
    25 de maio de 2009 às 22:56

    bom 1° obrigado a todos os que me parabenizaram pelo blog ou pelo post

    basicamente funciona assim:
    div#minhaDiv {} se você faz assim e coloca o id minhaDiv em um span por exemplo não vai funcionar porque você está privando este estilo somente a DIV que conter o id minhaDiv
    o table#minhaDiv é a mesmo coisa, só que agora é restringindo o css somente a table

    e #minhaDiv {} você poderá tanto aplica-la em uma div ou em um span ou button ou seja la…

    é basicamente isso…espero que tenha entendido

    abraços

  9. Piero Di Carlo Dalla-Bona disse:
    7 de setembro de 2010 às 10:12

    Parabéns pelo Post!

    Super claro e didático.

    Abração, Piero.

  10. Mayumi disse:
    13 de abril de 2011 às 20:48

    Obrigada pelo post!
    Me ajudou bastante. =)

  11. @luciotbc disse:
    11 de junho de 2011 às 19:05

    Muito boa a comparação que você faz com código de barras e número de série parabéns!

Faça um Comentário