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

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

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

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

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

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

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

красный автобус

Компания redBus поддерживает и предоставляет различный код для мобильной и десктопной версий своих сайтов. После внедрения запросов к контейнерам на страницах «Чем заняться» и «Грузоперевозки» им удалось объединить этот код в единую кодовую базу для этих сайтов. Это сделало их адаптивными и сэкономило время на разработке. Следующий пример демонстрирует это на примере страницы «Грузоперевозки»:

Код

В следующем примере .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 родительского элемента. В латинских языках, таких как английский, это будет ширина родительского контейнера, поскольку текст располагается в одну строку слева направо.

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() .