Nie myśl o klasach css jako klasach obiektowych, myśl o nich jako o narzędziu pośród innych selektorów do określania, które klasy atrybutów mają być stylowane w elemencie HTML. Pomyśl o wszystkim między nawiasami klamrowymi jak o klasie atrybutów , a selektory po lewej stronie informują elementy, które wybierają, aby dziedziczyć atrybuty z klasy atrybutów . Przykład:
.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
Gdy element jest podany atrybut class="foo", warto pomyśleć o tym, jak nie dziedziczy atrybuty z klasy .foo, ale z atrybutem klasy A i klasy B atrybut . Tj. Wykres dziedziczenia ma głębokość jednego poziomu, a elementy pochodzą z klas atrybutów , a selektory określają, gdzie idą krawędzie, i określają pierwszeństwo, gdy istnieją konkurujące atrybuty (podobnie do kolejności rozwiązywania metod).

Praktyczne implikacje dla programowania są następujące. Załóżmy, że masz arkusz stylów podane powyżej, a chcesz dodać nową klasę .baz, gdzie powinien mieć takie same font-sizejak .foo. Naiwnym rozwiązaniem byłoby:
.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! */}

Za każdym razem, gdy muszę coś wpisać dwa razy, tak się wściekam! Nie tylko muszę to napisać dwa razy, ale teraz nie mam możliwości programowego wskazania tego .fooi .bazpowinienem mieć to samo font-size, i stworzyłem ukrytą zależność! Mój powyższy paradygmat sugeruje, że powinienem wyodrębnić font-sizeatrybut z klasy atrybutów 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 */}

Główny zarzut jest to, że teraz muszę wpisywać każdy z selektora atrybutu klasy A ponownie, aby określić, które elementy powinny wybrać powinien również dziedziczą atrybuty z klasy bazowej przyporządkowują . Nadal jednak trzeba pamiętać, aby edytować każdą klasę atrybutów, w której istnieją ukryte zależności za każdym razem, gdy coś się zmienia, lub korzystać z narzędzia innej firmy. Pierwsza opcja rozśmiesza boga, druga sprawia, że chcę się zabić.