Переменные CSS или настраиваемые свойства - это значения, определенные разработчиками CSS, которые содержат определенные значения для повторного использования в документе.
Они устанавливаются с использованием обозначения настраиваемых свойств.
--primary-text-color: black;
Доступ к ним осуществляется с помощью функции var()
.
color: var(--primary-text-color, #333333);
Второй вход для var()
- это значение по умолчанию, которое принимается во внимание, если переменная не определена или браузер не поддерживает переменные CSS.
Мы разрабатывали приложение, которое следовало архитектуре микро-интерфейса с использованием веб-компонентов. Существовало основное приложение-оболочка, которое обрабатывало маршрутизацию и извлекало нужное микроприложение во время выполнения. Микроприложения были независимыми и разрабатывались на Angular, Vue и Polymer (библиотека JavaScript с открытым исходным кодом для создания веб-приложений с использованием веб-компонентов).
Кроме того, каждое микроприложение использовало основную библиотеку, состоящую из различных повторно используемых веб-компонентов, таких как Alerts, Spinner, Card, Datatable и т. Д.
Была одна особенность установки темы всего приложения из списка тем. Также пользователь мог создать свою собственную тему. Основная проблема заключалась в том, как изменить стиль веб-компонентов из приложения оболочки или любого микроприложения, поскольку веб-компонент имеет свою собственную теневую DOM. Shadow DOM служит для инкапсуляции. Он позволяет компоненту иметь собственное «теневое» дерево DOM, к которому нельзя получить доступ из основного документа, может иметь правила локального стиля и многое другое.
Для меня переменные CSS стали спасением, поскольку они могут проникать через Shadow DOM и применяться к узлам внутри веб-компонента.
Ниже приведен пример того, как мы это реализовали.
Мы определили различные переменные CSS в нашем приложении оболочки.
:root { --primary-text-color: #fff; --primary-background-color: #ededed; --secondary-text-color: #53565; --secondary-background-color: #cccbcb; }
В веб-компоненте (класс Vue, завернутый в веб-компонент с помощью библиотеки @ vue / web-component-wrapper).
Компонент кнопки с двумя типами свойств и меткой.
//Button.vue <template> <button class="btn" :class="[type]">{{label}}</button> </template> <script> export default { props:{ label:String, type: String, } } </script> <style> .btn { display: inline-block; font-weight: 400; text-align: center; white-space: nowrap; vertical-align: middle; border: 1px solid transparent; padding: .375rem .75rem; font-size: 1rem; line-height: 1.5; border-radius: .15rem; transition: color .15s ease-in-out,background-color .15s ease-in- out,border-color .15s ease-in-out,box-shadow .15s ease-in-out; margin: 0; overflow: visible; } .primary { color: var(--primary-text-color,#f4f4f4); background-color: var(--primary-background-color,#49d597); border-color: var(--primary-background-color,#49d597); } .secondary { color: var(--secondary-text-color,#f1f1f1); background-color: var(--secondary-background-color,#32c547); border-color: var(--secondary-background-color,#32c547); }
Обертывание и регистрация компонента Vue Button как настраиваемого элемента с помощью @ vue / web-component-wrapper.
import Vue from 'vue'; import wrap from ‘@vue/web-component-wrapper’; import Button from './components/Button.vue'; const button = wrap(Vue, Button); window.customElements.define('wc-button', button);
Веб-компонент Button можно использовать следующим образом:
//In Vue app <wc-button type="primary" @click="save()" label="Save"></wc-button> <wc-button type="secondary" @click="reset()" label="Reset"></wc-button> //In angular app <wc-button type="primary" (click)="save()" label="Save"></wc-button> <wc-button type="secondary" (click)="reset()" label="Reset"></wc-button> //In plain JS <wc-button type="primary" onclick="save()" label="Save"></wc-button> <wc-button type="secondary" onclick="reset()" label="Reset"></wc-button>
Ниже приведен код того, как мы изменили переменные CSS в зависимости от темы, выбранной пользователем. Здесь мы выбираем корневой элемент документа и меняем значение переменной, используя метод стиля setProperty()
.
Когда мы меняем значение переменной, оно применяется ко всем элементам DOM в документе с использованием этого конкретного настраиваемого свойства.
userSelectedtheme = { name : "Navy Blue", properties: [ { key: "--primary-background-color", value: "#d2c5ce" }, { key: "--primary-text-color", value: "#3e3a3a" }, { key: "--secondary-background-color", value: "#504d4d" }, { key: "--secondary-text-color", value: "#4c3b3a" }, ]} userSelectedtheme.properties.forEach(property => { document.documentElement.style.setProperty ( property.key, property.value ); });
Бум, вот и все, готово… Спасибо за уделенное время… :)