Новые значения и функции в CSS

Источник: «New Values and Functions in CSS»
Рабочая группа CSS выпустила первый публичный рабочий проект CSS Values and Units Module Level 5. В нем описаны общие значения и единицы измерения, принимаемые свойствами CSS, и синтаксис, используемый для них, а также добавлено несколько интересных новых функций.

13 сентября 2024 года рабочая группа CSS выпустила первый публичный рабочий проект модуля CSS Values and Units Module Level 5. Он является продолжением предыдущего уровня и включает несколько интересных дополнений.

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

Многие из этих функций имеют общую черту: они упрощают CSS код. То, что раньше требовало множества правил или хаков, теперь можно будет сделать с помощью пары строк CSS. Как я уже сказал, это выглядит многообещающе. Вот список новых изменений (более подробная информация ниже):

Новые возможности и обновления

Изменения в функции attr()

Чтение атрибута и его использование в CSS не является чем-то новым. Это уже было возможно с помощью attr(), но частой жалобой было то, насколько ограниченным был функционал, работая только со строками и в контенте.

Функция attr() претерпит некоторые изменения, и теперь любой атрибут data-, независимо от типа, может быть использован в любом свойстве. Будет просто указать тип и, если нужно, резервное значение на случай, если что-то пойдёт не так, как ожидалось.

Это долгожданное обновление, способное порадовать многих разработчиков.

Операции с внутренними значениями с помощью calc-size()

В этом модуле также представлена новая функция, способная безопасно работать с внутренними значениями (auto, max-content, fit-content и т. д.) Эта функция будет особенно удобна в переходах и анимации.

Также добавлено новое ключевое слово (size), обеспечивающее большую гибкость вычислений и облегчающее работу с размерами.

Зачем создавать новую функцию, если уже есть calc()? Как объясняется в документе, есть обратная совместимость и практические причины, по которым это было сделано именно так (например, плавная интерполяция во всех случаях, особенно при работе с процентами).

Новая функция first-valid()

Появился новый метод: first-valid(). Идея заключается в том, чтобы передать функции список значений; они будут разрешены, и первое валидное будет использовано. Это будет очень удобно при работе с пользовательскими свойствами CSS (они же CSS переменные).

Одна из проблем при работе с CSS переменными заключается в том, что в рамках объявления они считают значение валидным, даже если на самом деле содержащееся в них значение не является валидным. Установка резервного значения также не поможет, и объявление резервного значения также будет проигнорировано.

С помощью этого метода можно упростить код, объединив все резервные объявления в одно с помощью first-valid().

Новое семейство функций *-mix()

В нем также появилась новая функция, mix(), которая может использоваться для упрощения различных функций *-mix. Хотите смешать цвета? Можно сделать что-то вроде color-mix(red 60%, blue) или более простое mix(60%, red, blue). И так же, как и цвета, можно смешивать длины, функции трансформирования и т. д.

Эта нотация распространяется и на другое семейство функций *-mix:

Если в параметре прогресса (первом) не указана функция easing, то по умолчанию будет применена linear.

Новое семейство функций *-progress()

Они представляют собой пропорциональный прогресс заданного значения от одного начального значения к другому конечному значению. В результате получается число от 0 до 1, которое можно использовать в операциях, но оно будет удобно в сочетании с ранее описанным семейством функций *-mix.

В этом семействе три функции:

Функции рандомизации в CSS

Прикольные дизайны содержат некоторый уровень рандомизации, чего не хватало в CSS. Но в этом модуле представлены две новые функции, возвращающие случайные значения из списка (random-item()) или из диапазона (random()).

Больше никаких хаков или зависимостей от других языков для достижения этой цели. Синтаксис простой и мощный, с возможностью вычисления случайного числа по селектору или элементу.

Новые функции sibling-*

Иногда требуется задать разные стили в зависимости от порядка расположения элементов в контейнере. К сожалению, в CSS нельзя использовать счётчики подобным образом (оставлю это разглагольствование на другой день).

С появлением двух новых функций, возвращающих количество и позволяющих оперировать с ними, это препятствие устранено:

Больше не нужно устанавливать кастомные свойства для каждого элемента или писать отдельные селекторы с nth-child.

Новая функция toggle()

Появился новый удобный способ задания значений во вложенных элементах. Функция toggle() задаёт значения, которые элемент и его потомки будут циклически перебирать, что значительно упрощает код. Забудьте о сложных правилах и переопределениях — всё будет происходить в одной строке кода.

Например, представьте, что есть список с четырьмя вложенными уровнями. На нечётных уровнях должны быть discs, а на чётных — sqaures. Можно повеселиться и сделать ul > li ul > li ul > li ul { ... } на разных уровнях, или просто сделать что-то вроде { list-style-type: disc, square; }. Бум! Готово!

Единственное, что немного настораживает в этой функции, — это её название. Может быть, это только мне кажется, но слово "toggle" имеет двойственный контекст: on/off, yes/no — два значения, которые меняются/переключаются между собой. У функции toggle() может быть сколько угодно параметров, поэтому странно, что она названа "toggle".

Новая функциональная нотация для аргументов

Вы могли заметить, что некоторые из новых функций (например, random() или toggle()) могут принимать аргументы в виде списков значений, разделённых запятыми.

Как в таких случаях отличить один аргумент от другого? Именно поэтому существует предложение о модернизации запятых для функциональных нотаций. Это означает, что можно будет использовать точку с запятой (;) вместо запятой (,) для однозначного разделения параметров.

Например, представьте, что нужно установить на странице случайный шрифт и указать разные варианты:

Все аргументы представляют собой списки значений, разделённые запятыми. Если использовать запятую для разделения аргументов, то получился бы полный бардак. Но с новой нотацией легко определить, где заканчивается один аргумент и начинается следующий:

.random-font {
font-family: random-item(
Times, serif;
Arial, sans-serif;
Roboto, sans-serif
);
}

Расширение до типа позиции

В CSS уже есть логические свойства для margin, padding и border — значения, относящиеся к направлению написания текста, и они могут меняться от одного языка к другому.

Теперь это реализовано для типа position (не путайте со свойством position). Свойства, указывающие на позицию (например, background-position, object-position и т. д.), могут задавать значения, которые будут относительными по отношению к потоку и направлению текста.

Можно использовать следующие новые значения:

Заключение

Это ещё ранняя стадия, и всё будет меняться, но некоторые из новых возможностей и функций, включённых в CSS Values and Units Module Level 5, выглядят невероятно многообещающе.

Некоторые из них тоже долгожданны! Особенно возможность использовать любой атрибут с любым свойством. Кажется, я уже когда-то давно видел подобную возможность в спецификациях. Надеюсь, это тот толчок, который нужен, чтобы сделать её реальностью.

Не забудьте ознакомиться с рабочим проектом CSS Values and Units Module Level 5 для получения более подробной информации. Если у вас есть вопросы или комментарии, оформите тикет в их репозитории на GitHub.

Удачных (CSS) экспериментов и кодинга!

Комментарии


Дополнительные материалы

Предыдущая Статья

Все доступные в Laravel PHP атрибуты

Следующая Статья

Совет по безопасности: Параметризуйте имена параметров!