Stellen Sie sich CSS- Klassen nicht als objektorientierte Klassen vor, sondern als bloßes Werkzeug unter anderen Selektoren, um anzugeben, nach welchen Attributklassen ein HTML-Element gestaltet ist. Stellen Sie sich alles zwischen den geschweiften Klammern als Attributklasse vor , und Selektoren auf der linken Seite teilen den Elementen mit, dass sie Attribute von der Attributklasse erben sollen . Beispiel:
.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
Wenn ein Element des Attribut gegeben ist class="foo"
, ist es sinnvoll , daran zu denken nicht als Attribut von Klasse zu erben .foo
, sondern von Attributklasse A und Attributklasse B . Das heißt, der Vererbungsgraph ist eine Ebene tief, wobei Elemente aus Attributklassen stammen und die Selektoren angeben, wohin die Kanten gehen, und den Vorrang bestimmen, wenn konkurrierende Attribute vorhanden sind (ähnlich der Reihenfolge der Methodenauflösung).
Die praktische Implikation für die Programmierung ist dies. Angenommen, Sie haben das oben angegebene Stylesheet und möchten eine neue Klasse hinzufügen .baz
, in der sie dieselbe haben sollte font-size
wie .foo
. Die naive Lösung wäre folgende:
.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! */}
Jedes Mal, wenn ich zweimal etwas tippen muss, werde ich so wütend! Ich muss es nicht nur zweimal schreiben, jetzt kann ich das nicht programmatisch anzeigen .foo
und .baz
sollte es auch haben font-size
, und ich habe eine versteckte Abhängigkeit geschaffen! Mein obiges Paradigma würde vorschlagen, dass ich das font-size
Attribut aus der Attributklasse A abstrahieren sollte :
.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 */}
Die Hauptbeschwerde hier ist, dass ich jetzt jeden Selektor aus der Attributklasse A erneut eingeben muss, um anzugeben, dass die Elemente, die sie auswählen sollen, auch Attribute aus der Attributbasisklasse A erben sollen . Die Alternativen bestehen jedoch darin, sich daran zu erinnern, jede Attributklasse zu bearbeiten, in der bei jeder Änderung versteckte Abhängigkeiten bestehen, oder ein Drittanbieter-Tool zu verwenden. Die erste Option bringt Gott zum Lachen, die zweite bringt mich dazu, mich umzubringen.