CSS @scope: альтернатива соглашениям об именах и тяжелым абстракциям – Smashing Magazine

CSS @scope: альтернатива соглашениям об именах и тяжелым абстракциям – Smashing Magazine


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

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

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

Однако в реальном мире не всегда так получается. Приоритеты могут измениться, и реализация станет несовместимой с этими изменениями. Небольшие изменения в структуре HTML могут потребовать нескольких изменений имени класса CSS. В высокоинтерактивных интерфейсных приложениях имена классов, соответствующие шаблону БЭМ, могут стать длинными и громоздкими (например, app-user-overview__status--is-authenticating), а несоблюдение правил именования в полной мере нарушает структуру системы, сводя на нет ее преимущества.

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

Разработчики больше полагаются на утилиты

Откуда мы знаем, что некоторые разработчики готовы избегать каскадных стилей? Это появление «современных» интерфейсных инструментов, таких как фреймворки CSS-in-JS, разработанных специально для этой цели. Работа с разными стилями, ограниченными конкретными компонентами, может показаться глотком свежего воздуха. Это избавляет от необходимости давать названия вещам (по-прежнему одна из самых ненавистных и трудоемких задач интерфейса) и позволяет разработчикам работать продуктивно без необходимости полностью понимать или использовать преимущества наследования CSS.

Но пропуск каскада CSS имеет свои проблемы. Например, составление стилей в JavaScript требует сложной настройки сборки, и часто стили неудобно смешиваются с разметкой компонентов или HTML. Вместо тщательно продуманных соглашений об именах мы позволяем инструментам автоматически генерировать для нас селекторы и идентификаторы (например, .jsx-3130221066), требуя от разработчиков использовать другой псевдоязык. (Как будто когнитивная нагрузка понимания всех компонентов вашего useEffectСделать это уже было недостаточно!)

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

Это почти как если бы нам нужно разработать инструменты для отладки инструментов, которые мы используем, вместо того, чтобы абстрагировать инструменты, которые уже предоставляет Интернет — и все это для того, чтобы избежать «боли» написания стандартного CSS.

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

CSS @scope по правилам

Я считаю CSS @scope по правилам Чтобы стать потенциальным лекарством от беспокойства, вызванного утечкой стилей, которое мы рассмотрели, это не заставляет нас жертвовать основными веб-преимуществами ради абстракции и дополнительных инструментов сборки.

@scope CSS-код «правило за правилом» позволяет выбирать элементы в определенных поддеревьях DOM, точно нацеливать элементы без написания гиперспецифичных селекторов, которые трудно переопределить, и без слишком жесткой привязки селекторов к структуре DOM.

– МДН

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

Кроме того, он имеет отличное покрытие браузера. Фактически, в Firefox 146 добавлена ​​поддержка @scope В декабре он впервые стал совместим с Baseline. Вот простое сравнение кнопок, использующих шаблон БЭМ, и кнопок @scope Правило:

 



 



@scope Правила это позволяют точность с меньшей сложностью. Разработчикам больше не нужно создавать границы, используя имена классов, что, в свою очередь, позволяет им писать селекторы на основе собственных элементов HTML, устраняя необходимость в предписывающих шаблонах имен классов CSS. Устранив необходимость управления именами классов, @scope Может уменьшить страх, связанный с CSS в крупных проектах.

основная функция

Для начала добавьте @scope Создайте правило в своем CSS и поместите корневой селектор, который будет иметь область действия стилей:

@scope () {
  /* Styles scoped to the  */
}

Так, например, если мы хотим расширить область применения стилей



Leave a Reply

Your email address will not be published. Required fields are marked *