Медиазапросы против контейнерных
Вопрос
Чем контейнерные запросы отличаются от медиазапросов и когда что использовать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Медиазапрос смотрит на viewport и свойства устройства, контейнерный на размер предка
Контейнер объявляется через `container-type: inline-size`, стили применяются к потомкам
Элемент не может запросить свой собственный размер
Каркас страницы и глобальные вещи на медиазапросах, внутренности компонентов на контейнерных
Медиа-фичи вроде `hover`, `pointer`, `prefers-reduced-motion` есть только у медиазапросов
Единицы `cqi` позволяют масштабировать размеры от контейнера
Что могут спросить следом
- Почему контейнеру нужно
inline-size, а не просто «любой элемент»? - Что будет, если контейнеров вложено несколько?
- Как сделать запрос к конкретному именованному контейнеру?
Разбор
Медиазапрос отвечает на вопрос «какой экран и какое устройство»: ширина viewport, наличие ховера, точность указателя, просьба уменьшить анимации. Контейнерный запрос отвечает на вопрос «сколько места у этого компонента». Чтобы он работал, предку задают container-type: inline-size, это включает изоляцию размера по ширине: ширина контейнера перестаёт зависеть от содержимого, и браузер может без цикла применить стили к потомкам. Поэтому элемент и не может запрашивать сам себя, правила работают для его детей. Если контейнеров несколько вложенных, запрос смотрит на ближайший подходящий, а через имя (container: sidebar / inline-size) можно обратиться к конкретному. На практике каркас страницы, меню и общие отступы делаю на медиазапросах, а карточки, виджеты и прочие переиспользуемые компоненты на контейнерных, тогда компонент выглядит правильно и в сайдбаре, и в модалке, и в основной колонке без знания о странице.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.