[CSS] Flex/Grid Layout Modules, part 15

烫伤了手停了几天,不过差不多 15 天好像就交代完所有的东西了。剩下的大部分是比较冷门,甚至是 Grid Layout Module Level 2 的事情,虽然支援度还有待商榷,不过还是多少可以讲一点。

手是好了点,倒不用太担心。


Grid 能与不能

如果很有耐心的看到这里,我就假设大家都已经知道 Grid Layout Module 的基本操作方式。那麽,我们就可以来看看 Grid 到底在哪些情况下,能做到哪些事情,不能做到哪些事情。

首先,可以做得到的地方很多,我们就单讨论 做不到 的地方比较快,

  • 非矩型区块
  • 非矩型区块
  • 非矩型区块

是,基本上你想要用 Grid 来实作各种 Layout 不会有太大问题,就是除了 非矩型区块 以外的设计,基本上都能用 Grid 来制作。但是,还是得强调一下,如同 <div> 盛行的年代,不是什麽东西都用 Grid 来排,这样不会比较潮。

另外一些 比较不能做的 部分也是有,但个人觉得那是属於比较例外(或是说 意外)的部分,总结前面那些章节来说,那些例外且需要注意的地方有,

基本上这些都是你在制作格线系统上必须留意的地方,大方向虽然是矩型区块,但这些小地方还是有机会让你的 Layout 发生奇怪的事情,然後会让你觉得莫名其妙的地方。具体的例子我就不赘述了,前述的章节多少都有提到。

其中最让人觉得麻烦的是浏览器实作的部分,虽然说 Grid 已经这麽多年了,但浏览器对於网格实作与渲染方式还是略有差异(虽然目前主流浏览器对於 Grid 渲染已经不会有太多例外)。这也是为何 Microsoft Edge 在 Chromium 协助重写了一个新的渲染引擎,

Compat2021: Improving CSS Grid compatibility with GridNG

然後他说 Issue 要回报给 Chromium(笑),不知道哪一天会回到 Chrome 身上?目前看起来 Edge 93 之後应该会用上新的 GridNG,但实际上查询 Microsoft 那边的 Release Notes 也没有特别提到这件事情。但就是期待,毕竟对於 Grid Layout Level 2 有相对好的支援的话,也是乐见其成。


谨慎设定你的网格轨道

其实你会发现我几乎每一篇都会讲到尺寸的事情,你应该会发现,无论你是否使用固定尺寸的网格容器,或是弹性尺寸的网格容器,只要我们在 网格轨道设定稍有不慎,那麽这个 网格容器的尺寸基本上形同虚设

换句话说,以下这些都会让你的网格轨道爆掉,

  • 网格单元指定超出轨道数量(任何方向都是)。
  • 跨网格单元超出轨道数量(任何方向都是)。
  • 网格单元使用命名网格,但不存在。
  • 隐性轨道尺寸总和大於网格容器。
  • grid-template 写错。

嗯,不要怀疑,最後一点是认真的。

fieldset {
    display: grid;
    grid-temlate: "foo boo ." auto / 25% 1fr 50%;
}

以上是 合法 的写法,但还是得想清楚,明确的知道自己在做什麽再这样写。不然其实 复制,贴上,不会改 的状况应该也是不少,俗语好像叫做知其然而不知起所以然?


隐性格线在浏览器渲染的设定雷

不知道你们有没有发现我在 Part 8 提及隐性格线时,并没有特别着墨在轨道格线的数字上。

因为有雷啊(灿笑。

上面提到了让网格系统爆掉的事情,除非你是故意的,或者你想善用隐性格线来帮你做些什麽事情,那麽,你就必须留意关於隐性格线轨道的数字问题。我举个实际的例子,然後将渲染结果贴上来给你们看看,

.grid-container {
  display: grid;
  grid-template: auto / repeat(3, 1fr);
  
  grid-auto-rows: 150px;
  grid-auto-columns: 50px;
  
  gap: 10px;
}

.grid-item:nth-of-child(1) {
  grid-column: span 4;
  grid-row: 2 / 3;
}

.grid-item:nth-of-child(2) {
  grid-column: 3 / 9;
  grid-row: 3 / 4;
}

.grid-item:nth-of-child(3) {
  grid-column: -1 / -3;
  grid-row: 4 / 5;
}

先不管这个设定是否 合理 ,我们来看看渲染结果,我测试的浏览器有:

  1. Google Chrome 97.0.4692.71
  2. Firefox 96.0
  3. Microsoft Edge 97.0.1072.55
  4. Safari 15.1 (17612.2.9.1.20)

基本上上述结果画面都相同,我就放 Chrome 跟 Safari 的上来让你们看看结果,

https://ithelp.ithome.com.tw/upload/images/20220114/20001433BqQ4SAubG4.png

虽然 Safari 有 ModernIE 的美名,但这次还算是蛮合群的,

https://ithelp.ithome.com.tw/upload/images/20220114/20001433nXLDzMRCJe.png

问题应该很显而易见了,我为了将差异作的比较明显,所以特意指定了 grid-auto-columngrid-auto-row 的数值,然後将 gap 设定为 10px 让大家可以比较明显的看出状况。

首先先列举一下,

  1. auto 因为尺寸演算的关系,如果没有被使用到,尺寸为 0
  2. 因为 1. 的关系,这边产生一个 gap 是因为第二条线的关系。
  3. 隐性网格并不列入 负数 的网格计算内。
  4. 因为 3. 的关系,所以行方向只有 -1, -2,列方向只有 -1 ~ -4

上述的状况如果换个方向也会成立,所以不用太失望,该会怪怪的地方不会因为你把 row 转向 column 他就会自动变好,不会。

再者,由於 gap 不会消灭,也不会合并,所以,当我们取消了 gap,也把 grid-auto-columngrid-auto-row 的数值取消,那画出来的画面你可能不觉得哪里有毛病。

https://ithelp.ithome.com.tw/upload/images/20220114/20001433oYcJzt8Cur.png

所以说,如果你没有打算好好规划 grid-templategrid-template-area 的话,请注意隐性格线所带来的问题。


小结

以目前主流浏览器来看,对於 Grid 的支援度已经相当好,各家渲染出来的状况也不会有什麽太奇怪的落差。在主流市场上,其实多数的 CSS Framework 都已经有在使用,只是真的在意那些 Framework 到底是用 Flexbox 还是 Grid 的人应该不多,吧?

下一章节会聊一下 Media Query 跟 Grid 的演算机制,下回见~


目录与小节:
[CSS] Flex/Grid Layout Modules, part 1


部落格同步放送:
[CSS] Flex/Grid Layout Modules, part 15


<<:  【JavaScript】if 的简洁写法| 三元运算子

>>:  DOM 是什麽 ? 先了解 Node & HTMLElement 就知道了

GitHub Actions 基本介绍 - 开始自动化 workflow 的第一步

使用 GitHub Actions 可以让 GitHub Repo 内自订且自动执行你的软件开发流程...

前进切版之路! CSS微体验 (第一天)

从一般大学文学院毕业之後,茫茫在职场漂泊了几年。虽然工作稳定但总缺乏了热情与新意,随着年龄增长越来越...

[Day 9] 第一主餐 pt.2-Hello, django

在上一篇我们下载好了django 今天我们就要来开始部属我们的第一个django project了 ...

资安入门

资讯安全是透过安全管制措施来保护资讯资产免於受到危害,以达到机密性、完整性和可用性(即常听到的CI...

DAY28-React NFT网站成果展示

前言: 到了倒数第三天了,一开始目标要完成的NFT网站开发也到一个段落啦~今天阿森要来展示一下综合...