表中的内容
- Introduction
- Using a container query
- Why should I use a container query?
- Creating a reusable component with container query
- Using the container query responsive unit
- Conclusion
- Resources
介绍
在CSS3中,我们看到了媒体查询的使用。
响应式和流体设计的兴起带来了Flexbox,网格系统,然后带来了媒体查询。
媒体查询是一个CSS设有规则,它使元素的样式取决于视口的大小。它在开发响应式界面方面非常方便。
@media only screen and (max-width: 440px) {
.main {
flex-direction: column;
}
}
a 容器查询也是CSS AT-LULE,但取决于父元素的大小。元素的样式取决于其父容器的大小而不是视口。
使用容器查询
最近在所有主要浏览器中,集装箱查询变得稳定。因此,它可以在您的代码中实现。
Visit caniuse to see supported browsers.
对于不支持的浏览器,CSS Flex和Grid可以用作后备,以获得与容器查询相似的效果。
@container card (max-width: 853px) {
.card {
flex-direction: column;
width: 80%;
margin-bottom: 10px;
}
.card-header {
width: 100%;
}
.card-body p {
font-size: clamp(8px, 5cqi, 18px);
}
}
集装箱查询带有一些属性。
- 容器类型:在容器元素上使用它来确定将是哪种类型的容器。它接受以下任何值。
- 正常:该元素不是任何容器尺寸的查询容器。但是,它仍然有效,因为它可以用于将样式应用于元素
- 内联大小:查询将基于容器的内联尺寸。将布局,样式和内联尺寸遏制应用于元素
- 大小:查询将基于容器的内联和块尺寸。将布局,样式和尺寸遏制应用于容器。
.card-container {
container-type: size | inline-size | normal;
}
- 容器名称:它用于命名遏制上下文。然后可以在@Container查询中使用该名称来定位特定容器。
.card-container {
container-name: cardContainer;
}
- 容器查询还提供了一些相对单元,这些单元可在围栏上下文中使用,以样式包含元素。 他们包括: CQI:容器内联尺寸的1% CQB:容器大小的1% CQH:容器高度的1% CQW:容器宽度的1% CQMAX:CQI和CQB之间最大 CQMIN:CQI和CQB之间的最小
这些相对单元就像视口的相对单位一样。
为什么要使用容器查询?
- 使用自己的样式创建可重复使用的组件
- 样式元素根据其大小而不是浏览器视口
- 创建流体版式
- 使用集装箱查询中提供的新响应单元
使用容器查询创建可重复使用的组件
可以使用容器查询重复使用元素。一个元素可以在两个不同的容器中使用,并样式响应这些容器的大小。
在上图中,卡组件可重复使用。在侧边栏中,它在主要内容中垂直堆叠,水平堆叠。它正在响应其容器的大小。
以下是在上图中产生接口的代码样本。
<!-- card container sidebar component -->
<div class="aside card-container">
<!-- card1 -->
<div class="card">
<div class="card-header"></div>
<div class="card-body">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptas,
hic!
</p>
<button>Click</button>
</div>
</div>
<!-- card2 -->
<div class="card">
<div class="card-header"></div>
<div class="card-body">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptas,
hic!
</p>
<button>Click</button>
</div>
</div>
</div>
<div class="container">
<div class="header">
Cool resorts
</div>
<!-- card container component -->
<div class="main card-container">
<!-- card1 -->
<div class="card">
<div class="card-header"></div>
<div class="card-body">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptas,
hic!
</p>
<button>Click</button>
</div>
</div>
<!-- card2 -->
<div class="card">
<div class="card-header"></div>
<div class="card-body">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptas,
hic!
</p>
<button>Click</button>
</div>
</div>
<!-- card3 -->
<div class="card">
<div class="card-header"></div>
<div class="card-body">
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptas,
hic!
</p>
<button>Click</button>
</div>
</div>
</div>
</div>
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
:root {
--size: 2;
}
body {
display: grid;
grid-template-columns: 20% auto;
grid-template-rows: 100vh;
}
.container {
width: 100%;
}
.aside {
border-right: 2px solid grey;
height: 100%;
padding: 10px;
}
.header {
text-align: center;
}
.main {
display: flex;
gap: 20px;
width: 100%;
padding: 20px;
}
.card-container {
container-type: size;
container-name: cardContainer;
}
.card {
width: calc(100% / var(--size));
font-size: 16px;
padding: 5px;
display: flex;
align-items: flex-start;
gap: 10px;
height: fit-content;
border: 2px solid black;
}
.card-header {
width: calc(100% / var(--size));
height: 90px;
background-color: black;
}
.card-body button {
margin-top: 10px;
border-radius: 5px;
border: none;
padding: 5px 10px;
background-color: black;
color: white;
}
@container cardContainer (max-width: 853px) {
.card {
flex-direction: column;
width: 80%;
margin-bottom: 10px;
}
.card-header {
width: 100%;
}
.card-body p {
font-size: clamp(8px, 5cqi, 18px);
}
}
@media only screen and (max-width: 440px) {
.main {
flex-direction: column;
}
}
创建了一个coartment上下文 “ container-name:cardContainer” ,并且容器类型定义为 “ container-type:size:size” < /em> 。
@Container设置为容器的最大宽度为853px时。当宽度落在此范围内时,@Container Atrule中的样式生效。
卡元素对容器的大小(卡片容器)而不是视口响应。
如果容器的宽度小于或等于853px,则卡元件的挠性方向变为一列,宽度增加,宽度元件的大小也会增加宽度。
在旁边和主要元素中使用了相同的卡元素,但由于侧栏的大小与主元素的大小不同,因此其样式为不同。
使用容器查询响应单元
在@Container At子中,响应单元 cqi 在卡体段落的字体尺寸上使用。 夹具函数用于夹紧8px和18px之间的任何设备。请注意, clamp()函数不是容器查询功能。
如果容器的内联尺寸增长,则段落的字体大小会增加,因为它始终是容器内联尺寸的5%。但是它永远不会超过18px。另外,如果容器的内联尺寸收缩,则段落的字体大小减小,但不少于8px。
结论
容器查询是最近用于查询媒体查询等元素的CSS设有规则。但是,容器查询取决于元素的大小,而不是浏览器视口。它最近在主要浏览器(Chrome/Edge 106,Safari 16和Firefox 110)中稳定。
它使元素具有独立样式的更多可能性,具体取决于其尺寸。