No piense en las clases css como clases orientadas a objetos, piense en ellas como una mera herramienta entre otros selectores para especificar qué clases de atributos se diseñan para un elemento html. Piense en todo entre las llaves como la clase de atributo , y los selectores en el lado izquierdo le dicen a los elementos que seleccionan para heredar atributos de la clase de atributo . Ejemplo:
.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
Cuando se da un elemento del atributo class="foo"
, es útil pensar en ella no como heredar los atributos de la clase .foo
, sino de clase de atributo A y clase B atributo . Es decir, el gráfico de herencia tiene un nivel de profundidad, con elementos derivados de clases de atributos y los selectores que especifican dónde van los bordes y determinan la precedencia cuando hay atributos competitivos (similar al orden de resolución del método).
La implicación práctica para la programación es la siguiente. Digamos que tiene la hoja de estilo dada anteriormente y desea agregar una nueva clase .baz
, donde debería tener la misma font-size
que .foo
. La solución ingenua sería 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! */}
¡Cada vez que tengo que escribir algo dos veces me enojo tanto! No solo tengo que escribirlo dos veces, ahora no tengo forma de indicarlo programáticamente .foo
y .baz
debería tener lo mismo font-size
, ¡y he creado una dependencia oculta! Mi paradigma anterior sugeriría que debería abstraer el font-size
atributo de la clase 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 */}
La queja principal aquí es que ahora tengo que volver a escribir cada selector de clase de atributo A de nuevo para especificar que los elementos que deben selecciona debe atributos también heredan de la clase base atributo A . Aún así, las alternativas son tener que recordar editar cada clase de atributo donde hay dependencias ocultas cada vez que algo cambia, o usar una herramienta de terceros. La primera opción hace reír a Dios, la segunda me da ganas de suicidarme.