Цель этого руководства — познакомить вас со списком новых (потрясающих) возможностей, недавно появившихся в CSS.

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

CONTAINER QUERIES (размер)

Что такое Container Queries размеров?

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

<div class="element-wrap">
  <div class="element">
  </div>
</div>
.element-wrap {
  container: element / inline-size;
}
@container element (min-inline-size: 300px) {
  .element {
    display: flex;
    gap: 1rem;
  }
}

Когда это должно быть важно?

Если вы когда-то думали: вот бы решения о стилизации зависели от размера этого элемента, а не всей страницы, как меня заставляют делать @media-запросы. В этом случае вам пригодятся @container-запросы! Люди, работающие с дизайн-системами или с веб-сайтами, активно использующими компоненты, вероятно, чаще всего будут использовать Container Queries для стилизации в зависимости от размера, потому что размер всей страницы плохо подходит для определения размера компонента.

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Потенциально — если стилизация не критична, тогда да.

Polyfill

Да

Простое демо применения

Перемещайте разделитель посередине, чтобы изменять структуру календаря в зависимости от занимаемого им места. Сам по себе он имеет три точки разрыва.

CONTAINER QUERIES (стиль)

Что такое Container Queries стиля?

Container Queries стиля позволяют применять стили, когда определённое пользовательское свойство (Custom Property) имеет определённое значение.

.container {
  --variant: 1;

  &.variant2 {
    --variant: 2;
  }
}

@container style(--variant: 1) {
  button { } /* You can't style .container, but can select inside it */
  .other-things { }
}

@container style(--variant: 2) {
  button { }
  .whatever { }
}

Когда это должно быть важно?

Вы хотели когда-нибудь добавить примеси в CSS? То есть при задании одного свойства получать несколько. Довольно популярны стали примести благодаря Sass. Их можно реализовать при помощи Style Container Query. Но точно так же, как после переменных Sass переменные CSS оказались более полезными и удобными, Style Container Queries, вероятно, окажутся более мощными и полезными, потому что они учитывают каскад, их можно вычислять и так далее.

Поддержка

Поддержка браузерами

✅ Chrome и его коллеги

? Safari

❌ Firefox

Progressive Enhancement?

Potentially; в зависимости от того, что вы делаете со стилями. Скажем так: едва ли.

Polyfill

Нет

Простой пример использования

CONTAINER UNITS

Что такое Container Units?

Container Units (в буквальном смысле единицы измерения (units), то есть pxrem или vw) позволяют задавать размер элементов на основании текущего размера элемента контейнера. Аналогично тому, что единицы измерения viewport 1vw составляют 1% от ширины окна браузера, 1cqw — это 1% от ширины контейнера (хотя я бы рекомендовал использовать вместо них cqi, «логический эквивалент», означающий «направление строки»).

Используются следующие единицы измерения: cqw («container query width», ширина container query), cqh («container query height», высота container query), cqi («container query inline», строка container query), cqb («container query block», блок container query), cqmin (меньшее из cqi и cqb) и cqmax (большее из cqi и cqb).

Когда это должно быть важно?

Если размер чего-то внутри элемента должен зависеть от текущего размера контейнера, то, по сути, единственный способ это реализовать — container units. Примером этого может быть типографика. Типичный элемент Card может заслуживать увеличенного текста заголовка, когда он рендерится больше, без необходимости добавления имени класса для управления этим. (Я люблю вот это демо.) Даже container query по сравнению с этим неудобен.

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Да, можно создать объявление с использованием fallback-единиц непосредственно перед объявлением, использующим единицы container query.

Polyfill

Да

Простой пример использования

В этом элементе используются единицы измерения container query не только для font-size, но и для paddingbordermargin.

Псевдоселектор :HAS()

Что такое селектор :has()?

Селектор:has() позволяет условно выбирать элементы, когда элементы глубже в дереве DOM, чем исходный элемент, соответствуют селектору, помещённому внутрь :has().

figure:has(figcaption) {
  border: 1px solid black;
  padding: 0.5rem;
}

Когда это должно быть важно?

Если вам когда-то нужен был «родительский» селектор в CSS, :has() может выполнить эту задачу, но он гораздо мощнее, так как после выбора нужного родителя можно снова углубиться вниз. Джей Томпкинс назвал это «семейным селектором». Также можно скомбинировать его с :not() , чтобы создать селектор того, когда элемент не «имеет» внутри совпадающего элемента.

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Зависит от того, что вы делаете со стилями; скажем так: вряд ли.

Polyfill

Только для JavaScript

Простой пример использования

VIEW TRANSITIONS

Что такое View Transitions?

Существуют два типа View Transitions:

  1. Переходы на одной странице (требуют JavaScript)

  2. Переходы на множественных страницах (только CSS)

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

if (!document.startViewTransition) {
  updateTheDOM();
} else {
  document.startViewTransition(() => updateTheDOM());
}

Для переходов на множественных страницах понадобится этот тег meta:

<meta name="view-transition" content="same-origin">

Тогда любой элемент, для которого нужно выполнить переход между страницами, должен иметь применённое в стилях абсолютно уникальное view-transition-name, как на исходной, так и на конечной странице.

Когда это должно быть важно?

Пользователи лучше смогут понять интерфейс, если элемент перемещается в новую позицию, а не сразу же оказывается там. Существует концепция анимации под названием tweening, при которой анимация автоматически создаётся на основании начального и конечного состояния. По сути, View Transitions — это и есть tweening. Вы можете управлять аспектами анимации, но по большей мере анимация создаётся автоматически на основании начального и конечного состояния DOM, без необходимости чёткого определения подробностей анимации.

Поддержка

Поддержка браузерами

✅ Chrome и коллеги

❌ Safari

❌ Firefox

Progressive Enhancement?

Да — переходы могут просто не выполняться или вы можете задать fallback-анимацию.

Polyfill

Нет

Простой пример использования

Вот пример view transition на одной странице:

NESTING

Что такое nesting?

Nesting — это способ написания CSS, позволяющий записывать дополнительные селекторы в рамках существующего набора правил (ruleset).

.card {
  padding: 1rem;

  > h2:first-child {
    margin-block-start: 0;
  }

  footer {
    border-block-start: 1px solid black;
  }
}

Когда это должно быть важно?

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

.card {
  container: card / inline-size;
  
  display: grid;
  gap: 1rem;
  
  @container (min-inline-size: 250px) {
    gap: 2rem;
  }
}

Единственное важное отличие от вложенности в стиле Sass заключается в том, что невозможно комбинировать & напрямую.

.card {
  body.home & { /* totally fine */ }
  & .footer { /* totally fine, don't even need the & */
  &__big { /* nope, can't do this */ }
}

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Нет

Polyfill

Можно использовать обработчик, например, LightningCSS, Sass, Less и так далее.

SCROLL-DRIVEN ANIMATIONS

Что такое Scroll-Driven Animations?

Любую анимацию, которая привязана к скроллингу элемента (часто это сама страница) теперь можно реализовать на CSS вместо необходимости привязывать события скроллинга DOM в JavaScript. Существует два варианта:

  • Прогресс скроллинга элемента. (animation-timeline: scroll())

  • Текущая видимая позиция элемента внутри элемента. (animation-timeline: view())

Когда это должно быть важно?

Представьте полосу индикатора прочтения, которая заполняется от 0% до 100%, когда пользователь скроллит вниз по странице. Её можно реализовать при помощи анимации, движущей background-position элемента, привязанного к общей позиции скроллинга страницы. Реализация такой системы на CSS вместо JavaScript полезна для производительности.

Ещё одна важная ситуация, в которой пригодятся scroll-driven animation — это воспроизведение анимации при попадании элемента во viewport (и выходе из него). Вы можете в большой степени управлять подробностями, например, моментом начала и конца анимации в зависимости от степени видимости элемента.

Поддержка

Поддержка браузерами

✅ Chrome и коллеги

❌ Safari

? Firefox

Progressive Enhancement?

Да — эти эффекты обычно оказываются визуальными дополнениями, а не обязательной функциональностью.

Polyfill

Да

Простой пример использования

Вот демо с зумом изображения при скроллинге страницы: https://codepen.io/chriscoyier/pen/MWxaxVQ/1dbc568d8f8404b5c9ba2fe6388bca0d

ANCHOR POSITIONING

Что такое Anchor Positioning?

Anchor positioning позволяет размещать элементы относительно того, где находится другой элемент. В такой формулировке звучит довольно очевидно, но такова их функциональность. Мы объявляем элемент с anchor и даём ему название, а затем можем позиционировать элементы сверху/справа/снизу/слева (или по центру, или логические эквиваленты) от anchor.

Когда это должно быть важно?

Освоившись с ними, вам придётся меньше заботиться о том, как DOM позиционирует элементы (если учитывать вопросы accessibility). На текущий момент позиционируемый относительно другого элемент должен быть дочерним элементом; также необходимо существование контекста позиционирования, в котором он должен работать. Это может определять, где элементы будут находиться в DOM.

Это будет очень полезно для реализации подсказок и пользовательских контекстных меню.

Поддержка

Поддержка браузерами

? Chrome и коллеги

❌ Safari

❌ Firefox

Progressive Enhancement?

Возможно, если вы допускаете совершенно разные позиции элементов.

Polyfill

Да

Простой пример использования

На момент публикации он работал только в Chrome Canary со включенным флагом «Experimental Web Platform Features».

SCOPING

Что такое Scoped CSS?

Области видимости (Scoping) в CSS реализованы в виде правил @scope, объявляющих, что блок CSS применяется только к конкретному селектору. И опционально перестаёт применяться к другому конкретному селектору.

Когда это должно быть важно?

Можно задавать области видимости CSS, применяя класс и организовав вложенность в этом классе. Но у @scope есть некоторые интересные особенности. «Пончиковая» область видимости обладает уникальной способностью:

@scope (.card) to (.markdown-output) {
  h2 {
    background: tan; /* прекратить делать это, когда мы доберёмся до Markdown */
  }
}

Ещё одна полезная возможность — более логичная proximity-стилизация. Это довольно сложно объяснить, но когда вы это поймёте, то всегда будете обращать внимание. Возьмём для примера темы. У вас есть селектор .dark и селектор .light. Если вы всегда применяете их только к странице целиком, то всё в порядке, но если вам оказывается нужно встроить их, потому что они имеют одинаковую специфику, то тот, который вы определите позже, будет более сильным и может «победить», даже если это не имеет смысла. Минимальный пример:

.purple-paragraphs p { color: purple; }
.red-paragraphs p { color: red; }
<div class="purple-paragraphs">
  <div class="red-paragraphs">
    <div class="purple-paragraphs">
       <p>some text</p>
    </div>
  </div>
</div>

Можно подумать, что элемент paragraph здесь будет иметь цвет purple, но на самом деле он будет красным. Это очень неудобно, но исправимо при помощи @scope. При совпадении селекторов с областью видимости, как сказал Bramus, «они оба взвешиваются по близости к корню области видимости», а поскольку здесь ближе light, он и победит.

Однако мой любимый пример — это возможность добавить в DOM тег <style>, а затем применить стили с областью видимости только к этой части DOM без необходимости давать имена.

<div class="my-cool-component">
  <style>
    @scope {
      :scope { /* выбирает верхний div без необходимости выбора его по классу или чему-то ещё */
      }
      .card {
      }
    }
  </style>

  <article class="card">
  </article>
</div>

Поддержка

Поддержка браузерами

✅ Chrome

✅ Safari

❌ Firefox

Progressive Enhancement?

Нет

Polyfill

Нет

Простой пример использования

CASCADE LAYERS

Что такое слои?

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

<body id="home">
@layer base {
  body#home {
    margin: 0;
    background: #eee;
  }
}

body {
  background: white;
}

Мы привыкли думать, что body#home — гораздо более мощный селектор, а значит, фон будет иметь цвет #eee. Но поскольку здесь присутствуют стили без слоёв, они победят и сделают фон white.

Можно создавать любое количество слоёв и заранее их упорядочивать. Думаю, создание слоёв с большой вероятностью станет оптимальным решением для реализуемых с нуля проектов и примет примерно такой вид:

@layer reset, default, themes, patterns, layouts, components, utilities;

Тонкость заключается в том, что правила !important в более низких слоях на самом деле сильнее.

Когда это должно быть важно?

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

Например, одним ключевым словом layer можно поместить на нижний уровень весь Bootstrap, а все написанные вами после этого стили будут выигрывать, даже если сам Bootstrap использует селектор с большей силой.

@import url("https://cdn.com/bootstrap.css") layer;

h5 {
  margin-bottom: 2rem;
}

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Нет

Polyfill

Да

Простой пример использования

ЛОГИЧЕСКИЕ СВОЙСТВА

Что такое логические свойства?

Логические свойства (logical properties) — это альтернативы свойствам, указывающим направление. Например, в языке с написанием слева направо наподобие английского или русского направление inline горизонтально, а направление block вертикально, поэтому margin-right эквивалентно margin-inline-end, а margin-top эквивалентно margin-block-start. В языках с написанием справа налево наподобие арабского margin-inline-end меняется на эквивалент margin-left, потому что это сторона конца inline-потока элементов. Существует множество свойств и значений CSS, имеющих подобный компонент направления (border, padding, offset, set), поэтому сложность заключается в том, чтобы разобраться в потоке inline и block, а также использовать корректное значение start или end.

Когда это должно быть важно?

Часто при объявлении информации о направлении в CSS вы подразумеваете «в направлении inline текста». Это может показаться странным, но представьте кнопку и пространство между значком и текстом. Если применить к значку margin-right, чтобы отодвинуть его от текста, то при переводе страницы на язык с написанием справа налево это пространство будет находиться не на той стороне значка. На самом деле вы подразумевали margin-inline-end значка. Если закодировать сторону при помощи логических свойств, страница будет лучше автоматически переводиться без написания дополнительного условного кода.

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Необходимо будет использовать @supports и unset для удаления fallback-значения и сброса при помощи логического свойства, но это возможно.

Polyfill

Не могу гарантировать этого, но существует опция обработки.

Простой пример использования

ЦВЕТА P3

Что такое цветовое пространство Display P3?

Мы привыкли к использованию в вебе цветового пространства sRGB. Именно оно используется в шестнадцатеричных значениях цветов и в функциях rgb()hsl() и hsb(). Сегодня многие дисплеи могут отображать гораздо более широкий диапазон цветов, чем способно описать sRGB, поэтому нам не хочется быть ограниченными только этим цветовым пространством. Цветовое пространство Display P3 примерно на 50% шире sRGB, оно расширяется в направлении более насыщенных и ярких цветов. Новые функции CSS, способные даже использовать различные цветовые модели, обладающие собственными полезными свойствами, позволяют нам объявлять цвета в этом пространстве.

Когда это должно быть важно?

Если вы хотите использовать достаточно яркие цвета, то вам потребуется задействовать цвета в цветовом пространстве P3. Для этого можно использовать новые цветовые модели (и функции), которые также полезны во множестве других аспектов.

Например, функция oklch() (а значит, и цветовая модель OKLCH) может отображать любой цвет, который может отображать любой другой метод (плюс P3); она примерно так же удобна для чтения, как и hsl(), и имеет «равномерную воспринимаемую яркость», из-за чего первое число (lightness) ведёт себя гораздо более предсказуемо, нежели в hsl(). Это ужасно удобно для работы с цветом в вебе. Но это не единственная новая цветовая модель и функция! Лично я считаю, что в общем случае для градиентов лучше всего подходит цветовая модель oklab.

Поддержка

Поддержка браузерами

Полная (см., например, oklab)

Progressive Enhancement?

Да — можно объявлять fallback-цвета, при этом дисплеи, не умеющие отображать объявленные вами цвета, вернутся к ограниченному диапазону.

Polyfill

Да

Простой пример использования

Можете редактировать эти блоки <style>, потому что я сделал их display: block; и contenteditable:

СМЕШЕНИЕ ЦВЕТОВ

Что такое color-mix()?

Функция color-mix() в CSS позволяет, как можно догадаться, смешивать цвета. Такая функциональность уже давно присутствовала в инструментах обработки CSS и, как это часто бывает в эволюции CSS, теперь она стала нативным CSS.

Когда это должно быть важно?

Вам когда-нибудь нужно было затенить или осветлить на лету уже имеющийся цвет? Это способна сделать color-mix(). Смещение цветов может выполняться в конкретной цветовой модели, то есть вы можете воспользоваться преимуществами этой модели. Например, из-за перцептивно равномерной яркости OKLCH логично использовать её для настройки яркости. При помощи color-mix() можно создавать целые цветовые палитры.

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Да, можно объявлять fallback-цвета

Polyfill

Вероятно, но я не знаю точно.

Простой пример использования

MARGIN TRIM

Что такое margin-trim?

Свойство margin-trim удаляет все margin в указанном направлении от выбранного контейнера в конце этого направления. Представьте, что у вас идут пять блоков подряд и у всех них есть в контейнере правый margin. Можно выбрать :last-child, чтобы удалить правый margin. При помощи margin-trim можно обеспечить удаление margin из самого родительского элемента.

.container {
  /* предотвращает появление "лишнего" margin в конце элемента */
  margin-trim: block-end;

  /* виновником может быть подобный элемент, но это может быть и что угодно */
  > p {
    margin-block-end: 1rem;
  }
}

Когда это должно быть важно?

Вы знаете, насколько великолепно свойство gap в flexbox и grid? Оно оставляет пространство только между элементами. Если вам нужно оставить пространств между элементами, но вы находитесь в положении, когда невозможно использовать gap, то margin-trim ужасно удобно, потому что с его помощью вы применяете margin направления ко всем дочерним элементам и не волнуетесь о том, что какой-то дополнительный сложный селектор выберет первый или последний и удалит этот ненужный последний margin. Возможно, это даже станет best practice.

Поддержка

Поддержка браузерами

✅ Safari

❌ Chrome

❌ Firefox

Progressive Enhancement?

Да. Немного лишнего места обычно не становится особой проблемой.

Polyfill

Нет

Простой пример использования

Распространённым примером здесь может послужить последний параграф, когда его нижний margin создаёт внизу больше пространства, чем со всех других краёв. Благодаря margin-trim мы можем гарантировать, что он обрезан, без необходимости выбора этого последнего параграфа и его ручного удаления.

TEXT WRAPPING

Что такое text-wrap?

Вероятно, вы не помните, что делает свойство text-wrap. Оно способно делать text-wrap: nowrap;, но мы обычно используем для этого white-space: nowrap;. Но теперь у text-wrap есть две новые возможности:

  • text-wrap: balance; — попытка создания строк одинаковой ширины при переносе текста.

  • text-wrap: pretty; — избегание «сирот».

Когда это должно быть важно?

Заголовок, одно слово которого перенеслось на следующую строку и стало «сиротой», выглядит очень некрасиво. Раньше не было идеального способа решения этой проблемы, если не использовать неуклюжие трюки наподобие вставки &nbsp; вместо обычного пробела между последними двумя cловами. Балансировка заголовка позволяет предотвратить это, но кроме того и пытается сделать множественные строки текста одинаковой ширины. Использование pretty больше подходит для предотвращения появления «сирот», так что его можно использовать и для текста тела.

Поддержка

Поддержка браузерами

Зависит от значения. balance достаточно хорошо поддерживается или скоро будет поддерживаться всеми браузерами. С pretty ситуация чуть хуже.

Progressive Enhancement?

Да. Несмотря на небольшое снижение эстетичности, переносы строк и слов не представляют особой проблемы, потому если свойство не работает, это не так важно.

Polyfill

Да

Простой пример использования

SUBGRID

Что такое Subgrid?

Subgrid — это опциональная часть применения grid в CSS, которая важна, когда вы встраиваете сеточные элементы. Задав значение grid-template-columns: subgrid; или grid-template-rows: subgrid; для элемента уровня grid, вы говорите «наследуй эти столбцы или строки из моего родительского grid там, где это релевантно».

Когда это должно быть важно?

Смысл использования grid при создании структуры, по сути, заключается в выравнивании. Без subgrid дочерние элементы не будут иметь доступ к строкам grid родительского grid, а значит, не смогут и выравнивать элементы. Subgrid позволяет заполнить этот пробел. Когда вложенность DOM важна для функциональности или accessibility, например, как в <form>, subgrid может обеспечить правильное выравнивание элементов.

Поддержка

Поддержка браузерами

Полная

Progressive Enhancement?

Да, можно выполнить fallback к определению собственных строк grid, и это работает хорошо, если не идеально.

Polyfill

Нет. Существует grid polyfill, но он не делает subgrid.

Простой пример использования

За чем стоит следить

Похоже, развитие CSS и не думает притормаживать. Есть множество аспектов, за которыми стоит наблюдать и ждать.

  • CSS Mixins & Functions — настоящие примеси и функции, принимающие параметры

  • Relative Color Syntax — способ манипулирования частями цветов интуитивно понятным и мощным образом.

  • Interop 2024 — всё, на что мы можем сделать ставку для обеспечения в ближайшем времени кроссбраузерной совместимости, в том числе и описанный выше relative color syntax.

  • Свойство CSS field-sizing должно помочь в решении давней и сложной проблемы автоматического изменения размеров элементов формы, например, textarea и input, под содержащийся в них контент.

  • <selectmenu> в HTML — это, по сути полностью стилизуемый через CSS <select>, и это очень круто.

Комментарии (11)


  1. Spaceoddity
    31.05.2024 20:24
    +5

    Из современных веб-технологий, CSS - наверное, самая активно развиваемая. За условные 10 лет прогресс просто фантастический (даже по сравнению с предыдущим десятилетием)...
    Это, безусловно, радует))

    Обратная сторона - порог вхождения, разумеется, остался очень низким ("не ЯП"), но вот полноценное освоение - задача далеко не тривиальная... Ещё и не для каждого ума подойдёт со своими абстракциями. Не даром же появились всякие CSS-in-JS...

    Кое-что, конечно, выглядит как "поход на поводу" - нестинг, слои вот мне кажутся несколько надуманными (и куда же без костылей с !important)... Но интерфейсы усложняются - очень сложно порой бывает навести порядок в огромном количестве стилей. Так что пущай будет))


  1. Turbocat6413
    31.05.2024 20:24
    +2

    View Transitions API уже доступен в Safari TP, исправьте поддержку на soon =)


  1. y_mur
    31.05.2024 20:24
    +6

    Понравилось ваше структурирование информации!
    Начиная с уточнения года прямо в названии! (а то часто находишь в сети такую "современную" заметку, а потом оказывается что ей уже 10 лет).
    И то, как информация разложена по полочкам.
    Что хотелось бы улучшить:
    - на тач-экране пример с "Resize Me" не ресайзится, а в примере CONTAINER QUERIES разделитель перемещается  коряво, имхо мобильный интернет сейчас популярен и хочется чтобы примеры это учитывали;
    - в примере VIEW TRANSITIONS кнопки "+", "-" маленькие и расположены так что в режиме 1х их не видно даже при скролинге;
    - в примере SUBGRID потерялась картинка.
    А в остальном статья порадовала - спасибо!


    1. Mingun
      31.05.2024 20:24

      А ещё примеры хорошо бы разделить по зонам ответственности. А то, например, для демонстрации новых цветовых моделей, которые поддерживаются (с оговорками: например, в градиентах интерполяция в цветовом пространстве в принципе не поддерживается) в Firefox 115.11.0esr (последняя поддерживаемая версия Firefox для windows 7, то есть, обновиться дальше нет возможности), используется возможность @scope, которая в указанном Firefox как раз и не поддерживается. В результате кажется, что не поддерживается цветовая модель.


  1. serginho
    31.05.2024 20:24
    +5

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


  1. NeiroNext
    31.05.2024 20:24

    Столько интересных и полезных "вкусностей" добавилось, большое спасибо за то, что разложили все в удобном виде и отельное спасибо за примеры на Codepen!

    Очень желанным было Container Queries, часто хотелось иметь возможность опираться от размера контейнера, а не всего окна. Также слои показались очень удобными, позволяющими избавиться от "грязной" стилизации, в попытке побороть стилизацию сторонних плагинов.

    И вроде мелочь, но довольная приятная, это вложенность в написании правил, очень этого не хватало в чистом CSS, отчасти из-за этого все ближе момент, когда всяческие Sass, Stylus и подобное, будет просто не нужным.

    На самом деле каждая описанная функциональность довольно приятна!


  1. ImagineTables
    31.05.2024 20:24
    +8

    Кажется, CSS уже начинает прогибаться под своей тяжестью.

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

    1cqw — это 1% от ширины контейнера (хотя я бы рекомендовал использовать вместо них cqi

    …у меня начинается лёгкая истерика. Ещё лет десять назад было предложено расширение с 1%%, но, конечно, это слишком очевидно, давайте лучше сделаем 1cqw (при этом будем рекомендовать использовать 1cqi).


    1. nuclearmotherfucker
      31.05.2024 20:24

      Главное чтобы браузеры не начали прогибаться под этой тяжестью. А то кроссбраузерность заиграет новыми красками. Хватит уже, понатерпелись :)


    1. shitpoet
      31.05.2024 20:24

      cqw и cqh позволяют выбрать ось, хотя %% действительно интересное предложение


      1. ImagineTables
        31.05.2024 20:24

        «Конь с двумя процентами — это ещё что» (ц), есть отклонённые пропозалы и поинтереснее. Лично мне нравится вёрстка <div #myid .myclass1.myclass2>. Но сторонники временно (как им кажется) развоплощённого тёмного мага Зюмиэля настояли на тупорылом копипасте строгом использовании атрибутов.


  1. nuclearmotherfucker
    31.05.2024 20:24

    Container Units... радость то какая, радость!!! Дожили.
    И поддержка вложенности блоков в css это тоже круто, но уже и не помню когда я чистый css использовал.

    Читаешь и умиляешься, вспоминая как резал картиночки чтобы в ie кругленькие бордеры сделать. Эх.
    Всё, что не с полной поддержкой браузерами на мой взгляд в этой статье лишнее.