Não pense nas classes css como classes orientadas a objetos, pense nelas apenas como uma ferramenta entre outros seletores para especificar em quais classes de atributo um elemento html é denominado. Pense em tudo entre os chavetas como a classe de atributo , e os seletores no lado esquerdo informam os elementos que eles selecionam para herdar atributos da classe de atributo . Exemplo:
.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
Quando um elemento é dado o atributo class="foo"
, é útil para pensar sobre isso não como herdar atributos de classe .foo
, mas de classe atributo A e classe B atributo . Ou seja, o gráfico de herança tem um nível de profundidade, com elementos derivados de classes de atributos e os seletores especificando para onde as arestas vão e determinando a precedência quando houver atributos concorrentes (semelhante à ordem de resolução do método).
A implicação prática para a programação é essa. Digamos que você tenha a folha de estilos fornecida acima e deseje adicionar uma nova classe .baz
, na qual ela deve ter o mesmo font-size
que .foo
. A solução ingênua seria esta:
.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
.baz { font-size : 2em; /* attribute class C, hidden dependency! */}
Toda vez que tenho que digitar algo duas vezes fico tão bravo! Não só tenho que escrever duas vezes, agora não tenho como indicar programaticamente isso .foo
e .baz
deve ter o mesmo font-size
, e criei uma dependência oculta! Meu paradigma acima sugeriria que eu abstraísse o font-size
atributo da classe de atributo A :
.foo, .bar, .baz { font-size : 2em; /* attribute base class for A */}
.foo, .bar { font-weight : bold; /* attribute class A */}
.foo { color : green; /* attribute class B */}
A principal queixa é que agora eu tenho que digitar novamente a cada seletor de classe de atributo A novamente para especificar que os elementos que devem selecionar deve atributos também herdar de classe base atributo A . Ainda assim, é preciso lembrar de editar todas as classes de atributos em que existem dependências ocultas sempre que algo mudar ou usar uma ferramenta de terceiros. A primeira opção faz deus rir, a segunda me faz querer me matar.