dubr
@dubr
пыхарь

LESS: как назначать цвета в зависимости от контекста?

Привет!

Есть модульная система, где части фронт-энда (блоки и контейнеры) ничего не знают друг о друге, и "подружить" их очень желательно при помощи CSS (LESS) конкретной темы, не меняя HTML-разметку.

Есть "прозрачный" блок, в котором цвет текста должен меняться в зависимости от контекста, то есть от того, куда этот блок помещен. Если контейнер имеет темный фон - текст светлый, если фон контейнера светлый - текст темный.

Разметка контейнера не содержит явного указания на его фактор "темности", это тоже хочется регулировать из стилей. В идеале должно получиться так:

.block {
    .color_main();
}
.block2 .title {
    .color_main();
}

header, footer {
    .is_dark();
}


На выходе должно дать:
block, 
.block2 .title {
    color:#000;
}

header .block, 
footer .block, 
header .block2 .title,  
footer .block2 .title {
    color:#FFF;
}


Можно ли решить эту задачу только на LESS? У меня получилось собрать все селекторы через &:extend - вот так: codepen.io/dubrowsky/pen/zvKWPq (в окошке "LESS" нажать "View compiled). Теперь их надо как-то перемножить. Руки тянутся сделать на JS "на лету" (то есть пробежаться по document.styleSheets уже в браузере), но это не по феншую. Постпроцессинг городить тоже не хочется.

Есть шансы реализовать или хоть как-то приблизиться? Да, я понимаю, что есть нюансы - например, не все блоки "прозрачные", состояний "темности" больше чем два, может появиться несколько вложенных слоев с разным фоном и т.д. - но это все детали, хочется понять, есть ли в принципе решение, или надо копать в другую сторону.

Спасибо =)

UPD: Добавил метку "БЭМ", потому что мы его иногда используем. Интересно мнение БЭМ-адептов, как с таким быть? Потому что по канону вроде бы никакой "прозрачности" быть не может, блок не должен зависеть от контекста, а вместо этого надо явно указывать модификатор на всех блоках, то есть менять разметку. Или нет?
  • Вопрос задан
  • 463 просмотра
Пригласить эксперта
Ответы на вопрос 2
IonDen
@IonDen
JavaScript developer. IonDen.com
Можно например так:
.block {
    color: #fff;
    .title {
        color: #fff;
    }

    header &, footer & {
        color: #000;
        .title {
            color: #000;
        }
    }
}
Ответ написан
nonlux
@nonlux
Less:
.blocks(@col) {
  & .block {
    color: @col;
  }
}

.blocks(#fff);

.header, .footer {
  .blocks(#bbb);
}

css:
.block {
  color: #ffffff;
}
.header .block,
.footer .block {
  color: #bbbbbb;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы