Обновите переменные модуля CSS из Javascript
Я использую (теперь более старую) версию реактивного шаблона, которая поставляется с модулями CSS. Что хорошо в них, так это то, что вы можете создавать переменные и импортировать их в другие файлы CSS.
Вот мой файл colors.css
:root {
/* Status colors */
--error: #842A2B;
--success: #657C59;
--pending: #666;
--warning: #7E6939;
}
Когда я импортирую этот файл, мне просто нужно использовать его в верхней части.css файла:
@import 'components/App/colors.css';
Я хотел бы иметь возможность для двух тем для моего веб-сайта, и я хотел бы иметь возможность динамически обновлять эти переменные с помощью Javascript. Какой лучший способ сделать это?
Изменить: я надеялся, что есть способ обновить colors.css
файл и не нужно выполнять условный импорт во всех компонентах, которые извлекаются из двух возможных файлов CSS... дайте мне знать, если есть способ сделать это, и если есть, я изменю принятый ответ. Спасибо всем, кто ответил!
3 ответа
Я бы просто использовал цветовые переменные по умолчанию для элемента / body
/ что угодно, затем поместите альтернативные цвета темы в другой класс и переключите класс темы с помощью JS. Вот демо.
$("button").on("click", function() {
$("body").toggleClass("foo");
});
body {
--red: red;
--blue: blue;
--yellow: yellow;
background: #ccc;
text-align: center;
font-size: 5em;
}
.foo {
--red: #ce1126;
--blue: #68bfe5;
--yellow: #ffd100;
}
.red {
color: var(--red);
}
.blue {
color: var(--blue);
}
.yellow {
color: var(--yellow);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="red">RED</span> <span class="blue">BLUE</span> <span class="yellow">YELLOW</span>
<br>
<button>click me</button>
У меня было бы 2 листа и условно переключаться между ними:
colours.scss
:root {
/* Status colors */
--error: #842A2B;
--success: #657C59;
--pending: #666;
--warning: #7E6939;
}
otherColours.scss
:root {
/* Status colors */
--error: #FF0000;
--success: #00FF00;
--pending: #6666FF;
--warning: #FF00FF;
}
затем в своем коде реакции импортируйте их и используйте по своему усмотрению:
import styles from 'colours.scss';
import alternativeStyles from 'otherColours.scss';
...
{this.props.useNormalStyle ? styles.myClass : alternativeStyles.myClass}
Это то, что вы ищите?
// get the inputs
const inputs = [].slice.call(document.querySelectorAll('.controls input'));
// listen for changes
inputs.forEach(input => input.addEventListener('change', handleUpdate));
inputs.forEach(input => input.addEventListener('mousemove', handleUpdate));
function handleUpdate(e) {
// append 'px' to the end of spacing and blur variables
const suffix = (this.id === 'base' ? '' : 'px');
document.documentElement.style.setProperty(`--${this.id}`, this.value + suffix);
}
:root {
--base: #ffc600;
--spacing: 10px;
--blur: 10px;
}
body {
text-align: center;
}
img {
padding: var(--spacing);
background: var(--base);
-webkit-filter: blur(var(--blur));
/* */
filter: blur(var(--blur));
}
.hl {
color: var(--base);
}
/*
misc styles, nothing to do with CSS variables
*/
body {
background: #193549;
color: white;
font-family: 'helvetica neue', sans-serif;
font-weight: 100;
font-size: 50px;
}
.controls {
margin-bottom: 50px;
}
a {
color: var(--base);
text-decoration: none;
}
input {
width:100px;
}
<h2>Update CSS Variables with <span class='hl'>JS</span></h2>
<div class="controls">
<label>Spacing:</label>
<input type="range" id="spacing" min="10" max="200" value="10">
<label>Blur:</label>
<input type="range" id="blur" min="0" max="25" value="10">
<label>Base Color</label>
<input type="color" id="base" value="#ffc600">
</div>
<img src="http://unsplash.it/800/500?image=899">
<p class="love"></p>
<p class="love">Chrome 49+, Firefox 31+</p>