Статьи

Включение новых функций CSS с помощью PostCSS

Продолжая тему предыдущей статьи « Руководство PostCSS по улучшению селекторов и медиазапросов », мы рассмотрим другие плагины PostCSS, расширяющие горизонты CSS. Предыдущая статья была посвящена улучшению структуры ваших таблиц стилей с помощью расширенных селекторов и медиазапросов. Этот будет сосредоточен на реализации новых свойств и значений из будущих спецификаций. Плагины, описанные в этой статье, реализуют различные функциональные возможности и могут эффективно использоваться как вместе, так и по отдельности, в зависимости от ваших потребностей.

Начнем с моего личного фаворита.

Возврат на новый уровень

CSS3 представил две приятные возможности: initial значение и свойство all . initialinheritunset Свойство all Хотя каждый интересен сам по себе, при совместном использовании он позволяет быстро сбросить все стили для определенного элемента и предотвратить его наследование стилей от родительских элементов страницы. Еще один шаг к написанию модульного CSS!

К сожалению, обе эти функции все еще не поддерживаются IE. Но, как вы уже догадались, для этого есть плагин.

Postcss-initial добавляет поддержку initialall: initial Вот как это работает:

 .article {
  font-size: initial;
  color: initial;
  padding: initial;
  margin: initial;
}

Собирается в:

 .article {
  font-size: medium;
  font-size: initial;
  color: #000;
  color: initial;
  padding: 0;
  padding: initial;
  margin: 0;
  margin: initial;
}

По умолчанию он оставляет исходные свойства с initial

Свойство all

 .container {
  all: initial;
}

Транспортируется в:

 .container {
  animation: none 0s ease 0s 1 normal none running;
  backface-visibility: visible;
  background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;
  border: medium none currentColor;
  border-collapse: separate;
  border-image: none;
  border-radius: 0;
  border-spacing: 0;
  bottom: auto;
  box-shadow: none;
  box-sizing: content-box;
  caption-side: top;
  clear: none;
  clip: auto;
  color: #000;
  columns: auto;
  column-count: auto;
  column-fill: balance;
  column-gap: normal;
  column-rule: medium none currentColor;
  column-span: 1;
  column-width: auto;
  content: normal;
  counter-increment: none;
  counter-reset: none;
  cursor: auto;
  direction: ltr;
  display: inline;
  empty-cells: show;
  float: none;
  font-family: serif;
  font-size: medium;
  font-style: normal;
  font-variant: normal;
  font-weight: normal;
  font-stretch: normal;
  line-height: normal;
  height: auto;
  hyphens: none;
  left: auto;
  letter-spacing: normal;
  list-style: disc outside none;
  margin: 0;
  max-height: none;
  max-width: none;
  min-height: 0;
  min-width: 0;
  opacity: 1;
  orphans: 2;
  outline: medium none invert;
  overflow: visible;
  overflow-x: visible;
  overflow-y: visible;
  padding: 0;
  page-break-after: auto;
  page-break-before: auto;
  page-break-inside: auto;
  perspective: none;
  perspective-origin: 50% 50%;
  position: static;
  right: auto;
  tab-size: 8;
  table-layout: auto;
  text-align: left;
  text-align-last: auto;
  text-decoration: none;
  text-indent: 0;
  text-shadow: none;
  text-transform: none;
  top: auto;
  transform: none;
  transform-origin: 50% 50% 0;
  transform-style: flat;
  transition: none 0s ease 0s;
  unicode-bidi: normal;
  vertical-align: baseline;
  visibility: visible;
  white-space: normal;
  widows: 2;
  width: auto;
  word-spacing: normal;
  z-index: auto;
  all: initial;
}

В случае, если вы используете BEM или Suit, этот плагин хорошо работает с postcss-autoreset, который автоматически сбрасывает стили для элементов уровня блока и компонента.

Пользовательские свойства

При работе с макетом нам часто приходится делиться некоторыми значениями в таблице стилей. Например, цвет вашего бренда может использоваться в качестве фона для кнопки, цвета текста для ссылки или границы для текстового блока. В настоящее время для достижения этого нам нужно будет повторять цвет несколько раз в каждом месте, где он используется. Такое повторение делает утомительным сохранение согласованности цветовой палитры при изменении цветов в приложении.

Препроцессоры CSS, такие как Less и Sass, решили эту проблему с помощью переменных. К счастью, W3C работает над аналогичной концепцией, называемой пользовательскими свойствами . Хотя они решают одну и ту же проблему, они работают иначе, чем переменные в препроцессорах. Переменные Less и Sass разрешаются во время компиляции. Когда вы компилируете Less или Sass в CSS, компилятор будет искать объявление переменной, соответствующее текущей области компиляции, и заменять каждый экземпляр соответствующим значением. Это означает, что разрешенное значение переменной зависит исключительно от того, где она используется в коде. Пользовательские свойства, в свою очередь, определены для элементов в DOM и доступны только их дочерним элементам. Это означает, что значение переменной зависит от положения элемента в DOM и может быть разрешено только во время выполнения.

К этому моменту вы должны нахмуриться или поднять бровь. Если значение переменной известно только во время выполнения, как оно может быть разрешено с помощью плагина PostCSS? Правда в том, что не может. Это, однако, предоставляет способ использовать подмножество этой функциональности. Если мы определим все наши пользовательские свойства в элементе :root Это означает, что мы можем разрешить их во время компиляции.

Вот простой пример того, как это может выглядеть:

 :root {
  --text-color: red;
  --background: blue;
}

h1 {
  color: var(--text-color);
  font-size: var(--font-size, 20px);
}
button {
  background-color: var(--background);
}

Будет скомпилировано в:

 h1 {
  color: red;
  font-size: 20px;
}
button {
  background-color: blue;
}

Обратите внимание, что переменная --font-size20px Важной частью здесь является сохранение всех пользовательских свойств внутри :root Определенные в другом месте будут игнорироваться, так как они не могут быть адекватно обработаны плагином. Вы можете начать с этого и расширить свое использование, когда все больше браузеров начнут его поддерживать. Chrome уже поддерживает их, начиная с 49 .

Логические Свойства

Если вы когда-либо разрабатывали международный веб-сайт, который охватывает разные культуры с разными направлениями письма, вы знаете, что необходимо для поддержки нескольких версий интерфейса, таких как слева направо или справа налево. Чтобы удовлетворить эту потребность, W3C представил новую концепцию логических свойств . Способ абстрагироваться от мышления с точки зрения физических указаний, таких как направо или налево, а скорее в логических направлениях — начало и конец. Спецификация все еще находится в стадии разработки, но вы уже можете попробовать некоторые из этих вещей, используя плагин postcss-logic-props .

Он поддерживает создание версий сайта слева направо и справа налево с использованием определенных логических свойств, таких как border-block-startborder-block-endoffset-block-startoffset-block-end Эти свойства компилируются в их левую или правую альтернативы. Вы можете указать плагину компилировать обе версии LTR и RTL таблицы стилей, а затем переключать их в приложении, когда пользователь меняет язык.

Например, если у вас есть следующий CSS:

 .text {
  border-block-start: 1px solid blue;
  text-align: start;
  padding-block-end: 10px;
  margin-block-start: 20px;
}

Вызов плагина с параметрами { dir: 'LTR' }

 .text {
  border-left: 1px solid blue;
  text-align: left;
  padding-right: 10px;
  margin-left: 20px;
}

При использовании { dir: 'RTL' }

 .text {
  border-right: 1px solid blue;
  text-align: right;
  padding-left: 10px;
  margin-right: 20px;
}

Новые функции цвета

PostCSS предоставляет целую группу плагинов, которые предоставляют новые функции для работы с цветами.

Регулировка цвета

Плагин postcss-color-function реализует новую функцию color() . Эта функция позволяет изменять базовый цвет с помощью одной или нескольких функций «регулятора цвета». Каждый из регуляторов цвета может манипулировать цветом определенным образом.

Вот несколько примеров того, как это можно использовать:

 body {
  color: color(red green(50));
  color: color(red blue(50) a(50%));
  color: color(red tint(50%));
  color: color(red shade(50%));
}

Будут скомпилированы в следующие цвета

 body {
  color: rgb(255, 50, 0);
  color: rgba(255, 0, 50, 0.5);
  color: rgb(255, 128, 128);
  color: rgb(128, 0, 0);
}

Полный список регуляторов цвета можно найти в спецификации . Этот плагин может быть чрезвычайно эффективным вместе с пользовательскими свойствами. Вы можете определить набор базовых цветов и рассчитать другие на их основе. Таким образом, если вы решите изменить свои базовые цвета, остальная часть палитры будет обновлена ​​соответствующим образом.

HWB Color Notation

HWB означает Hue-Whiteness-Blackness, альтернативный метод определения цветов. Он описывает цвет, используя значение оттенка от 0 до 360, а затем добавляет степень белизны и черноты от 0% до 100%. Это обозначение похоже на HSL и несколько легче для понимания, чем RGB. Плагин postcss-color-hwb реализует новую hwb() которая используется для определения цветов HWB. Пара примеров:

 body {
  color: hwb(0, 0%, 0%);
  color: hwb(120, 40%, 20%);
  color: hwb(240, 0%, 100%, 0.5);
}

Будет генерировать следующие цвета:

 body {
  color: rgb(255, 0, 0);
  color: rgb(102, 204, 102);
  color: rgba(0, 0, 0, 0.5);
}

Gray()

Модуль CSS colors также представил удобную функцию gray() . Его можно использовать для генерации серых цветов без указания какой-либо избыточной информации, такой как все три канала в цвете RGB. Плагин postcss-color-grey реализует функцию polyfill и чрезвычайно прост в использовании:

 body {
  color: gray(0);
  color: gray(25);
  color: gray(50%);
  color: gray(128, 20%);
}

Этот код выше будет генерировать различные оттенки серого:

 body {
  color: rgb(0, 0, 0);
  color: rgb(25, 25, 25);
  color: rgb(127, 127, 127);
  color: rgba(128, 128, 128, 0.2);
}

Завершение всего этого

Это, безусловно, не полный список доступных плагинов CSS, а скорее выбор из более интересных. Вы можете узнать больше о них на postcss.parts .

CSS процветает, и PostCSS процветает вместе с ним. Да, мы все с нетерпением ждем поддержки этих новых функций в собственном браузере, но PostCSS дает нам многообещающую возможность быстро принять и оценить эти функции. Общий совет здесь заключается в том, чтобы попытаться отступить от привычного использования препроцессоров и по-новому взглянуть на написание таблиц стилей. Попробуйте составить список доступных функций, которые позволят вам повысить производительность, и использовать их в своем рабочем процессе. Возможно, вы скоро поймете, что это именно то, что вам не хватало с самого начала.