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

Света Гопалакришнан
Swetha Gopalakrishnan
Саурабх Раджпал
Saurabh Rajpal

Запросы контейнеров предлагают очень динамичный и гибкий подход к адаптивному дизайну. Запросы контейнеров используют @container at-rule. Это работает аналогично медиа-запросу с @media , но вместо этого @container запрашивает родительский контейнер для информации о стиле, а не область просмотра и пользовательский агент.

Запросы контейнеров являются частью Baseline Newly Available .

Browser Support

  • Хром: 105.
  • Край: 105.
  • Firefox: 110.
  • Сафари: 16.

Source

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

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

Изображение, демонстрирующее, как разные типы укладок работают вместе.
web.dev — Новый адаптивный.

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

redBus

redBus поддерживает и обслуживает разный код для своих мобильных и настольных версий. После внедрения контейнерных запросов на своих страницах Things-to-do и cargo они смогли объединить этот код в единую кодовую базу для этих сайтов. Это сделало их отзывчивыми и сэкономило время разработки. Следующий пример демонстрирует это с использованием страницы cargo:

Код

В следующем примере .bpdpCardWrapper — родительский контейнер, названный bpdpSection .

Если контейнер bpdpSection имеет минимальную ширину 744 пикселя, обновляются font-size и line-height для компонентов, выбранных с помощью .bpdpCardContainer и .subTxt, .bpdpAddress .

//Code for Container Queries
.bpdpCardWrapper {
   container-type: inline-size;
   container-name: bpdpSection;
}
@container bpdpSection (min-width: 744px){
   .bpdpCardContainer{
      font-size: 1rem;
      line-height: 1.5rem;
   }

   .subTxt, .bpdpAddress{
       font-size: 0.875rem;
       line-height: 1.25rem;
   }
}

Влияние

До (множественная кодовая база) После (единая кодовая база)
Инфраструктура Отдельная инфраструктура (высокая стоимость). Та же инфраструктура (снижение стоимости).
Дизайн Отдельный пользовательский интерфейс, но плохая согласованность. Решить эту задачу сложно, но возможно.
Производительность Прост в использовании, так как система является отдельной, но дублирует усилия по улучшению производительности. Это касается конкретной страницы и функции, но оценка PageSpeedInsights от redBus превышает 80.
Разработка Отдельные команды разработчиков. Сокращение времени на 30% - 40%.

Токопедия

Страницы с описанием продукта (PDP) Tokopedia содержат несколько вкладок для информации о магазине и продукте. Раньше макет этой страницы был разделен на три колонки, а иногда название продукта слева было обрезано для меньших размеров экрана (см. следующее видео «До»).

Чтобы решить эту проблему с макетом, они легко и быстро приняли контейнерные запросы. После этой реализации они смогли иметь гибкий макет, где название продукта всегда было полностью видно (см. следующее видео «После»).

До

Перед реализацией запросов контейнеров слова «ISKU 10 in 1 Obeng satu..» в левом верхнем углу обрезаются для меньших размеров экрана.

После

Реализация контейнерных запросов корректирует макет, сохраняя текст в пределах области просмотра.

Код

Следующий код запрашивает размер родительского контейнера с именем infowrapper . Если максимальная ширина infowrapper составляет 360 пикселей, то width , margin, и padding дочерних компонентов корректируются.

Установка container-type в inline-size запрашивает размер inline-direction родительского элемента. В латинских языках, таких как английский, это будет ширина родительского контейнера, поскольку текст течет inline слева направо.

export const styCredibilityContainer = css`
  container-name: infowrapper;
  container-type: inline-size;
`;

export const styBtnShopFollow = css`
  margin-left: auto;
  width: 98px;
  @container infowrapper (max-width: 360px) {
    width: 100%;
    margin-top: 2px;
    margin-bottom: 8px;
    padding-left: 60px;
  }
`;

export const styBottomRow = css`
  margin-top: 4px;
  padding-left: 60px;
  display: flex;
  align-items: center;

  @container infowrapper (max-width: 360px) {
    padding-left: 0px;
  }

  > div {
    text-align: left;
    margin-top: 0 !important;
  }
`;

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

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

Еще один хороший вариант использования контейнерных запросов для сайтов электронной коммерции — поиск повторно используемых компонентов. Например, кнопка «Добавить в корзину » может отображаться по-разному в зависимости от родительского контейнера (например, только значок, если он находится в карточке продукта, и значок с текстом, если это основной призыв к действию на странице). Кнопка может быть хорошим кандидатом для контейнерных запросов.

Вы можете выбрать поэтапные улучшения вашего сайта. Например, вы можете начать с небольших вариантов использования, таких как пример эллипса из Tokopedia, и реализовать там запросы контейнера. Затем постепенно найдите больше вариантов и улучшите CSS.

Ресурсы:

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