你现在可以玩下这 5 个 CSS 新功能

在浏览器开始实现它们之前,css 新的功能通常需要经过长时间讨论之后,才在W3联盟的规范中定义 。有许多值得一提的 CSS 新功能,但是在本文中,我们重点介绍可以浏览器的稳定版中进行测试的五个功能:

  1. CSS Subgrid (子网格)
  2. flex gaps
  3. content-visibility 属性
  4. contains-intrinsic-size 属性
  5. :is 和 :where 伪类
浏览器对这些特性的支持一直在变化,可以通过 Can I Use 来查看支持情况 。
1.CSS SubgridCSS 网格是一个灵活的布局模块,允许开发人员创建复杂的布局,无需使用JAVAScript或使用复杂的 CSS hack 。
使用 CSS 网格的语法很简单,如下所示:
.grid-container {    display: grid;}可以使用几个特定于网格的属性来设置所需的确切布局 。
例如,在上面的示例中,.grid-container的子元素将是网格项,它们将根据使用grid-template-columns和grid-template-rows属性定义的规则进行布局:
.grid-container {    display: grid;    grid-template-columns: 1fr 2fr 1fr;    grid-template-rows: 50px 70vh 50px;}运行结果如下:
你现在可以玩下这 5 个 CSS 新功能

文章插图
 
但是,如果你也想在网格布局中包括.grid-container的某些(或全部)子孙元素怎么办?这就是CSS Subgrid 发挥作用的地方 。
可以向网格项目添加以下规则,以使其能够采用其父级的网格轨道(包括名称网格线和区域,即使它也可以定义自己的网格轨道和区域) 。
.grid-item {    /* 这些规则指定子网格在布局中的位置*/    grid-column: 2 / 4;      /* 两列垂直 */    grid-row: 1 / 3;         /* 两行水平 */    /* 这些规则属于子网格本身 */    display: grid;    grid-template-columns: subgrid;    grid-template-rows: subgrid;}grid-column和grid-row属性定义了网格项目在网格列或行中的位置 。.grid-item的子元素将形成子网格 。一个网格项目可以跨越多个网格单元 。例如,这里它分布在四个像元上(在上面的示例中grid-column和grid-row的值是任意的) 。
如上所见,subgrid 不是独立的CSS属性,而是可以添加到grid-template-columns和grid-template-rows属性的值 。它使.grid-item的子级包含在网格布局中:
你现在可以玩下这 5 个 CSS 新功能

文章插图
 
子网格已成为网格布局的一部分,并且已定位到我们想要的确切位置(在第二和第四条垂直网格线之间,以及在第一和第三条水平网格线之间) 。
其余的网格项目保持了正常的网格流,第四行也出现在布局的底部 。但是,由于我们仅使用grid-template-rows属性定义了三行,因此第四行没有预设值,因此仅取其内容的自然高度 。如果我们要从最后三个网格项目中删除文本,则它们甚至不会显示,因为它们的自然高度为0 。
可以使用下面的CodePen演示来测试上面的示例 。
我们也可以通过仅采用grid-template-columns或grid-template-rows并为另一项使用新值来创建一维子网格 。
例如,在以下情况下,子网格仅采用主网格的列,但为行创建新规则
.grid-item {  display: grid;  grid-template-columns: subgrid;  grid-template-rows: 200px 400px 200px;}浏览器支持情况自2020年8月起,CSS 子网格规范已成为W3C的候选推荐标准 。目前,Firefox 71+仅支持该子网格规范,但开源 Web 浏览器 Chromium 也已开始使用它,该浏览器被用作主要浏览器(包括Chrome,Opera,Brave,以及新的Microsoft Edge 。
2. Flexbox gaps长期以来,在 felx 布局中的行或列之间添加间隙一直是一个难题 。通常可以通过在 flex 项目中添加 margin 来解决问题,但是margin的问题在于,它们也会被添加到每个行或列的开头和结尾 。即使可以通过 CSS 来解决这些缺陷,但这也不是最理想的解决方案 。
目前,浏览器对flexbox gap 的支持越来越好 。gap,row-gap 和column-gap 属性存在于不同的上下文中,具有不同级别的浏览器支持 。我们可以在以下布局模块中使用gap属性 。