为什么网格模板区域中缺少的网格区域名称会创建额外的轨道?

2024-01-09

我创建了一个简单的 CSS 网格,我决定不指定grid-template, grid-template-columns, grid-template-rows特性。

相反,我开始于grid-template-areas,并分配地区名称 to the 网格项 via grid-area财产。

之后,我对如果删除会发生什么感兴趣网格项 from grid-template-areas。结果有点奇怪。

被移除的网格项位于右侧并由附加栏。

The problem:
enter image description here

为什么会发生这种情况?这是预期的行为还是我在代码中遗漏了某些内容?如何删除该列?

body {
  display: grid;
  grid-template-areas: 
     "header"
     "footer";
}

header {
  grid-area: header;
  background: lightblue;
}

main {
  grid-area: main;
  background: darkorange;
}

footer {
  grid-area: footer;
  background: blue;
}
<header>Header</header>
<main>Main</main>
<footer>Footer</footer>

这个答案有四个部分。前三个有助于解释第四个,其中涵盖了额外列的原因。如果您只对答案感兴趣,请跳至最后。

内容:

  1. 不只是对视:还有额外的一排!
  2. The grid-area财产。
  3. The grid-template-areas财产。
  4. 未引用网格区域的放置。

1. 不只是表面上看到的:还有额外的一排!

您只部分定义了问题。是的,还有一个额外的列。但还有一个额外的行。

由于您尚未在网格容器上定义高度,因此高度默认为auto– 内容的高度(更多细节 https://stackoverflow.com/a/46546152/3597276)。因此,任何没有内容的行都会折叠起来并且不可见。

宽度不存在此问题,因为在本例中,您使用的是块级容器(由display: grid),它被设计为消耗其父级的整个宽度,默认情况下(更多细节 https://stackoverflow.com/a/46546152/3597276).

这就是为什么您没有看到额外的行。如果给容器一定的高度,就会出现该行。

body {
  display: grid;
  grid-template-areas:
    "header"
    "footer";
  height: 150px; /* new */ 
}
body {
  display: grid;
  grid-template-areas:
    "header"
    "footer";
  height: 150px; /* new */
}

header {
  grid-area: header;
  background: aqua;
}

main {
  grid-area: main;
  background: darkorange;
}

footer {
  grid-area: footer;
  background: lightgreen;
}
<header>Header</header>
<main>Main</main>
<footer>Footer</footer>

注意:如果您使用过display: inline-grid,额外的行和额外的列都将是不可见的。

body {
  display: inline-grid;
  grid-template-areas:
    "header"
    "footer";
}
body {
  display: inline-grid; /* adjustment */
  grid-template-areas:
    "header"
    "footer";
}

header {
  grid-area: header;
  background: aqua;
}

main {
  grid-area: main;
  background: darkorange;
}

footer {
  grid-area: footer;
  background: lightgreen;
}
<header>Header</header>
<main>Main</main>
<footer>Footer</footer>

2. The grid-area财产。

给它起个名字grid-area财产创造了一个命名线 https://www.w3.org/TR/css3-grid-layout/#implicit-named-line对于该区域的每一侧。

例如,grid-area: header按顺序解决,如下所示:

  • grid-row-start: header
  • grid-column-start: header
  • grid-row-end: header
  • grid-column-end: header

Like margin, border and padding, the grid-area https://developer.mozilla.org/en-US/docs/Web/CSS/grid-areaproperty 是属性的简写。与这些属性不同的是,grid-area具有逆时针分辨率顺序(在 LTR 语言中),如上所示。

由于命名网格区域占用空间,因此它们需要存在行和列。因此,命名的网格区域总是会影响布局,即使它们没有被引用grid-template-areas.

因此,“修复”布局所需的就是删除grid-area: main.

main {
  /* grid-area: main; */
  background: darkorange;
}
body {
  display: grid;
  grid-template-areas:
    "header"
    "footer";
}

header {
  grid-area: header;
  background: aqua;
}

main {
  /* grid-area: main; */
  background: darkorange;
}

footer {
  grid-area: footer;
  background: lightgreen;
}
<header>Header</header>
<main>Main</main>
<footer>Footer</footer>

3. The grid-template-areas财产。

使用创建的行和列(a/k/a 轨道)grid-template-rows, grid-template-columns or grid-template-areas属于显式网格。任何未由这些属性定义的轨道都属于隐式网格 (source https://www.w3.org/TR/css3-grid-layout/#explicit-grids).

对于中列出的每个字符串grid-template-areas https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas,创建一个新行。

对于每个名称或点序列(...)在字符串中,会创建一个新列(但这不适用于本例,因为每个字符串只有一个名称)。

您的代码创建一个包含两行和一列的显式网格:

body {
  display: grid;
  grid-template-areas: 
    "header"
    "footer";
}

正如你在图片中看到的,header and footer有自己的行并存在于第一列中,与中定义的完全相同grid-template-areas.

额外的两行和两列是隐式网格的一部分。

我们可以通过调整它们的大小来验证这一点。

grid-template-columns https://www.w3.org/TR/css3-grid-layout/#track-sizing仅适用于显式列。

grid-auto-columns https://www.w3.org/TR/css3-grid-layout/#implicit-grids works mostly在隐式列上(参见下面的注释)。

body {
  display: grid;
  grid-template-areas: "header" "footer";
  grid-template-columns: 1fr;
  grid-auto-columns: 100px;
  grid-template-rows: 100px 100px;
  grid-auto-rows: 25px;
}
body {
  display: grid;
  grid-template-areas:
      "header"
      "footer";
  grid-template-columns: 1fr;
  grid-auto-columns: 100px;
  grid-template-rows: 100px 100px;
  grid-auto-rows: 25px;
}

header {
  grid-area: header;
  background: aqua;
}

main {
  grid-area: main;
  background: darkorange;
}

footer {
  grid-area: footer;
  background: lightgreen;
}
<header>Header</header>
<main>Main</main>
<footer>Footer</footer>

Note: If grid items are placed using grid-template-areas (creating explicit tracks), but they are not sized using grid-template-columns / grid-template-rows, then grid-auto-columns / grid-auto-rows apply to them. (second paragraph) https://www.w3.org/TR/css-grid-1/#explicit-grids

body {
  display: grid;
  grid-template-areas:
      "header"
      "footer";
  grid-auto-columns: 100px;
  grid-auto-rows: 25px;
}
body {
  display: grid;
  grid-template-areas:
      "header"
      "footer";
  grid-auto-columns: 100px;
  grid-auto-rows: 25px;
}

header {
  grid-area: header;
  background: aqua;
}

main {
  grid-area: main;
  background: darkorange;
}

footer {
  grid-area: footer;
  background: lightgreen;
}
<header>Header</header>
<main>Main</main>
<footer>Footer</footer>

4. 未引用网格区域的放置。

注意:老实说,我大约 75% 确信本节是完全正确的。规范语言对我来说并不是 100% 清楚。我欢迎反馈、更正和更准确的答案。

在您的代码中,您有第三个网格区域,该区域未在grid-template-areas.

body {
  display: grid;
  grid-template-areas: 
    "header"
    "footer";
}

main {
  grid-area: main;
  background: darkorange;
}

哪里有grid-area: main go?

正如我们已经看到的,它被发送到隐式网格中,其中有两列和两行。

网格区域由网格自动放置算法 https://www.w3.org/TR/css3-grid-layout/#placement,这似乎是这样说的:

  1. Because grid-area: main没有显式定义(参见上面第 3 节),它属于隐式网格。

  2. 由于网格列线 2 和网格行线 3(显式网格的边界)被命名为网格线,因此必须在隐式网格中创建新线以容纳 4 条命名线grid-area: main。这只能发生在中间有空行和空列的情况下,将显式网格与自动放置的隐式网格区域分开。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么网格模板区域中缺少的网格区域名称会创建额外的轨道? 的相关文章

随机推荐

  • 为什么我的开发团队应该拥有构建服务器?

    我们知道这是好事 但我发现自己向我的雇主证明了这一点 请说明为什么开发团队需要构建服务器 使用构建服务器有多种原因 没有特定的顺序 但我的脑海中浮现出以下内容 您可以简化开发人员的工作流程并减少出错的机会 您的构建服务器可以处理多个步骤 例
  • 仅在使用 jquery 最后一个键后进行 Keyup

    我正在编写一个简单的脚本来提取输入 keyup 事件的数据库信息 我遇到的问题是每次用户按下一个键时总是重复 keyup 事件 如何才能使其仅在按下最后一个键后才起作用 我想我应该在每次按键后使用像 setTimeOut 这样的函数 但我不
  • Java 中的虚拟(派生)属性是什么?

    我应该创建一个派生属性 该属性将具有处理 Mark E Brown 等值的访问器和修改器 我不明白这个词 这对我来说是新的 帮助 public String getFullName return fullName getFirstName
  • 如何增加雷达图 MPAndoid Chart 的大小?

    I want to increase size of MPAndroid Radar Chart I observed that the size increases gradually when i increase size of th
  • 使用mockito“无法解析方法”

    I use org springframework security core Authentication其中有一个方法 Collection
  • 字符串格式正值和负值以及条件颜色格式 XAML

    我正在寻找一种简单的方法来使用以下标准格式化结果 如果为正 则添加加号并将其显示为绿色 如果为负则添加减号并将其显示为红色 我已经完成了一半 我只是不知道获得颜色格式的最简单方法是什么 有没有一种不使用值转换器的方法
  • cpp文件中的C++变量可以定义为特殊符号β吗

    我们可以使用特殊字符在 C C 中定义变量吗 例如 double 如果是 如何实现这一目标 根据CPP标准工作草案 N4713 5 10 标识符 lex name 标识符是任意长的字母和数字序列 标识符中的每个通用字符名应指定一个字符 该字
  • iOS:如何获取安装引用源

    我想了解用户如何使用什么来源 归因 安装应用程序 对于 Android 可以获取引用者的 URL 但我还没有找到针对 iOS 的明显方法 有外部服务 例如 AppsFlyer http support appsflyer com entri
  • 将 QString 转换为 std::string

    我看过其他几篇关于将 QString 转换为 std string 的帖子 它应该很简单 但不知怎的 我收到了一个错误 我的代码使用cmake编译成VS项目 我使用的是VS Express 所以QT库没有问题 而且我编写的GUI除了这部分之
  • ionic-item 颜色和 href 不起作用

    我开始了一个基于侧菜单模板的离子项目 我试图更改侧面菜单中每个元素的背景颜色 我希望每个项目都有不同的颜色 我尝试添加离子颜色类
  • 重塑数据(更快的方法)

    我发现了一张频率表 今天计数 我必须扩展到原始值的数据框架 我能够做到这一点 但想知道是否有更快的方法使用 reshape 包 r data table 原来的表是这样的 i1 i2 i3 i4 m f 1 0 0 0 0 22 29 2
  • 从字符串中删除所有非 utf-8 符号

    我有大量的文件和解析器 我要做的就是去掉所有非 utf 8 符号并将数据放入 mongodb 中 目前我有这样的代码 with open fname r as fp for line in fp line line strip line l
  • Typeorm子查询添加选择

    我是新使用的typeorm这是我第二次感到困惑typeorm 我有以下查询 SELECT t1 a t1 b t2 a SELECT TOP 1 t1 a FROM table1 t1 WHERE t1 b t2 a ORDER BY t1
  • 将 pandas 中的时间序列重新采样为每周间隔

    如何将 pandas 中的时间序列重新采样为每周频率 其中每周从任意一天开始 我看到有一个可选的关键字库 但它只适用于短于一天的时间间隔 你可以通过锚定偏移量 http pandas pydata org pandas docs stabl
  • C++ boost 库 - 写入 ini 文件而不覆盖?

    我正在尝试使用 boost 库的 ini 解析器和属性树编写 ini 文件 该文件是分阶段写入的 我的意思是每个函数都会写入其中的一部分 最后 我只留下最后的输出 而不是写下所有内容 我在编写时使用的示例代码 property tree p
  • selenium.open() 在迭代测试中变得无响应

    我有一组必须使用不同参数执行的测试步骤 我已在 Eclipse TestNG 中编写了此脚本 由 Excel 工作表提供的参数驱动 现在 测试步骤包括设置页面的属性 然后打开另一个页面以确认该属性已设置 所以 实际上 我使用了一个简单的se
  • Spark,如何打印查询?

    我正在使用 pyspark df self sqlContext read option es resource indexes format org elasticsearch spark sql load df df filter df
  • 如何用Java管理Linux文件权限?

    是否有任何机制来获取和设置文件 目录权限 比如我想以shell的方式显示一个文件的权限 rwxr xr 使用 Java 可以做到这一点吗 我知道里面有一些方法File类来知道文件是否canExecute canRead and canWri
  • Apple-app-site-association 文件无法下载

    我已将我的 apple app site association 文件上传到我的 HTTPS Web 服务器的根目录之后 我已在 xcode 中添加了我的关联域 我已遵循 Apple 通用链接教程 SWC 拒绝重定向到 https exam
  • 为什么网格模板区域中缺少的网格区域名称会创建额外的轨道?

    我创建了一个简单的 CSS 网格 我决定不指定grid template grid template columns grid template rows特性 相反 我开始于grid template areas 并分配地区名称 to th