Не думайте о классах CSS как об объектно-ориентированных классах, думайте о них как об инструменте среди других селекторов, чтобы указать, к каким классам атрибутов применяется элемент html. Подумайте обо всем, что между фигурными скобками, как о классе атрибутов , а селекторы слева говорят элементам, которые они выбирают для наследования атрибутов из класса атрибутов . Пример:
.foo, .bar { font-weight : bold; font-size : 2em; /* attribute class A */}
.foo { color : green; /* attribute class B */}
Когда элемент получает атрибут class="foo"
, полезно думать об этом не как наследование атрибутов из класса .foo
, но из атрибута класса А и класса B атрибут . Т.е. граф наследования имеет один уровень вглубь, элементы выводятся из классов атрибутов , а селекторы указывают, куда идут ребра, и определяют приоритет при наличии конкурирующих атрибутов (аналогично порядку разрешения метода).
Практическое значение для программирования заключается в следующем. Допустим, у вас есть таблица стилей, приведенная выше, и вы хотите добавить новый класс .baz
, где он должен быть таким же, font-size
как и .foo
. Наивное решение было бы так:
.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! */}
Каждый раз, когда мне приходится что-то печатать дважды, я так злюсь! Мало того, что я должен написать это дважды, теперь у меня нет возможности программно указать, что .foo
и .baz
должно иметь то же самое font-size
, и я создал скрытую зависимость! Моя вышеприведенная парадигма предполагает, что я должен абстрагировать font-size
атрибут от класса атрибута 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 еще раз , чтобы указать , что элементы , они должны выбрать также должны наследовать атрибуты из атрибутов базового класса A . Тем не менее, альтернативы заключаются в том, чтобы не забывать редактировать каждый класс атрибутов, где есть скрытые зависимости каждый раз, когда что-то меняется, или использовать сторонний инструмент. Первый вариант заставляет бога смеяться, второй заставляет меня хотеть убить себя.