@container – at-правило похожее на @media, он дает нам возможность стилизовать теги в зависимости от размера их родительского тега

Если вы уже умеете работать с at-правилом @media, то для вас никаких проблем не составит освоить и at-правило @container. Основное правило состоит в том, что с помощью @media вы задаете стили отталкиваясь от размера окна браузера, а в @container вы можете задать стили отталкиваясь от размера какого-нибудь тега, который вы определили как контейнер.

Давайте на примере это разберем. Допустим у нас простая интернет страница состоящая из двух тегов:

с такими стилями:

Как видите, я для тега <section> указал ширину и высоту с помощью свойств max-width и max-height. И если max-width сразу принимает максимальный размер, если позволяет это окно браузера, то max-height ориентируется в первую очередь на теги внутри него: если их высота меньше или равна 1000px, то высота тега <section> будет равна сумме высоте тегов внутри него, а если их высота больше 1000px, то высота тега <section> будет равна 1000px.

Итак, мы хотим сделать так: если ширина тега <section> будет меньше 1000px, то цвет фона тега <article> станет серым. Для начала нам надо определить тег <section> как контейнер. Делается это просто с помощью свойства container-type.

Как вы могли заметить, в значении container-type я указал значение initial-size, с помощью которого мы объявляем данный тег как контейнер, и теперь можем отслеживать ширину этого тега. Также есть значение size, но о нем мы скоро поговорим.

Далее напишем at-правило @container, где при условии, что ширина тега <section> меньше 1000px, цвет фона тега <article> изменится на серый цвет.

Как видите, все очень похоже на at-правило @media.

А что будет, если в параметре container-type мы укажем значение size вместо initial-size.

Получилось, что тег <section> исчез, а цвет фона тега <article> стал серым. Почему так это произошло? Дело в том, что значение size отслеживает не только ширину тега, но и высоту тега. Но есть одно условие: на ширину и высоту тега не должны влиять теги, которые располагаются внутри него. В качестве ширины тега мы используем значение max-width, и на его ширину не влияют теги находящиеся внутри него, а вот на max-height уже влияют. Поэтому тег <section> исчезает, его ширина и высота становятся равным 0. Но условие в at-правиле выполняется, так как 0 меньше 1000px, и цвет фона тега <article> становится серым. Чтобы этого избежать, необходимо задавать значение высоты не max-height, а просто height, тогда его высота не будет зависеть от тегов внутри него.

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

Создадим еще тег <section> и <article>.

Зададим этим тегам такие стили:

Теперь мы должны задать имена этим двум контейнерам с помощью свойства container-name:

Далее с помощью at-правил @container задаем стили этим двум контейнерам:

Вот так все просто!)

А что будет если мы у первого правила удалим имя one? Тогда первое at-правило будет действовать на все существующие контейнеры, а второе только на контейнер с именем two.

Также вместо container-type и container-name мы можем использовать сокращенное свойство container.

Еще вы можете присвоить несколько имен одному контейнеру через пробел применять к нему разные стили:

At-правило @container поддерживает вложенность:

Данное at-правило сработает в том случае, если контейнер с именем two имеет ширину меньше 700px и его контейнер-предок имеет ширину меньше 1000px. Т.е. вложенный контейнер отвечает за тег-предка, который тоже является контейнером, и при выполнении двух условий стили заработают.

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

И теперь можно обращаться к этому контейнеру через его переменную:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *