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

简介: 新时代布局中一些有意思的特性

在最新的 Chrome Canary 中,一个有意思的 CSS 语法 Container Queries 得到了支持。


Chrome Canary:开发者专用的每日构建版,站上网络科技最前沿。当然,不一定稳定~


而在最近几个 Chrome 版本中,有一些挺有意思的属性相继得到支持,本文就将介绍一下,在今天,新时代布局中,我们能逐渐去使用的一些有意思的新特性,通过本文,你将能了解到:


  • flex 布局中的 gap 属性
  • 控制容器宽高比属性 aspect-ratio
  • firefox 下的 CSS Grid 瀑布流布局(grid-template-rows: masonry)
  • CSS 容器查询(Container Queries)


flex 布局中的 gap 属性



gap 并非是新的属性,它一直存在于多栏布局 multi-column 与 grid 布局中,其中:


  • column-gap 属性用来设置多栏布局 multi-column 中元素列之间的间隔大小
  • grid 布局中 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;
}

效果如下:


2f3a95b5b18d41ce89c971e66b6dffb9_tplv-k3u1fbpfcp-zoom-1.png


通过给 grid-container 添加 gap 属性,可以非常方便的设置网格行与列之间的间隙:


.grid-container {
    display: grid;
    border: 5px solid;
    padding: 20px;
    grid-template-columns: 1fr 1fr 1fr;
+   gap: 5px;
}


feec87153dc740938b3eefa61a7c277f_tplv-k3u1fbpfcp-zoom-1.png


而从 Chromium 84 开始,我们可以开始在 flex 布局中使用 gap 属性了!Can i use -- gap property for Flexbox

e95d1269179d40e0878168ee46e609b2_tplv-k3u1fbpfcp-zoom-1.png


它的作用与在 grid 布局中的类似,可以控制水平和竖直方向上 flex item 之间的间距:


.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;
}


4ccbed8eecbe48d9bf8b4f73e79277c9_tplv-k3u1fbpfcp-zoom-1.png

gap 属性的优势在于,它避免了传统的使用 margin 的时候需要考虑第一个或者最后一个元素的左边距或者右边距的烦恼。正常而言,4 个水平的 flex item,它们就应该只有 3 个间隙。gap 只生效于两个 flex item 之间。


控制容器宽高比属性 aspect-ratio



保持元素容器一致的宽高比(称为长宽比)对于响应式 Web 设计和在某些布局当中至关重要。 现在,通过 Chromium 88 和 Firefox 87,我们有了一种更直接的方法来控制元素的宽高比 -- aspect-ratio。Can i use -- aspect-ratio

3761a6a27ad0423890da19543bac7dd5_tplv-k3u1fbpfcp-zoom-1.png

首先,我们只需要设定元素的宽,或者元素的高,再通过 aspect-ratio 属性,即可以控制元素的整体宽高:


<div class="width"></div>
<div class="height"></div>
div {
    background: deeppink;
    aspect-ratio: 1/1;
}
.width {
    width: 100px;
}
.height {
    height: 100px;
}


都可以得到如下图形:


b2973eac17a2493493921a7e51128ad9_tplv-k3u1fbpfcp-zoom-1.png


其次,设定了 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 比例跟随变化:


2f0d05792fea42fd8909369774b40a97_tplv-k3u1fbpfcp-zoom-1.gif


CodePen Demo -- aspect-ratio Demo


firefox 下的 CSS Grid 瀑布流布局(grid-template-rows: masonry)



grid-template-rows: masonry 是 firefox 在 firefox 87 开始支持的一种基于 grid 布局快速创建瀑布流布局的方式。并且 firefox 一直在推动该属性进入标准当中。


从 firefox 87 开始,在浏览器输入网址栏输入 about:config 并且开启 layout.css.grid-template-masonry-value.enabled 配置使用。Can i use -- grid-template-rows: masonry


7be58f490969421085777fa250c9a1e2_tplv-k3u1fbpfcp-zoom-1.png


正常而言,我们想要实现瀑布流布局还是需要花费一定的功夫的,即便是基于 grid 布局。在之前,我们通过 grid 布局,通过精细化控制每一个 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;
    }
}

效果如下:


d73384b376ea4a14990a199b0387a0a9_tplv-k3u1fbpfcp-zoom-1.png


CodePen Demo -- CSS Grid 实现伪瀑布流布局


在上述 Demo 中,使用 grid-template-columns、grid-template-rows 分割行列,使用 grid-row控制每个 grid item 的所占格子的大小,但是这样做的成本太高了,元素一多,计算量也非常大,并且还是在我们提前知道每个元素的高宽的前提下。


而在有了 grid-template-rows: masonry 之后,一切都会变得简单许多,对于一个不确定每个元素高度的 4 列的 grid 布局:


.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
}


正常而言,看到的会是这样:

9aa2ffead61a44f29bef2ff2ea98013a_tplv-k3u1fbpfcp-zoom-1.png


简单的给容器加上 grid-template-rows: masonry,表示竖方向上,采用瀑布流布局:


.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
+ grid-template-rows: masonry;
}


便可以轻松的得到这样一种瀑布流布局:

170506a637ee433a92fac9c13cf16394_tplv-k3u1fbpfcp-zoom-1.png



如果你在使用 firefox,并且开启了 layout.css.grid-template-masonry-value.enabled 配置,可以戳进下面的 DEMO 感受一下:


CodePen Demo -- grid-template-rows: masonry 实现瀑布流布局


当然,这是一个最简单的 DEMO,关于更多 grid-template-rows: masonry 相关知识,你可以详细的看看这篇文章:Native CSS Masonry Layout In CSS Grid


CSS 容器查询(Container Queries)



什么是 CSS 容器查询(Container Queries)?


在之前,对于同个样式,我们如果希望根据视口大小得到不一样效果,通常使用的是媒体查询。


但是,一些容器或者组件的设计可能并不总是与视口的大小有关,而是与组件在布局中的放置位置有关。


所以在未来,新增了一种方式可以对不同状态下的容器样式进行控制,也就是容器查询。在最新的 Chrome Canary 中,我们可以通过 chrome://flags/#enable-container-queries 开启 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;
    }
}

结构如下:


5bc8192e03f9471cb58ce31488ca8981_tplv-k3u1fbpfcp-zoom-1.png

在未来,我们可以通过 @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:

bdc8c9f2a9cc44b6ab71bf6531a37ef9_tplv-k3u1fbpfcp-zoom-1.gif



如果你的浏览器已经开启了 chrome://flags/#enable-container-queries,你可以戳这个代码感受一下:


CodePen Demo -- CSS @container query Demo


媒体查询与容器查询的异同,通过一张简单的图看看,核心的点在于容器的宽度发生变化时,视口的宽度不一定会发生变化:


87fe26c472694a3b8b2b59c208d2bfc0_tplv-k3u1fbpfcp-zoom-1.png


这里仅仅是介绍了 @container query 的冰山一角,更多内容你可以戳这里了解更多:say-hello-to-css-container-queries

目录
相关文章
|
1月前
|
人工智能 关系型数据库 Serverless
1024,致开发者们——希望和你一起用技术人独有的方式,庆祝你的主场
阿里云开发者社区推出“1024·云上见”程序员节专题活动,包括云上实操、开发者测评和征文三个分会场,提供14个实操活动、3个解决方案、3 个产品方案的测评及征文比赛,旨在帮助开发者提升技能、分享经验,共筑技术梦想。
1360 159
|
3月前
|
供应链 物联网 区块链
未来触手可及:探索新兴技术的趋势与应用安卓开发中的自定义视图:从基础到进阶
【8月更文挑战第30天】随着科技的飞速发展,新兴技术如区块链、物联网和虚拟现实正在重塑我们的世界。本文将深入探讨这些技术的发展趋势和应用场景,带你领略未来的可能性。
|
2月前
|
前端开发 开发者 容器
【布局革命!】Flexbox与Grid双剑合璧:解锁Web设计新纪元,让响应式界面瞬间焕发光彩!
【9月更文挑战第1天】本文通过问答形式深入探讨了Flexbox和Grid布局的特点与应用场景。Flexbox专为单轴布局设计,适用于响应式导航栏和列表;Grid布局则适用于二维布局,可精确控制元素的位置和大小,适合构建复杂的内容区域和仪表板。文章还提供了示例代码,帮助读者更好地理解和应用这两种布局方式,以创建高效、美观的Web界面。
81 9
|
3月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
67 0
|
3月前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
105 0
|
3月前
|
前端开发 容器
解锁CSS定位奥秘,从迷茫到精通,让你的网页布局“稳如老狗”,引领前端新潮流!
【8月更文挑战第23天】本文深入探讨了Web前端开发中CSS定位的三大基石:相对定位、绝对定位与固定定位。通过具体示例,展示了各种定位方式的特点及应用场景。相对定位可在不影响布局的情况下微调元素位置;绝对定位使元素完全脱离文档流,适用于精确控制位置的需求;固定定位则确保元素始终固定于浏览器窗口特定位置,不受页面滚动影响。这些技巧对于实现复杂网页布局至关重要。
58 0
|
6月前
|
人工智能 前端开发 JavaScript
前端:魅力与技术并存的艺术
前端:魅力与技术并存的艺术
42 3
|
6月前
|
前端开发 数据可视化 JavaScript
【iVX】颠覆常规,首个图形通用无代码编程平台诞生
【iVX】颠覆常规,首个图形通用无代码编程平台诞生
183 1
|
Web App开发 数据库 C++
C/C++发展方向(强烈推荐!!)(下)
C/C++发展方向(强烈推荐!!)
|
存储 缓存 Linux
C/C++发展方向(强烈推荐!!)(上)
C/C++发展方向(强烈推荐!!)