(Обновление 2: этот вопрос находится в контексте SPA, хотя это незначительно относится к вопросу.)
Мои пользователи делятся на любителей неба и любителей леса. Поскольку я не собираюсь указывать им, какую цветовую схему использовать, и поскольку я также не собираюсь выпускать отдельные приложения, я предоставляю флажок, который выбирает между двумя палитрами.
Это довольно прямолинейно. Например, мы можем выбрать контейнеры и установить их класс.
function change_palette(cb) {
var bg = document.getElementById("somecontainer");
var fg = document.getElementById("sometext");
if(!cb.checked) {
bg.className = "mycontainer sky_bgcol";
fg.className = "mytext sky_fgcol";
}
else {
bg.className = "mycontainer forest_bgcol";
fg.className = "mytext forest_fgcol";
}
}
.sky_fgcol { color: #D6EAF8; }
.sky_bgcol { background-color: #2e86c1; }
.forest_fgcol { color: #D4EFDF; }
.forest_bgcol { background-color: #196F3D; }
.mycontainer { width: 400px; height: 300px; }
.mytext { text-align: center; }
.floatright { float: right; }
<div id="somecontainer" class="mycontainer sky_bgcol">
<div id="sometext" class="mytext sky_fgcol">
<h2>Title</h2>
<label class="floatright">
<input type='checkbox'
onclick='change_palette(this);'>Sky/Forest
</label>
</div>
</div>
Но есть две проблемы с этим подходом, если вместо двух цветов у нас шесть или семь, а вместо двух DIV у нас несколько десятков.
- Функция
change_palette()
ненадежна. Ему нужно знать, какие элементы принадлежат какой палитре. Рано или поздно кто-то добавит элемент и не сможет должным образом пересмотреть эту функцию. - Части каждой цветовой схемы не связаны. Правильным решением было бы изменить один указатель на небо/лес, чтобы настроить палитру.
Я могу решить обе проблемы, написав конфигурационный файл, в котором всего в одном месте указаны необходимые параметры.
Но мне интересно, будет ли это излишним, и у SASS/SCCC есть функция, которая лучше решит эту проблему. Они? Можете ли вы иначе указать путь к хорошему решению?
Обновление 1
Пол предлагает использовать переменные CSS, а затем (в JavaScript) переключаться между цветовыми палитрами, но это нежелательно, потому что цвета будут дублируются между CSS и Javascript (что является головной болью обслуживания, которая также делает определения переменных CSS излишними).
P.S.: Я предоставил MWE, чтобы у нас были конкретные вопросы и ответы.