Интересный синтаксис CSS в последней версии Chrome CanaryContainer Queries
получил поддержку.
Chrome Canary: Ежедневные сборки для разработчиков, стоящих в авангарде сетевых технологий. Конечно, не обязательно стабильно
В последних версиях Chrome одно за другим поддерживались некоторые интересные свойства. В этой статье будут представлены некоторые интересные новые функции, которые мы можем постепенно использовать в современном макете новой эры. Из этой статьи вы сможете понять:
- в гибкой верстке
gap
Атрибуты - Управление свойствами соотношения сторон контейнера
aspect-ratio
- Макет водопада CSS Grid под Firefox (grid-template-rows: masonry)
- Запросы контейнера CSS
в гибкой версткеgap
Атрибуты
gap
Не новое свойство, оно всегда существовало в макетах с несколькими столбцами.multi-column
с сеткой, где:
-
column-gap
Свойства используются для установки макетов с несколькими столбцами.multi-column
Размер зазора между столбцами элементов в - в сетке
gap
Свойство используется для установки зазора между строками сетки и столбцами, это свойствоrow-gap
а такжеcolumn-gap
краткая форма , и первоначально называласьgrid-gap
Например, у нас есть следующееgrid
макет:
<div class="grid-container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
.grid-container {
display: grid;
border: 5px solid;
padding: 20px;
grid-template-columns: 1fr 1fr 1fr;
}
.item {
width: 100px;
height: 100px;
background: deeppink;
border: 2px solid #333;
}
Эффект следующий:
Даваяgrid-container
Добавить кgap
properties очень удобно задавать зазор между строками сетки и столбцами:
.grid-container {
display: grid;
border: 5px solid;
padding: 20px;
grid-template-columns: 1fr 1fr 1fr;
+ gap: 5px;
}
и изChromium 84чтобы начать, мы можем начать сflex
используется в макетеgap
Атрибут!Can i use -- gap property for Flexbox
Его роль аналогична роли в макете сетки, и он может контролировать расстояние между гибкими элементами в горизонтальном и вертикальном направлениях:
.flex-container {
width: 500px;
display: flex;
flex-wrap: wrap;
gap: 5px;
justify-content: center;
border: 2px solid #333;
}
.item {
width: 80px;
height: 100px;
background: deeppink;
}
gap
Преимущество атрибутов в том, что они избегают традиционного использованияmargin
Когда вам нужно учитывать раздражение левого или правого поля первого или последнего элемента. Обычно 4 уровняflex item
, они должны иметь только 3 пробела.gap
работает только на двухflex item
между.
Управление свойствами соотношения сторон контейнераaspect-ratio
Поддержание постоянного соотношения сторон (называемого соотношением сторон) для контейнеров элементов имеет решающее значение для адаптивного веб-дизайна и некоторых макетов. Теперь, с Chromium 88 и Firefox 87, у нас есть более прямой способ управлять соотношением сторон элементов —aspect-ratio
.Can i use -- aspect-ratio
Во-первых, нам нужно только установить ширину элемента или высоту элемента, а затем передатьaspect-ratio
Атрибут, то есть можно управлять общей шириной и высотой элемента:
<div class="width"></div>
<div class="height"></div>
div {
background: deeppink;
aspect-ratio: 1/1;
}
.width {
width: 100px;
}
.height {
height: 100px;
}
Вы можете получить следующий график:
Во-вторых, установитьaspect-ratio
элемент, один из элементов высоты и ширины изменяется, а другой будет следовать за изменением:
<div class="container">
<div>宽高比1:1</div>
<div>宽高比2:1</div>
<div>宽高比3:1</div>
</div>
.container {
display: flex;
width: 30vw;
padding: 20px;
gap: 20px;
}
.container > div {
flex-grow: 1;
background: deeppink;
}
.container > div:nth-child(1) {
aspect-ratio: 1/1;
}
.container > div:nth-child(2) {
aspect-ratio: 2/1;
}
.container > div:nth-child(3) {
aspect-ratio: 3/1;
}
При изменении размера контейнера ширина каждого дочернего элемента становится шире, а высота элемента также следует заданнойaspect-ratio
Масштаб следует за изменением:
CodePen Demo -- aspect-ratio Demo
Макет водопада CSS Grid под Firefox (grid-template-rows: masonry)
grid-template-rows: masonry
Это способ быстро создать макет водопада на основе макета сетки, который Firefox начал поддерживать в Firefox 87. И Firefox продвигает это свойство в стандарт.
Начиная с Firefox 87, введите в адресной строке браузераabout:config
и включиlayout.css.grid-template-masonry-value.enabled
Настроить для использования.Can i use -- grid-template-rows: masonry
Как правило, нам все равно нужно приложить определенные усилия для создания каскадной схемы потока, даже если она основана на сетке. Раньше мы использовали сетку для управления каждымgrid item
, вы также можете реализовать несколько псевдоводопадных макетов:
<div class="g-container">
<div class="g-item">1</div>
<div class="g-item">2</div>
<div class="g-item">3</div>
<div class="g-item">4</div>
<div class="g-item">5</div>
<div class="g-item">6</div>
<div class="g-item">7</div>
<div class="g-item">8</div>
</div>
.g-container {
height: 100vh;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(8, 1fr);
}
.g-item {
&:nth-child(1) {
grid-column: 1;
grid-row: 1 / 3;
}
&:nth-child(2) {
grid-column: 2;
grid-row: 1 / 4;
}
&:nth-child(3) {
grid-column: 3;
grid-row: 1 / 5;
}
&:nth-child(4) {
grid-column: 4;
grid-row: 1 / 6;
}
&:nth-child(5) {
grid-column: 1;
grid-row: 3 / 9;
}
&:nth-child(6) {
grid-column: 2;
grid-row: 4 / 9;
}
&:nth-child(7) {
grid-column: 3;
grid-row: 5 / 9;
}
&:nth-child(8) {
grid-column: 4;
grid-row: 6 / 9;
}
}
Эффект следующий:
Демонстрация CodePen — CSS Grid реализует макет псевдоводопада
В приведенной выше демонстрации используйтеgrid-template-columns
,grid-template-rows
Чтобы разделить строки и столбцы, используйтеgrid-row
контролировать каждыйgrid item
Однако стоимость этого слишком высока.Если элементов слишком много, объем вычислений также очень велик, и все еще предполагается, что мы заранее знаем высоту и ширину каждого элемента.
И имеяgrid-template-rows: masonry
Дальше все гораздо проще, для сетки с 4 колонками неопределенной высоты каждого элемента:
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
Обычно вы увидите что-то вроде этого:
Просто добавьте в контейнерgrid-template-rows: masonry
В вертикальном направлении используйте макет потока водопада:
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
+ grid-template-rows: masonry;
}
Вы можете легко получить каскадный макет:
Если вы используете Firefox и он включенlayout.css.grid-template-masonry-value.enabled
Конфигурация, вы можете ткнуть в следующее DEMO, чтобы почувствовать это:
CodePen Demo -- grid-template-rows: кладка реализует каскадную компоновку
Конечно, это самый простой DEMO, подробнее оgrid-template-rows: masonry
Для получения соответствующих знаний вы можете подробно прочитать эту статью:Native CSS Masonry Layout In CSS Grid
Запросы контейнера CSS
чтоЗапрос контейнера CSS(Контейнерные запросы)?
Раньше для одного и того же стиля, если мы хотели получить разные эффекты в зависимости от размера области просмотра, мы обычно использовализапросы средств массовой информации.
Однако дизайн некоторых контейнеров или компонентов не всегда может быть связан с размером области просмотра, а скорее с размещением компонента в макете.
Так что в будущем будет добавлен новый способ управления стилем контейнера в разных состояниях, то есть запрос контейнера. в последнемChrome Canary, мы можем пройтиchrome://flags/#enable-container-queries
Включить функцию контейнерных запросов.
Предположим, у нас есть следующая структура:
<div class="wrap">
<div class="g-container">
<div class="child">Title</div>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Necessitatibus vel eligendi, esse illum similique sint!!</p>
</div>
</div>
Обычный стиль выглядит следующим образом:
.g-container {
display: flex;
flex-wrap: nowrap;
border: 2px solid #ddd;
.child {
flex-shrink: 0;
width: 200px;
height: 100px;
background: deeppink;
}
p {
height: 100px;
font-size: 16px;
}
}
Структура выглядит следующим образом:
В будущем мы можем@container query
синтаксис, установить родительский контейнер.wrap
Разная производительность при разной ширине, на основе приведенного выше кода добавьте следующий код:
.wrap {
contain: layout inline-size;
resize: horizontal;
overflow: auto;
}
.g-container {
display: flex;
flex-wrap: nowrap;
border: 2px solid #ddd;
.child {
flex-shrink: 0;
width: 200px;
height: 100px;
background: deeppink;
}
p {
height: 100px;
font-size: 16px;
}
}
// 当 .wrap 宽度小于等于 400px 时下述代码生效
@container (max-width: 400px) {
.g-container {
flex-wrap: wrap;
flex-direction: column;
}
.g-container .child {
width: 100%;
}
}
Обратите внимание, чтобы включить@container query
, который необходимо сопоставить с контейнеромcontain
свойства, задайте здесьcontain: layout inline-size
,когда.wrap
ширина меньше или равна400px
час,@container (max-width: 400px)
Затем код внутри вступает в силу с горизонтальной компоновки.flex-wrap: nowrap
Преобразовано в вертикальную компоновку упаковкиflex-wrap: wrap
:
Если ваш браузер уже открытchrome://flags/#enable-container-queries
, вы можете ткнуть этот код, чтобы почувствовать это:
CodePen Demo -- CSS @container query Demo
Сходства и различия между медиа-запросами и контейнерными запросами можно увидеть на простой диаграмме.При изменении ширины контейнера ширина области просмотра не обязательно изменяется.:
Вот только введение@container query
Верхушка айсберга, вы можете нажать здесь, чтобы узнать больше:say-hello-to-css-container-queries
наконец
Ну вот и конец этой статьи, надеюсь она вам поможет :)
Если вы хотите получить самую интересную информацию о CSS, не пропустите мою общедоступную учетную запись iCSS -- *Интересные факты о внешнем интерфейсе iCSS
Другие замечательные технические статьи по CSS собраны в моемGithub -- iCSS, продолжайте обновлять, добро пожаловать, нажмите звездочку, чтобы подписаться на коллекцию.
Если у вас есть какие-либо вопросы или предложения, вы можете общаться больше.Оригинальные статьи ограничены в написании и знаниях.Если в статье есть какие-либо неточности, пожалуйста, дайте мне знать.