Продолжая тему предыдущей статьи « Руководство PostCSS по улучшению селекторов и медиазапросов », мы рассмотрим другие плагины PostCSS, расширяющие горизонты CSS. Предыдущая статья была посвящена улучшению структуры ваших таблиц стилей с помощью расширенных селекторов и медиазапросов. Этот будет сосредоточен на реализации новых свойств и значений из будущих спецификаций. Плагины, описанные в этой статье, реализуют различные функциональные возможности и могут эффективно использоваться как вместе, так и по отдельности, в зависимости от ваших потребностей.
Начнем с моего личного фаворита.
Возврат на новый уровень
CSS3 представил две приятные возможности: initial
значение и свойство all
. initial
inherit
unset
Свойство all
Хотя каждый интересен сам по себе, при совместном использовании он позволяет быстро сбросить все стили для определенного элемента и предотвратить его наследование стилей от родительских элементов страницы. Еще один шаг к написанию модульного CSS!
К сожалению, обе эти функции все еще не поддерживаются IE. Но, как вы уже догадались, для этого есть плагин.
Postcss-initial добавляет поддержку initial
all: 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-size
20px
Важной частью здесь является сохранение всех пользовательских свойств внутри :root
Определенные в другом месте будут игнорироваться, так как они не могут быть адекватно обработаны плагином. Вы можете начать с этого и расширить свое использование, когда все больше браузеров начнут его поддерживать. Chrome уже поддерживает их, начиная с 49 .
Логические Свойства
Если вы когда-либо разрабатывали международный веб-сайт, который охватывает разные культуры с разными направлениями письма, вы знаете, что необходимо для поддержки нескольких версий интерфейса, таких как слева направо или справа налево. Чтобы удовлетворить эту потребность, W3C представил новую концепцию логических свойств . Способ абстрагироваться от мышления с точки зрения физических указаний, таких как направо или налево, а скорее в логических направлениях — начало и конец. Спецификация все еще находится в стадии разработки, но вы уже можете попробовать некоторые из этих вещей, используя плагин postcss-logic-props .
Он поддерживает создание версий сайта слева направо и справа налево с использованием определенных логических свойств, таких как border-block-start
border-block-end
offset-block-start
offset-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 дает нам многообещающую возможность быстро принять и оценить эти функции. Общий совет здесь заключается в том, чтобы попытаться отступить от привычного использования препроцессоров и по-новому взглянуть на написание таблиц стилей. Попробуйте составить список доступных функций, которые позволят вам повысить производительность, и использовать их в своем рабочем процессе. Возможно, вы скоро поймете, что это именно то, что вам не хватало с самого начала.