Когда у блока появляется множество модификаторов, которые применяются отдельно друг от друга или в комбинации, то, возможно, их удобнее вынести в миксин . А так как код примеси модификатора и код блока оказываются независимыми друг от друга, то они могут даже быть разнесены по файлам. Так мы можем разделить один большой файл на мелкие части.
@mista_k
у меня блок со множеством стейтов и их пересечениями; с контекстом браузера/технологий; с флагами конфигурации; с псевдоклассами
— fromanywhere (@from_anywhere) July 3, 2014
Мне кажется, что это может быть подходящим решением в данной ситуации.
Примеры
// namespace
@block: ~".cool-widget";
// block
@{block} {
// primary styles
position: relative;
&__title {
font: bold 20px/1 sans-serif;
}
&__body {
font: normal 14px/1.4 sans-serif;
color: white;
}
}
Добавим «тему», изменяющую оформление некоторых элементов.
@{block} {
// red modifier
&_red {
@{block} {
.cool-widget_red();
}
}
}
// red theme
.cool-widget_red() {
&__title {
color: red;
}
&__body {
background: red;
}
}
К одному модификатору можно подмешать несколько миксинов.
@{block} {
// blue modifier
&_blue {
@{block} {
.cool-widget_big-title();
.cool-widget_blue();
}
}
}
А так же можно создать стили для «глобального» модификатора.
@{block} {
// global modifiers
.ie6 & {
.cool-widget_ie();
}
.no-js & {
.cool-widget_no-js();
}
}
Исходный LESS-файл и результат — https://gist.github.com/mistakster/619b94f50ad7b6c861ba
Коментарии к заметке
Темы миксинами — офигенская идея, спасибо!
А как будут собираться эти стили, если блоков будет больше чем один? Переменная block примет одно значение и не будет меняться
Например, такой набор https://gist.github.com/just-boris/a86f3646f48683a9bf17 на less 2.3.0 даст такой неожиданный результат
Ага. Использование переменных в таком случае даёт странный результат.
Мы в компании не инклюдим блоки, а компилируем их независимо друг от друга (один блок — один файл). В этом случае такой проблемы не возникает.
Спасибо, что сообщил о такой проблеме.
Как насчет вот такого примера LESS, очень удобно:
Денис, спасибо за пример. Синтаксис выглядит немного громоздко по сравнению с простым &. Нужно будет попробовать на практике.
Плюс моего примера это понятность кода с модификатором блока и вложенных в него элементах.
И да самое главное можно инклудить :)