Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

postcss-preset-env: новый CSS уже сегодня

postcss-preset-env — набор из нескольких десятков плагинов в одном пакете. Он позволяет писать современный CSS, а для браузеров из вашего списка Browserslist, которые что-то не поддерживают, переписывает код в старый эквивалент. Внутри уже есть Autoprefixer.

Установка

Установите пакет и замените им Autoprefixer в настройках:

npm install --save-dev postcss-preset-env
npm uninstall autoprefixer
// postcss.config.js
import postcssPresetEnv from 'postcss-preset-env';
 
export default {
  plugins: [postcssPresetEnv()],
};

Список браузеров по-прежнему "browserslist": ["defaults"] в package.json.

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

Логические свойства задают отступы и рамки не по сторонам экрана (left, top), а по направлению текста: inline — вдоль строки, block — поперёк строк. Оформим карточку поста:

/* styles/main.css */
.post-card {
  margin-block: 16px;
  padding-inline: 24px;
  border-inline-start: 4px solid #2563eb;
}

После npx postcss styles/main.css -o css/main.css:

.post-card {
  margin-top: 16px;
  margin-bottom: 16px;
  padding-left: 24px;
  padding-right: 24px;
  border-left: 4px solid #2563eb;
}

Логические свойства заменены физическими. Причина — Opera Mini, которая входит в defaults и их не понимает. Замена рассчитана на текст слева направо.

<style>
  .post-card {
    margin-top: 16px;
    margin-bottom: 16px;
    padding-left: 24px;
    padding-right: 24px;
    border-left: 4px solid #2563eb;
  }
</style>
 
<article class="post-card">
  <h2>Знакомство с PostCSS</h2>
  <p>Анна рассказывает, как настроить плагины за десять минут.</p>
</article>

На странице карточка с синей полосой слева и отступами — так же, как выглядел бы исходный код в современном браузере.

Другие возможности

Тот же плагин обрабатывает цвета и математические функции:

/* styles/main.css */
.post-tag {
  color: oklch(55% 0.2 260);
  font-size: clamp(0.75rem, 2vw, 0.875rem);
}
.post-tag {
  color: rgb(28, 105, 227);
  font-size: max(0.75rem, min(2vw, 0.875rem));
}

Цвет oklch() пересчитан в rgb(), а clamp() выражен через max() и min().

Результат зависит от списка

Замените список на "browserslist": ["baseline widely available"] и соберите снова: карточка останется с margin-block и padding-inline, а цвет — в oklch(). Все браузеры из нового списка это понимают, и плагину нечего менять. Когда старые браузеры перестанут быть нужны, вы просто обновите список — исходный CSS переписывать не придётся.

Настройки

ПараметрЧто делает
stageНасколько «сырые» возможности включать: от 0 (черновики) до 4 (стандарт), по умолчанию 2
featuresВключить или выключить отдельную возможность по её имени
browsersЗадать список браузеров прямо здесь, в обход Browserslist

Например, так отключается замена логических свойств:

// postcss.config.js
import postcssPresetEnv from 'postcss-preset-env';
 
export default {
  plugins: [
    postcssPresetEnv({
      features: { 'logical-properties-and-values': false },
    }),
  ],
};

Имена всех возможностей перечислены на сайте cssdb.org.

Частая ошибка

Включать логические свойства на сайте с арабским или ивритским текстом и не замечать замену. Плагин превращает border-inline-start в border-left, и в тексте справа налево полоса окажется не с той стороны. Для таких сайтов исключите Opera Mini из списка или отключите эту возможность через features.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.