当前位置: 首页 > Web前端 > CSS

新时代布局中的一些有趣特性

时间:2023-03-31 01:29:35 CSS

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

2
3
4
5.grid-container{显示:网格;边框:5px实心;填充:20px;网格模板列:1fr1fr1fr;}.item{宽度:100px;高度:100px;背景:深粉色;border:2pxsolid#333;}效果如下:通过给grid-container添加gap属性,可以很方便的设置grid行列之间的Gapbetween:.grid-container{d显示:网格;边框:5px实心;填充:20px;grid-template-columns:1fr1fr1fr;+gap:5px;}从Chromium84开始,我们可以开始在flex布局中使用gap属性!Flexbox可以使用--gap属性吗?它的作用类似于grid布局中的,可以控制flexitem在水平和垂直方向上的间距:.flex-container{width:500px;显示:弹性;flex-wrap:包裹;间隙:5px;证明内容:居中;border:2pxsolid#333;}.item{width:80px;高度:100px;background:deeppink;}gap属性的好处是避免了传统使用margin时需要考虑第一个或最后一个元素的左边距或右边距的麻烦。通常,对于4个水平伸缩项目,它们应该只有3个间隙。间隙仅在两个弹性项目之间生效。控制容器纵横比属性aspect-ratio保持元素的容器具有一致的纵横比(称为纵横比)对于响应式网页设计和某些布局至关重要。现在,有了Chromium88和Firefox87,我们有了更直接的方式来控制元素的纵横比——aspect-ratio。可以使用--aspect-ratio首先我们只需要设置元素的宽度或者高度,然后使用aspect-ratio属性来控制元素整体的宽度和高度:div{背景:深粉色;aspect-ratio:1/1;}.width{width:100px;}.height{height:100px;}可以得到如下图形:其次,对于设置了aspect-ratio的元素,其高度和宽度之一元素发生变化,其他元素也会跟着变化:
Aspectratio1:1
Aspectratio2:1
Aspectratio3:1
.container{显示:flex;宽度:30vw;填充:20px;gap:20px;}.container>div{flex-grow:1;背景: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;}当容器的尺寸发生变化时,每个子元素的宽度变宽,元素的高度也遵循设置的纵横比,比例遵循改动:CodePenDemo--aspect-ratioDemoFirefox下的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通常情况下,我们还是需要花费一定的努力来实现瀑布流布局,即使是基于网格布局。以往我们使用网格布局来精细控制每个网格项,也可以实现一些伪瀑布布局:12345678.g-container{height:100vh;显示:网格;网格模板列:重复(4、1fr);grid-template-rows:repeat(8,1fr);}.g-item{&:nth-child(1){grid-column:1;网格行:1/3;}&:nth-child(2){网格列:2;网格行:1/4;}&:nth-child(3){网格列:3;网格行:1/5;}&:nth-child(4){网格列:4;网格行:1/6;}&:nth-child(5){网格列:1;网格行:3/9;}&:n-child(6){网格列:2;网格行:4/9;}&:nth-child(7){网格列:3;网格行:5/9;}&:nth-child(8){网格列:4;网格行:6/9;}}效果如下:CodePenDemo--CSSGrid实现伪瀑布流布局上面的demo中,使用了grid-template-columns和grid-template-rows来划分行和列,使用grid-row来控制每个griditem的大小,但是这样做的成本太高,元素太多,计算量非常大,而且我们还是提前知道每个元素的高和宽的前提使用grid-template-rows:masonry,一切都会变得简单得多,对于具有4列且每个元素的高度不确定的网格布局:.container{display:grid;grid-template-columns:repeat(4,1fr);}通常你看到的是这样的:简单的在容器中添加grid-template-rows:masonry,表示垂直方向,采用瀑布流布局:。容器{显示:网格;grid-template-columns:repeat(4,1fr);+grid-template-rows:masonry;}你可以轻松得到这样的瀑布布局:如果你使用的是firefox,打开layout.css.grid-template-masonry-value.enabled配置,可以戳下面的DEMO感受一下:-相关知识,可以详细阅读这篇文章:NativeCSSMasonryLayoutInCSSGridCSS容器查询(ContainerQueries)什么是CSS容器查询(ContainerQueries)?以前,对于同一个样式,如果我们想根据视口的大小得到不同的效果,我们通常会使用媒体查询。但是,一些容器或组件的设计可能并不总是与视口的大小有关,而是与组件在布局中的放置有关。所以以后会有一种新的方式来控制容器在不同状态下的样式,那就是容器查询。在最新的ChromeCanary中,我们可以通过chrome://flags/#enable-container-queries启用容器查询。假设我们有以下结构:Title

Loremipsumdolorsitametconsecteturadipisicingelit。Necessitatibusveleligendi,esseillumsimiliquesint!!

正常样式如下:.g-container{display:flex;弹性包装:nowrap;边框:2px实心#ddd;.child{flex-shrink:0;宽度:200px;高度:100px;背景:深粉色;}p{高度:100px;字体大小:16px;}}结构如下:以后可以使用@container查询语法,设置父容器.wrap在不同宽度下的不同表现,在上述代码的基础上添加如下代码:.wrap{contain:布局内联大小;调整大小:水平;溢出:自动;}.g-容器{显示:弹性;弹性包装:nowrap;边框:2px实心#ddd;.child{flex-shrink:0;宽度:200px;高度:100px;背景:深粉色;;}}//下面代码在.wrap宽度小于等于400px时生效@container(max-width:400px){.g-container{flex-wrap:wrap;弹性方向:列;}.g-container.child{宽度: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媒体查询和容器查询的异同,看个简单的图片,核心点是当容器的宽度发生变化时,视口的宽度不一定发生变化:这只是@container查询的冰山一角。更多内容可以点击这里了解更多:say-hello-to-css-container-queries最后,本文到此结束,希望对你有所帮助:)想要的不要错过我的iCSS获取最有趣的CSS资讯,有什么问题或者建议可以多交流。原创文章文笔有限,知识匮乏。如果文章中有任何不准确的地方,请告诉我。