Como combinar classe e ID no seletor CSS?


221

Se eu tiver a seguinte div:

<div class="sectionA" id="content">
    Lorem Ipsum...
</div>

Existe uma maneira de definir um estilo que expresse a idéia "Uma div com id='content'AND class='myClass'"?

Ou você simplesmente segue um caminho ou outro como em

<div class="content-sectionA">
    Lorem Ipsum...
</div>

Ou

<div id="content-sectionA">
    Lorem Ipsum...
</div>

2
se você deseja selecionar por ID, não há necessidade de selecionar também por classe, porque o ID é único, portanto, apenas um elemento corresponderá. Assim, adicionando a classe para o mesmo seletor é a digitação extra apenas
— TStamper

20
@ TStamper: Não necessariamente. Você está pensando apenas em termos de documentos estáticos. img#InboxNesse caso, você pode ter um ícone em sua página normalmente definido como 50% de opacidade. No entanto, quando o usuário tem uma mensagem, você deseja que ela seja definida como 100% de opacidade, e o back-end indica isso adicionando uma activeclasse ao elemento. Nesse cenário, faz sentido ter um seletor que combine ID e nome da classe.
— Lèse majesté

@ TStamper: Além disso, não ter o seletor de combinação de ID + classe mais específico oferece mais peso / precedência do que a versão de ID sozinha? AFAIK, deveria. (IOW, as regras do ID + classe do seletor de combinação irá substituir as regras do seletor de ID de combinação (Esta foi a minha razão / necessidade de encontrar esta discussão agora)..
— govinda

Então, eu estou tendo uma situação semelhante. Por exemplo, tenho muitos produtos que têm descrições, mas também gostariam de ter controle específico sobre produtos individuais. Posso fazer: code<p id = Produto_1 classe = Produto> Produto 1 </p> <p id = Produto_2 classe = Produto> Produto 2 </p> code Isso permite o estilo geral de todos os produtos, mas também o estilo individual de produtos específicos?
— Tamer Ziady

Respostas:


327

Na sua folha de estilo:

div#content.myClass

Editar: Isso também pode ajudar:

div#content.myClass.aSecondClass.aThirdClass /* Won't work in IE6, but valid */
div.firstClass.secondClass /* ditto */

e, por seu exemplo:

div#content.sectionA

Editar, 4 anos depois: como é muito antigo e as pessoas continuam encontrando: não use o tagNames nos seus seletores. #content.myClassé mais rápido do que div#content.myClassporque o tagName adiciona uma etapa de filtragem que você não precisa. Use tagNames nos seletores apenas onde for necessário!


31
Especificar que o ID pertence a uma div só pode ser prejudicial ao desempenho da renderização (embora praticamente insignificante) sem nenhum benefício, pois um ID já é exclusivo. Eu usaria # content.myClass para torná-lo limpo.
— mystrdat

3
div.class#iddeve ser equivalente, embora menos recomendado; use partes mais exclusivas do seletor primeiro.
— SF.

1
Bem, obrigado pelo seu esforço, mesmo depois de anos :). Ainda ajudando caras como eu. Apenas usei para o meu projeto. Votado com certeza.
— C4d

76

Existem diferenças entre #header .calloute #header.calloutem css.

Aqui está o "inglês simples" de #header .callout:
Selecione todos os elementos com o nome da classe calloutque são descendentes do elemento com um ID de header.

E #header.calloutsignifica:
Selecione o elemento que possui um ID headere também um nome de classe callout.

Você pode ler mais aqui truques css


Eu cometi este erro com espaços em branco: .class #id vs # id.class
— ERJAN

5

Não há nada de errado em combinar um id e uma classe em um elemento, mas você não precisa identificá-lo por ambos para uma regra. Se você realmente quer, pode fazer:

#content.sectionA{some rules}

Você não precisa da divfrente do ID, como outros sugeriram.

Em geral, as regras CSS específicas para esse elemento devem ser definidas com o ID, e elas terão um peso maior do que as da classe. As regras especificadas pela classe seriam propriedades que se aplicam a vários itens que você não deseja alterar em vários locais sempre que precisar ajustar.

Isso se resume a isso:

 .sectionA{some general rules here}
 #content{specific rules, and overrides for things in .sectionA}

Faz sentido?


4

Bem, geralmente você não precisa classificar um elemento especificado por id, porque id é sempre único, mas se você realmente precisar, o seguinte deve funcionar:

div#content.sectionA {
    /* ... */
}

1

Você pode combinar ID e Classe em CSS, mas os IDs devem ser exclusivos, portanto, a adição de uma classe a um seletor de CSS a qualificaria em excesso.


Este é um bom ponto. Estou pensando se talvez você tenha um conjunto de classes muito gerais (definindo coisas como flutuação, altura / largura, talvez coisas como fonte) e gostaria de substituir algo nelas nesta exceção única?
— 22909 ajm

5
A menos que você use a mesma folha de estilo com páginas diferentes. :-)
— Patrick McElhaney

5
Outro exemplo: quando as aulas são adicionados dinamicamente com Javascript (# optionalFields.enabled)
— Patrick McElhaney

Mesmo se você usar a mesma folha de estilo com páginas diferentes, seria realmente melhor colocar uma classe no corpo ou ter um estilo para o ID e depois separar as definições de classe para as classes com os estilos de substituição apropriados.
— Eric Wendelin

Sim, acho que é bastante comum fazer isso. por exemplo, li # SomeTab.state-selected
— Yablargo


0

Os IDs devem ter um documento único, portanto você não deve selecionar com base em ambos. Você pode atribuir um elemento a várias classes embora comclass="class1 class2"


1
A turma pode mudar. Por exemplo, você pode ter div # id.active e div # id.inactive.
— 22730 Daniel Moura

justo o suficiente, pense bem, usei essa funcionalidade, mas não entendi qual era o comportamento desejado.
— 22909 Ben Hughes

0

Eu acho que você está errado. IDs versus classe não é uma questão de especificidade; eles têm usos lógicos completamente diferentes.

Os IDs devem ser usados ​​para identificar partes específicas de uma página: o cabeçalho, a barra de navegação, o artigo principal, a atribuição do autor, o rodapé.

As classes devem ser usadas para aplicar estilos à página. Digamos que você tenha um site de revista geral. Cada página do site terá os mesmos elementos - cabeçalho, navegação, artigo principal, barra lateral, rodapé. Mas sua revista tem seções diferentes - economia, esportes, entretenimento. Você deseja que as três seções tenham aparência diferente - economia conservadora e quadrada, ação esportiva, entretenimento brilhante e jovem.

Você usa classes para isso. Você não precisa criar vários IDs - # artigo de economia e # artigo de esporte e # artigo de entretenimento. Isso não faz sentido. Em vez disso, você definiria três classes, economia, esportes e entretenimento, depois definiria os IDs #nav, #article e #footer para cada um.


Na verdade, você pode usar tags HTML semânticas em vez de IDs para a maioria dos elementos mencionados. As tags de cabeçalho, rodapé, navegação, seção etc. existem por um motivo.
— Walter Schwarz

Mas, de fato, você deve usar apenas IDs para elementos que devem ser únicos, singletons. Mas, mesmo assim, isso é realmente útil se você precisar acessar esse elemento via JavaScript, porque o uso de IDs torna seu CSS muito específico e difícil de se mesclar posteriormente com outros CSS e / ou HTML. Há também o argumento de que os IDs são mais rápidos que as classes, mas a diferença é verdadeiramente insignificante.
— Walter Schwarz

-1
.sectionA[id='content'] { color : red; }

Não funcionará quando o doctype for html 4.01 ...

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.