Русский

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

Стилевые запросы к контейнерам CSS: Адаптивный дизайн на основе стилей для глобальных приложений

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

Что такое стилевые запросы к контейнерам CSS?

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

Представьте это так: вместо того, чтобы спрашивать «Ширина области просмотра больше 768px?», вы можете спросить «Установлено ли для этого контейнера пользовательское свойство --theme: dark;?». Это открывает целый новый мир возможностей для создания гибких и многократно используемых компонентов, которые могут бесшовно адаптироваться к различным темам, макетам или вариантам брендинга на вашем веб-сайте или в приложении.

Преимущества стилевых запросов к контейнерам

Как использовать стилевые запросы к контейнерам CSS

Вот пошаговое руководство по реализации стилевых запросов к контейнерам:

1. Настройка контейнера

Сначала вам нужно обозначить элемент как контейнер. Это можно сделать с помощью свойства container-type:

.container {
  container-type: inline-size;
}

Значение inline-size является наиболее распространенным и полезным, поскольку оно позволяет контейнеру запрашивать свой встроенный (горизонтальный) размер. Вы также можете использовать size, которое запрашивает как встроенный, так и блочный размер. Использование только size может иметь последствия для производительности, если вы не будете осторожны.

В качестве альтернативы используйте container-type: style, чтобы использовать контейнер только для стилевых запросов, а не для запросов по размеру, или container-type: size style для использования обоих. Чтобы управлять именем контейнера, используйте container-name: my-container, а затем обращайтесь к нему с помощью @container my-container (...).

2. Определение стилевых запросов

Теперь вы можете использовать at-правило @container style(), чтобы определить стили, которые применяются при выполнении определенного условия:

@container style(--theme: dark) {
  .component {
    background-color: #333;
    color: #fff;
  }
}

В этом примере стили внутри правила @container будут применены к элементу .component только в том случае, если для его содержащего элемента установлено пользовательское свойство --theme со значением dark.

3. Применение стилей к контейнеру

Наконец, вам нужно применить CSS-свойства, которые проверяют ваши стилевые запросы, к элементу-контейнеру:

<div class="container" style="--theme: dark;">
  <div class="component">This is a component. </div>
</div>

В этом примере у .component будет темный фон и белый текст, потому что к его контейнеру применен стиль --theme: dark; непосредственно в HTML (для простоты). Лучшей практикой является применение стилей через CSS-классы. Вы также можете использовать JavaScript для динамического изменения стилей контейнера, вызывая обновления стилевых запросов.

Практические примеры для глобальных приложений

1. Тематические компоненты

Представьте себе веб-сайт, который поддерживает несколько тем. Вы можете использовать стилевые запросы к контейнерам для автоматической настройки стилей компонентов в зависимости от активной темы.

/* CSS */
.app-container {
  --theme: light;
}

@container style(--theme: dark) {
  .card {
    background-color: #333;
    color: #fff;
  }
}

@container style(--theme: light) {
  .card {
    background-color: #f0f0f0;
    color: #333;
  }
}

/* HTML */
<div class="app-container" style="--theme: dark;">
  <div class="card">
    <h2>Card Title</h2>
    <p>Card content.</p>
  </div>
</div>

В этом примере компонент .card будет автоматически переключаться между темной и светлой темой в зависимости от свойства --theme его контейнера. Это очень полезно для сайтов, где пользователи могут выбирать разные темы в соответствии со своими предпочтениями.

2. Вариации макета

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

/* CSS */
.navigation {
  --layout: compact;
}

.footer {
  --layout: expanded;
}

@container style(--layout: compact) {
  .language-selector {
    /* Styles for compact dropdown */
  }
}

@container style(--layout: expanded) {
  .language-selector {
    /* Styles for full list of languages */
  }
}

/* HTML */
<nav class="navigation" style="--layout: compact;">
  <div class="language-selector">...

<footer class="footer" style="--layout: expanded;">
  <div class="language-selector">...

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

3. Адаптация к типу контента

Рассмотрим новостной сайт с краткими содержаниями статей. Вы можете использовать стилевые запросы к контейнерам для настройки представления кратких содержаний в зависимости от того, есть ли в них изображение или нет.

/* CSS */
.article-summary {
  --has-image: false;
}

@container style(--has-image: true) {
  .article-summary {
    display: grid;
    grid-template-columns: 1fr 2fr;
    gap: 1rem;
  }
}

/* HTML (with image) */
<div class="article-summary" style="--has-image: true;">
  <img src="..." alt="..." />
  <div>...
</div>

/* HTML (without image) */
<div class="article-summary" style="--has-image: false;">
  <div>...
</div>

Это позволяет добиться более визуально привлекательного и информативного представления кратких содержаний статей, улучшая пользовательский опыт. Обратите внимание, что установка свойства `--has-image` непосредственно в HTML не идеальна. Лучшим подходом было бы использование JavaScript для обнаружения наличия изображения и динамического добавления или удаления класса (например, `.has-image`) к элементу `.article-summary`, а затем установка пользовательского свойства `--has-image` в CSS-правиле для класса `.has-image`.

4. Локализованные стили

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

/* CSS */
.locale-container {
  --language: en;
}

@container style(--language: ja) {
  .text {
    font-size: 1.1em;
    letter-spacing: 0.05em;
  }
}

@container style(--language: ar) {
  .text {
    direction: rtl;
  }
}

/* HTML */
<div class="locale-container" style="--language: ja;">
  <p class="text">...</p>
</div>

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

5. Вопросы доступности

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

/* CSS */
body {
  --high-contrast: false;
}

@media (prefers-contrast: more) {
  body {
    --high-contrast: true;
  }
}

@container style(--high-contrast: true) {
  .component {
    background-color: black;
    color: white;
  }
}

/* HTML */
<div class="component">...

Это гарантирует, что ваш веб-сайт будет удобным и доступным для всех, независимо от их возможностей. Обратите внимание на использование медиазапроса `@media (prefers-contrast: more)` для определения режима высокой контрастности на уровне операционной системы, а затем на установку пользовательского свойства `--high-contrast`. Это позволяет вам вызывать изменения стиля с помощью стилевого запроса на основе системных настроек пользователя.

Лучшие практики

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

Стилевые запросы к контейнерам имеют отличную поддержку в современных браузерах, включая Chrome, Firefox, Safari и Edge. Однако старые браузеры могут не полностью поддерживать эту функцию. Обязательно используйте запросы возможностей для предоставления резервных стилей для этих браузеров или используйте полифил.

Заключение

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

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

Ресурсы