Atomic CSS: верстка и легкость бытия

Валентин Ульянов

Atomic CSS:
верстка и легкость бытия

Валентин Ульянов

Обо мне

Фото Валентина Ульянова

Я и Atomic CSS

Я и Atomic CSS

Я и Atomic CSS

Я и Atomic CSS

Содержание

Проблемы верстки

Скриншот сайта БЭМ в 2018
Слайд из старого доклада про БЭМ

Стандартные вопросы БЭМ

Стандартные вопросы БЭМ

Стандартные вопросы БЭМ

Продвинутые вопросы БЭМ

Продвинутые вопросы БЭМ

Продвинутые вопросы БЭМ

Скриншот с bem-tools
Код CSS-in-JS

Современные подходы к CSS

Современные подходы к CSS

Современные подходы к CSS

Scoped-решения

Scoped-решения

Scoped-решения

Scoped-решения

Scoped-решения

*Иногда можно сделать аглификацию, но это не точно

CSS-in-JS

CSS-in-JS

CSS-in-JS

CSS-in-JS

CSS-in-JS

*При рантайм-решениях

Shadow DOM

Shadow DOM

Shadow DOM

*Declarative shadow DOM поддерживается, но не идеально
Мой путь от БЭМ к Atomic CSS
Пример кода с Atomic CSS
Мем с Вилли Вонкой
Мем Дикаприо с вином

Почему Atomic CSS

Почему Atomic CSS

Почему Atomic CSS

Почему Atomic CSS

% использования Tailwind за последине годы в State Of CSS
Сайт Lemon Squeezy
Сайт The Verge

Atomic CSS как решение

Экономия мыслетоплива

Блок с сайта погоды

Экономия мыслетоплива

Блок с сайта погоды

forecast-briefly__day-link

Как назвать? 🤔

Блок с сайта погоды

Как назвать? 🤔

Блок с сайта погоды

fact__hour

Как назвать? 😉

Блок с сайта погоды

D-ib Mnw9u P0;9 Txa

Как назвать? 🥲

Блок с сайта погоды

Как назвать? 🥲

Блок с сайта погоды

sc-a9fb3bce-4

Малый размер стилей

График уменьшения размера CSS при переходе на Atomic
Пример уменьшения размера CSS при переходе на Atomic
Сравнения размера CSS популярных сайтов от Yahoo

From styled-components to Tailwind

График улучшения метрики INP в Web Vitals

Скорость разработки

Your productivity is incredibly high because your brain doesn’t need to context switch between markup and stylesheet.

Simon Vrachliotis
Full re-write in 10 days with tachyons and functional CSS: A case study

...we have seen a significant improvement in our development speed and the feedback has generally been positive.

Nikola Novak
Optimising Style for Speed: Our Journey from styled-components to Tailwind CSS
Мем: сложна
mlut

Atomic CSS toolkit with Sass and ergonomics for creating styles of any complexity

Сокращения

Мем с Гарольдом: лаконичный код, удобнее писать

Сокращения

Алгоритм сокращений

Алгоритм сокращений

Общий алгоритм сокращений кратко

  1. Находим свойства, которые начинаются с одинаковой буквы

Общий алгоритм сокращений кратко

  1. Находим свойства, которые начинаются с одинаковой буквы
  2. Составляем их рейтинг

Общий алгоритм сокращений кратко

  1. Находим свойства, которые начинаются с одинаковой буквы
  2. Составляем их рейтинг
  3. Выделяем группы

Общий алгоритм сокращений кратко

  1. Находим свойства, которые начинаются с одинаковой буквы
  2. Составляем их рейтинг
  3. Выделяем группы
  4. Составляем сокращения внутри групп
Скриншот таблицы CSS свойств

I. Алгоритм сокращения одной сущности

Название сокращаем до первой буквы свойства/значения

color => C

II. Алгоритм сокращения одной сущности

Если название из N слов, то берется первая буква из каждого слова

color-adjust => Ca

III. Алгоритм сокращения одной сущности

Если два названия имеют одну и ту же начальную букву, то в следующем названии при сортировке их по рейтингу добавляется буква

III. Алгоритм сокращения одной сущности

Если два названия имеют одну и ту же начальную букву, то в следующем названии при сортировке их по рейтингу добавляется буква

  1. color => C
  2. cursor => Cs

IV. Алгоритм сокращения одной сущности

Если название из N слов, то буква добавляется в соответствующем по порядку слове

IV. Алгоритм сокращения одной сущности

Если название из N слов, то буква добавляется в соответствующем по порядку слове

  1. color => C
  2. cursor => Cs
  3. color-scheme => Csc

I. Порядок добавления буквы

Согласная следующего слога

cursor => Cs

I. Порядок добавления буквы

Согласная следующего слога

cursor => Cs

Если следующий слог начинается на гласную, то берется ближайшая предыдущая согласная от нее

II. Порядок добавления буквы

Следующая согласная

  1. content => Сt
  2. contain => Cn

III. Порядок добавления буквы

Следующая гласная (без перескока через согласную)

  1. content => Сt
  2. counter-increment => Coi

Ai

Ai =>
align-items

Txt

Txt =>
text-transform

Ts

Ts => transition

Fls

Fls =>
flex-shrink

Utility components syntax

Синтаксис, в котором утилита разделяется на компоненты, каждый из которых, соответствует части CSS-правила

Utility components syntax

@:ah_O1_h

Utility components syntax

@:ah_O1_h =>

				@media (any-hover) {
				 
				 
				 
				}
			

Utility components syntax

@:ah_O1_h =>

				@media (any-hover) {
				  .\@\:ah_O1_h { 
				 
				  }
				}
			

Utility components syntax

@:ah_O1_h =>

				@media (any-hover) {
				  .\@\:ah_O1_h { 
				    opacity: 1
				  }
				}
			

Utility components syntax

@:ah_O1_h =>

				@media (any-hover) {
				  .\@\:ah_O1_h:hover {
				    opacity: 1
				  }
				}
			
Схема components syntax
  1. CSS at-rule: брейкпоинты, @supports, etc.
Схема components syntax
  1. CSS at-rule: брейкпоинты, @supports, etc.
  2. pre-states — часть селектора перед классом утилиты
Схема components syntax
  1. CSS at-rule: брейкпоинты, @supports, etc.
  2. pre-states — часть селектора перед классом утилиты
  3. Имя
  4. Значение
Схема components syntax
  1. CSS at-rule: брейкпоинты, @supports, etc.
  2. pre-states — часть селектора перед классом утилиты
  3. Имя
  4. Значение
  5. post-states — часть селектора после класса утилиты

Мифы

То же самое, что inline-стили

Короткий ответ — нет

Длинный ответ

Это для тех, кто плохо знает CSS

Atomic CSS — низкоуровневый

Чем лучше вы знаете CSS...

Код без сокращенного свойства
Код без сокращенного свойства
Код с сокращенным свойством
Код без без множественного селектора
Код без без множественного селектора
Bgc-red_h,fv
Код без без множественного селектора
Bgc-red_h,fv =>
				.Bgc-red_h\,fv:hover,
				.Bgc-red_h\,fv:focus-visible {
				  background-color: red
				}
			

@s:apcr4/3@:dm_Mxw40u

@s:apcr4/3@:dm_Mxw40u =>

				@supports (aspect-ratio: 4/3) {
				 
				 
				 
				 
				 
				}
			

@s:apcr4/3@:dm_Mxw40u =>

				@supports (aspect-ratio: 4/3) {
				  @media (display-mode: fullscreen) {
				 
				 
				 
				  }
				}
			

@s:apcr4/3@:dm_Mxw40u =>

				@supports (aspect-ratio: 4/3) {
				  @media (display-mode: fullscreen) {
				    .\@s\:apcr4\/3\@\:dm_Mxw40u {
				 
				    }
				  }
				}
			

@s:apcr4/3@:dm_Mxw40u =>

				@supports (aspect-ratio: 4/3) {
				  @media (display-mode: fullscreen) {
				    .\@s\:apcr4\/3\@\:dm_Mxw40u {
				      max-width: 10rem
				    }
				  }
				}
			

Проблематично реиспользовать стили, особенно вне компонентов

@apply

Код объявления алиасов

Алиасы ✅

Код объявления алиасов

Алиасы ✅

Код объявления алиасов Код объявления алиасов
Но это похоже на CSS правила

Преимущества алиасов

Преимущества алиасов

Преимущества алиасов

Слишком длинные className

Сравнение длины class

Пример кода с сайта Яндекса

Сравнение длины class

Пример кода с сайта Хабра

Ml32_+:&

Ml32_+:& =>

				.Ml32_\+\:\& {
				  margin-left: 32px;
				}
			

Ml32_+:& =>

				.Ml32_\+\:\& + .Ml32_\+\:\& {
				  margin-left: 32px;
				}
			

Применение
на практике

Best practices

Best practices

Best practices

Custom properties

Прокидывание стилей

Компонент, который принимает сверху custom properties

Bgc-$cardBgc?#ccc

Bgc-$cardBgc?#ccc =>

				.Bgc-\$cardBgc\?\#ccc {
				  background-color: 
				}
			

Bgc-$cardBgc?#ccc =>

				.Bgc-\$cardBgc\?\#ccc {
				  background-color: var(--ml-cardBgc, #ccc);
				}
			

Прокидывание стилей

Использование компонента, который принимает сверху custom properties

lg_-CardImgWidth350

lg_-CardImgWidth350 =>

				@media (min-width: 992px) {
				  
				    
				  
				}
			

lg_-CardImgWidth350 =>

				@media (min-width: 992px) {
				  .lg_-CardImgWidth350 {
				    
				  }
				}
			

lg_-CardImgWidth350 =>

				@media (min-width: 992px) {
				  .lg_-CardImgWidth350 {
				    --ml-cardImgWidth: 350px;
				  }
				}
			

Прокидывание стилей

Использование компонента, который принимает сверху custom properties

Прокидывание сразу нескольких стилей

Компонент, который принимает custom properties в сокращенное свойство

Цвета и темы

Неправильная стилизация цветов компонента

Цвета и темы

Плохой вариант добавления темной темы для компонента

Цвета и темы

Правильная Стилизация цветов компонента

Цвета и темы: переключение

Простое переключение на темную тему

Современный CSS

Container queries

Каталог с карточками

Container queries

Код: каталог с карточками

Container queries

Каталог с карточками и сайдбар

Container queries

Код: использование container queries

Container queries

Каталог с карточками и сайдбар

@c:w>=520_Gtc-t2

@c:w>=520_Gtc-t2 =>

				@container (min-width: 520px) {
				  .\@c\:w\>\=520_Gtc-t2 {
				    grid-template-columns: repeat(2, minmax(0, 1fr);
				  }
				}
			
Кадр из фильма, где священник говорит: 'ну нафиг'

Псевдокласс :has()

Правило с :has() будет применено, если хотя бы 1 из селекторов, переданных агрументом в :has(), выберет хотя бы 1 элемент

Псевдокласс :has()

Форма с несколькими полями

Псевдокласс :has()

Разметка формы с несколькими полями

Псевдокласс :has()

Форма с несколькими полями и выделенным невалидным полем

Псевдокласс :has()

Разметка формы с несколькими полями

Ol3;red;dh_has(ui)

*Будет доступно в @mlut/core v2.2.0

Ol3;red;dh_has(ui) =>

				.Ol3\;red\;dh_has\(ui\):has(:user-invalid) {
				  outline: 3px red dashed;
				}
			
*Будет доступно в @mlut/core v2.2.0

Работа с контекстом

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

Работа с контекстом

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

Обозначается как ^ в синтаксисе утилит.

^:lc:>_D-f

^:lc:>_D-f =>

				.-Ctx:last-child > .\^\:lc\>_D-f {
				  display: flex
				}
			

Контекст

Контекст

Контекст

^one:h_C-red =>

				.-Ctx-one:hover  .\^one\:h_C-red {
				  color: red
				}
			

Техники работы с контекстом

Техники работы с контекстом

Техники работы с контекстом

Group state

Код карточки внутри ссылки

Group state

Карточка внутри ссылки

Group state

Карточка внутри ссылки

Group state

Код карточки внутри ссылки

Стилизация элемента компонента

Карточка внутри ссылки с измененными стилями кнопки

Стилизация элемента компонента

Код: карточка внутри ссылки с измененными стилями кнопки

Стилизация элемента компонента

Код: карточка внутри ссылки с измененными стилями кнопки Код: карточка внутри ссылки с измененными стилями кнопки

CSS-only-интерактивность

Форма с несколькими полями

CSS-only-интерактивность

Форма с несколькими полями и подсказкой к невалидному полю

CSS-only-интерактивность

Код формы с несколькими полями и подсказкой к невалидному полю

Кейсы

Большие проекты на Atomic CSS

Сайт The Verge

Большие проекты на Atomic CSS

Сайт Lemon Squeezy

Большие проекты на Atomic CSS

Сайт Yahoo

Заключение

Хорошо подходит для

Хорошо подходит для

Хорошо подходит для

Вряд ли подойдет для

Альтернативы

Альтернативы

Альтернативы

Логотип $mol

Инвестиционная история

Лучше день потерять, потом за 5 минут долететь

Выводы

Выводы

Выводы

Вопросы?

Валентин Ульянов Презентация: 150.lv/t/acss
Оцените доклад:
qr-код на обратную связь