CSS Custom Properties

CSS Custom Properties (кастомные свойства CSS, переменные) представляют собой мощный инструмент для создания гибких и повторно используемых стилей в компонентах Polymer. Они позволяют определять значения CSS один раз и использовать их в разных частях компонента, а также изменять их при переопределении, сохраняя при этом инкапсуляцию стилей.


Определение и использование

Кастомные свойства создаются с помощью синтаксиса --имя-переменной. Пример:

:host {
  --primary-color: #2196f3;
  --secondary-color: #f44336;
}

Эти свойства можно использовать внутри компонента через функцию var():

button {
  background-color: var(--primary-color);
  color: white;
  border: none;
  padding: 10px 20px;
  border-radius: 4px;
}

Ключевые моменты:

  • :host — селектор, применяемый к корневому элементу веб-компонента, позволяет определять переменные, доступные внутри компонента.
  • var(--имя-переменной, значение_по_умолчанию) — можно указать значение по умолчанию, которое будет использоваться, если переменная не определена.

Переопределение свойств

Одно из главных преимуществ Polymer — возможность динамически изменять стили компонентов через переопределение кастомных свойств в родительских элементах.

<style is="custom-style">
  my-button {
    --primary-color: #4caf50;
  }
</style>

<my-button></my-button>

В этом примере компонент my-button использует значение --primary-color, заданное внешним стилем. Это позволяет создавать тему для целого приложения, не вмешиваясь в внутренние стили компонента.


Наследование и каскадирование

Кастомные свойства CSS наследуются от родительских элементов, что делает их удобными для создания глобальных настроек темы. Например:

:root {
  --font-size: 16px;
  --font-color: #333;
}

my-card {
  font-size: var(--font-size);
  color: var(--font-color);
}

Если внутри конкретного блока требуется изменить шрифт, можно переопределить переменные локально:

section.special-card {
  --font-size: 20px;
}

Свойства с fallback

Использование fallback-значений предотвращает ошибки, если переменная не определена:

p {
  color: var(--text-color, black);
  font-size: var(--text-size, 14px);
}

Если --text-color или --text-size не заданы, применяются значения по умолчанию.


Комбинирование с JavaScript

Polymer позволяет работать с кастомными свойствами динамически через JS. Для установки значения переменной на уровне компонента используется метод updateStyles:

this.updateStyles({
  '--primary-color': '#ff9800'
});

Для глобальных изменений можно манипулировать стилями через document-level custom style:

document.documentElement.style.setProperty('--primary-color', '#673ab7');

Встроенные свойства и mixin

Polymer поддерживает использование CSS mixin, что позволяет объединять несколько свойств в один блок:

:host {
  --button-style: {
    padding: 10px 20px;
    border-radius: 5px;
    font-weight: bold;
  };
}

button {
  @apply --button-style;
  background-color: var(--primary-color);
}

Особенности:

  • @apply используется для применения набора свойств, определенного через mixin.
  • Миксины упрощают повторное использование стилей, особенно при работе с комплексными компонентами.

Практические рекомендации

  • Определять кастомные свойства в :host для компонентов и в :root для глобальных тем.
  • Использовать fallback-значения для обеспечения устойчивости стилей.
  • Комбинировать CSS Custom Properties с mixin для создания повторно используемых блоков стилей.
  • Переопределять переменные в родительских элементах, а не напрямую в компонентах, чтобы сохранить модульность.

CSS Custom Properties в Polymer обеспечивают мощную систему управления стилями, позволяя создавать динамичные, настраиваемые и легко поддерживаемые веб-компоненты, минимизируя дублирование кода и обеспечивая гибкость в изменении визуальной темы.