Код блоков, элементов и модификаторов можно писать в таких терминах, чтобы финальный HTML/CSS/JS можно было оптимизировать по размеру.
HTML:
<div class="b-copyright"></div>CSS:
<div class="b-copyright b-copyright_type_full"></div>
.b-copyright {}
.b-copyright_type_full {}
Оптимизировать этот код по размеру можно составив таблицу одно-, двух-, трёхбуквенных замен имён классов.
HTML:
<div class="aa"></div>CSS:
<div class="aa ab"></div>
.aa {}
.ab {}
Это уже сейчас можно делать с помощью jeanny.
Можно пойти дальше и перейти от использования классов к кастомным тэгам.
HTML:
<copyright></copyright>CSS:
<copyright class="b-copyright_type_full"></copyright>
copyright {}
.b-copyright_type_full {}
Пока не заметно улучение? А если сминимизировать?
HTML:
<qq></qq>CSS:
<qq c=a></qq>
qq {}
qq[c~=a] {}
Когда мы минимизируем классы они у нас все находятся в одной общей куче и мы сжимаем их все вместе. При большом количестве классов они у нас дойдут до трёх буквенных или даже четырёхбуквенных. Используя кастомный тэг для блока/элемента его модификатор можно выражать однобуквенным значением атрибута и строить селекторы включающие в себя и имя блока и его модификатор. Т.е. значение атрибута для конкретного модификатора конкретного блока будет чаще всего однобуквенным (в моей практике в Яндексе, конечно, есть модификаторы с больше чем 28-ю значениями, но это скорее исключение, чем правило).
Кавычки у значения атрибута можно не писать, если это значение одно. Если у блока/элемента два модификатора задано одновременно, то код будет таким
HTML:
<qq c="a b"></qq>CSS:
qq[c~=a] {}
qq[c~=b] {}
MSIE не понимает кастомные теги в default namespace, не позволяет накладывать на них CSS (хотя после createElement его можно использовать, что делают при внедрении новых элементов HTML5).
Но при этом отлично понимает их в custom namespace. Соответственно для MSIE сгенерированный код будет выглядеть так:
HTML:
<x:qq></x:qq>CSS:
<x:qq c=a></x:qq>
x\:qq {}
x\:qq[c~=a] {}
Для сравнения исходный код, код со сжатыми классами и сжатыми кастомными тэгами:
<div class="b-copyright"></div>
<div class="aa"></div>
<x:qq></x:qq>
<qq></qq>
<div class="b-copyright b-copyright_type_full"></div>
<div class="aa ab"></div>
<x:qq c=a></x:qq>
<qq c=a></qq>
.b-copyright {}
.aa {}
x\:qq {}
qq {}
.b-copyright_type_full {}
.ab {}
x\:qq[c~=a] {}
qq[c~=a] {}
UPDATE
HTML:
<qq></qq>CSS:
<qq a></qq>
<qq a b></qq>
qq {}
qq[a] {}
Задача состоит в том, чтобы построить работу с кодом так, чтобы писать человекопонятный код в терминах блоков и мочь генерировать из него разные представления (и даже, может быть, мочь менять их на лету):
- полный код
- сжатый код на классах
- сжатый код на кастомных тегах в отдельном неймспейсе
- сжатый код на кастомных тегах в default неймспейсе
т.е. если я хочу наложить на элемент .b-logo класс g-hidden, а они уже называются совсем и не так, а в html еще и неймспейсы появились.
Кстати, насчёт модификаторов.
А что если уменьшить размер html через трансформацию модификаторов в супер-дупер-независимые блоки (не знаю как это назвать)?
Т.е. получится не
и
аи
Разве что в таком варианте придётся все варианты с различными модификаторами прописывать.
Но зато это должно будет и в шестом ие работать, т.к. не надо будет в CSS использовать селектор по атрибуту.
Ну, на правах бреда :)
Ну а для яваскрипта можно в последнем определении в CSS дублировать то же имя, но классом, т.е. будет
Так, имея блок qq мы сможем превратить его в qqq прописав яваскриптом class="qqq", а т.к. это не в хтмл, то наличие «class» не особо важно.Другой вопрос, что с таким подходом сделать из qqq qq будет уже затруднительно… Но можно попробовать дописывать для каждого модификатора «отменяющие» селекторы с соответствующими правилами.
Хотя, как мне кажется, в таком случае использовать подобные модификаторы как достаточно «надёжные» сущности, которые не будут динамически меняться. А для динамических уже проектировать так, чтобы такой проблемы не возникало.
Хмм, слишком много «но», хотя мне идея всё-ещё нравится )
html
Это только display: block, насколько я вижу.
результаты reflow meter, 5000 рандомных кастомных элементов (кроме стандартных a, b, i, p, q, s, u) с одним рандомным аттрибутом + color: red в стилях:
как видно, Opera проседает в разы, WebKit ~ 2:1, Firefox ~ 1:1
http://banzalik.ru/labs/selectors/index2.php
воспрос был только как сильно это повлияет на рефлоу
На айфоне например все хорошо ...
потому что некоторые ошибки проявляются только там. это бывает редко, но больно.