当前位置: 首页 > 科技观察

新时代布局中的一些有趣功能!

时间:2023-03-16 13:06:30 科技观察

在最新的ChromeCanary中,支持一种名为ContainerQueries的有趣CSS语法。ChromeCanary[1]:每日为开发人员构建,处于网络技术的最前沿。当然也可能不稳定~不过在最近的Chrome版本中,陆续支持了一些有趣的属性。本文将介绍一些我们可以在当今新时代布局中逐步使用的有趣的新特性,通过本文,您将能够了解:flex布局中的gap属性控制容器CSSGrid瀑布流的aspect-ratio属性firefox下的布局(grid-template-rows:masonry)CSS容器查询(ContainerQueries)flex布局gap中的gap属性并不是一个新属性,它一直存在于多列布局和网格布局中,其中:column-gap属性用于设置多列布局中元素列之间的间距大小multi-column网格布局中的gap属性用于设置网格行列之间的间距。这个属性是row-gap和column-gap的缩写,最初叫grid-gap。例如,我们有以下网格布局:1

2
3
4
5.grid-container{display:grid;border:5pxsolid;padding:20px;grid-template-columns:1fr1fr1fr;}.item{width:100px;height:100px;background:deeppink;border:2pxsolid#333;}效果如下:网格布局可以方便的设置网格行列间距将gap属性添加到grid-container:.grid-container{display:grid;border:5pxsolid;padding:20px;grid-template-columns:1fr1fr1fr;+gap:5px;}从Chromium84开始,我们可以开始在flex布局中使用gap属性!Flexbox能否使用--gap属性[2]Flexbox能否使用--gap属性作用类似于grid布局中的,可以控制flexitem在水平和垂直方向的间距:.flex-container{width:500px;display:flex;flex-wrap:wrap;gap:5px;justify-content:center;border:2pxsolid#333;}.item{width:80px;height:100px;background:deeppink;}gapproperty的好处是避免了使用margin时需要考虑第一个或最后一个元素的左边距或右边距的麻烦。通常情况下,4个水平弹性项目应该只有3个间隙。间隙仅在两个弹性项目之间生效。控制容器纵横比属性aspect-ratio保持元素的容器具有一致的纵横比(称为纵横比)对于响应式网页设计和某些布局至关重要。现在,有了Chromium88和Firefox87,我们有了更直接的方式来控制元素的纵横比——aspect-ratio。Caniuse--aspect-ratio[3]Caniuse--aspect-ratio首先我们只需要设置元素的宽高,然后通过aspect-ratio属性来控制整体的宽高元素:div{background:deeppink;aspect-ratio:1/1;}.width{width:100px;}.height{height:100px;}可以得到如下图形:其次,设置纵横比元素,元素的高和宽其中一个会变化,另一个也会跟着变化:
纵横比1:1
纵横比2:1
纵横比3:1
.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;}当容器尺寸变化时,每个子元素的宽度变宽,而元素的高度也随着s变化etaspect-ratio:CodePenDemo--aspect-ratioDemo[4]Firefox下的CSSGrid瀑布流布局(grid-template-rows:masonry)grid-template-rows:masonry是的Firefox开始支持一种快速创建的方式基于Firefox87网格布局的瀑布布局。而firefox一直在将这个属性推入标准。从firefox87开始,在浏览器的URL输入栏输入about:config,开启layout.css.grid-template-masonry-value.enabled配置。能否使用--grid-template-rows:masonry[5]通常情况下,我们还是需要花费一定的功夫来实现瀑布流布局,即使是基于网格布局。以往通过网格布局,我们也可以通过精细控制每个网格项来实现一些伪瀑布流布局:12345678.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-列:3;网格行:5/9;}&:nth-child(8){grid-column:4;grid-row:6/9;}}效果如下:CSSGrid实现伪瀑布布局CodePenDemo--CSSGrid实现伪瀑布布局[6]在上面的Demo中,使用grid-template-columns,grid-template-rows将行和列分开,使用grid-row来控制每个griditem的grid的大小,但是这样做的成本太高了。元素太多,计算量非常大,而且我们还是提前知道每个元素的高和宽的前提下,有了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感受一下:CodePenDemo--grid-template-rows:masonry实现瀑布流布局[7]当然,这是最简单的DEMO,对于更多grid-template-rows:masonry相关知识,详细可以看这篇文章:NativeCSSMasonryLayoutInCSSGrid[8]CSS容器查询(ContainerQueries)什么是CSS容器查询[9](ContainerQueries)?之前,对于同一个样式,如果我们想根据视口的大小得到不同的效果,我们通常会使用媒体查询。但是,一些容器或组件的设计可能并不总是与视口的大小有关,而是与组件在布局中的放置有关。所以以后会有一种新的方式来控制容器在不同状态下的样式,那就是容器查询。在最新的ChromeCanary[10]中,我们可以通过chrome://flags/#enable-container-queries启用ContainerQueries。假设我们有以下结构:Title

Loremipsumdolorsitametconsecteturadipisicingelit.Necessitatibusveleligendi,esseillumsimiliquesint!

正常样式如下:.g-container{display:flex;flex-wrap:nowrap;border:2pxsolid#ddd;.child{flex-shrink:0;width:200px;height:100px;background:deeppink;}p{height:100px;font-size:16px;}}结构如下:以后我们可以使用@container查询语法来设置父container.wrap的不同表现不同的宽度。在代码的基础上,添加如下代码:.wrap{contain:layoutinline-size;resize:horizo??ntal;overflow:auto;}.g-container{display:flex;flex-wrap:nowrap;border:2pxsolid#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这里需要开启查询容器的contain属性,这里设置contain:layoutinline-size,当.wrap的宽度小于等于400px时,@container(max-width:400px)里面的代码会生效,从水平布局flex-wrap:nowrap变为垂直环绕布局flex-wrap:wrap:如果你的浏览器打开了chrome://flags/#enable-container-queries,可以戳这段代码体验一下:CodePenDemo--CSS@containerqueryDemo[11]媒体查询的异同而容器的查询,通过一张简单的图来看一下。核心点在于当容器的宽度发生变化时,视口的宽度不一定发生变化:这里只是@container查询的冰山一角。想要了解更多,可以点击这里了解更多:say-hello-to-css-container-queries[12]最后,本文到此结束,希望对你有所帮助:)更多精彩的CSS技术文章总结在我的Github——iCSS[13]。参考文献[1]ChromeCanary:https://www.google.com/chrome/canary/[2]Caniuse--gappropertyforFlexbox:https://caniuse.com/?search=flex%20gap[3]我可以使用--aspect-ratio:https://caniuse.com/?search=aspect-ratio[4]CodePenDemo--aspect-ratioDemo:https://codepen.io/Chokcoco/pen/eYgjbqG[5]Caniuse--grid-template-rows:masonry:https://caniuse.com/?search=grid-template-rows[6]CodePenDemo--CSSGrid实现伪瀑布流布局:https://codepen.io/Chokcoco/pen/KGXqyo[7]CodePen演示--grid-template-rows:masonry实现瀑布布局:https://codepen.io/Chokcoco/pen/NWdBojd[8]CSS网格中的原生CSS砌体布局:https://www.smashingmagazine.com/native-css-masonry-layout-css-grid/[9]CSS容器查询:https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries[10]ChromeCanary:https://www.google.com/chrome/canary/[11]CodePenDemo--CSS@containerqueryDemo:https://codepen.io/Chokcoco/pen/PoWBOQR[12]say-hello-to-css-container-queries:https://ishadeed.com/article/say-hello-to-css-container-queries/[13]Github--iCSS:https://github.com/chokcoco/iCSS