热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

为什么具有网格区域名称但未在grid-template-area中定义的网格项目会创建附加列?

如何解决《为什么具有网格区域名称但未在grid-template-area中定义的网格项目会创建附加列?》经验,为你挑选了2个好方法。

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

相反,我从开始grid-template-areas,并通过属性将区域名称分配给了网格项grid-area

之后,我对如果从中删除grid-item会发生什么感兴趣grid-template-areas。结果有点奇怪。

删除的网格项目位于右侧,并由其他列分隔

问题:

为什么会这样呢?这是预期的行为还是我的代码中遗漏了某些东西?如何删除此列?

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
Main
Footer

Michael_B.. 10

这个答案分为四个部分。前三个帮助说明了第四个,其中涵盖了添加额外列的原因。如果您只对答案感兴趣,请跳到最后。

内容:

    不仅让人眼前一亮:还有额外的一排!

    grid-area属性。

    grid-template-areas属性。

    未引用网格区域的位置。


1.不仅让人眼前一亮:还有另外一排!

您仅部分定义了问题。是的,还有一栏。但是,还有另外一排。

由于尚未在网格容器上定义高度,因此该高度默认为auto–内容的高度(更多详细信息)。因此,没有内容的任何行都只会折叠并且不可见。

宽度不存在此问题,因为在这种情况下,您使用的是块级容器(由创建display: grid),默认情况下,该容器旨在消耗其父级的全部宽度(更多详细信息)。

这就是为什么您看不到多余的行。如果您给容器增加一些高度,则会出现该行。

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
Main
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
Main
Footer


2. grid-area财产。

给该grid-area属性命名将为该区域的每一侧创建一个命名行。

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

grid-row-start: header

grid-column-start: header

grid-row-end: header

grid-column-end: header

像和一样margin,该属性是简写属性。与那些属性不同,如上所述,具有逆时针分辨率顺序(使用LTR语言)。borderpaddinggrid-areagrid-area

因为命名网格区域占据空间,所以它们需要在其中存在行和列。因此,即使未在中引用命名网格区域,也始终会影响布局grid-template-areas

因此,“固定”布局所需的所有操作都是remove 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
Main
Footer


3. grid-template-areas财产。

行和列(A / K / A磁道)正在使用创建的grid-template-rowsgrid-template-columns或者grid-template-areas属于明确的格。这些属性未定义的任何轨道都属于隐式网格(源)。

对于中列出的每个字符串grid-template-areas,都会创建一个新行。

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

您的代码创建一个具有两行一列的显式网格:

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

正如你可以在图片中看到,headerfooter有自己的行存在于一列,完全按照规定grid-template-areas

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

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

grid-template-columns 仅适用于显式列。

grid-auto-columns作品大多隐列(见下面的说明)。

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
Main
Footer

注意:如果使用grid-template-areas(创建显式轨道)放置网格项目,但未使用grid-template-columns/ 调整网格项目的大小grid-template-rows,则grid-auto-columns/ grid-auto-rows应用于它们。(第二段)

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
Main
Footer


4.放置未参考的网格区域。

注意:老实说,我大约有75%的人确定此部分完全正确。规范语言对我来说不是100%清晰的。我欢迎您提供反馈,更正和更准确的答案。

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

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

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

哪里grid-area: main去了?

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

网格区域由网格自动放置算法处理,该算法看起来像这样:

    由于grid-area: main未明确定义(请参见上文第3节),因此它属于隐式网格。

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


Temani Afif.. 8

这是对Michael_B已经说过的内容的扩展,以突出显示如何创建隐式网格线。

让我们从一个简单的例子开始:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header;
  background: blue;
}
H

我们有一个网格项,仅在其中设置grid-row-start,最终结果是两行,其中有一个空行。因为我们没有定义任何显式网格,所以它们都在隐式网格中

要了解发生了什么,请参考规范:

网格模板行,网格模板列和网格模板区域这三个属性共同定义了网格容器的显式网格。...如果这些属性没有定义任何明确的轨迹,则明确的网格在每个轴上仍然包含一条网格线参考

因此,即使我们什么也没定义,我们仍然有一个包含两行的显式网格。这非常重要,因为如果没有这些行,我们将没有空行。

现在说明部分grid-row-start:header

第一次尝试将网格区域的边缘与命名网格区域匹配:如果有一条名为“ -start(对于grid- -start)/ -end”(对于 grid-- end)的命名行,则贡献第一个这样的行到网格项目的位置。

否则,将其视为1已与一起指定了整数

显然,我们将陷入否则,将有grid-row-start:header 1

&& ?

第N条网格线贡献给网格项目的位置...

如果将名称指定为,则仅计算具有该名称的行。如果没有足够多的具有该名称的线,则假定所有隐式网格线都具有该名称,以查找该位置

在我们的情况下,该名称的行数不够(根本没有任何行),因此我们应至少添加一行具有该名称的行,然后尝试放置元素,并且由于整数为正数,因此项目将放置在该行下方:

网格有一条默认行(红色),使用会在其下header方生成一个新的隐式行(由于1自动添加了默认值),并且该元素将放置在该行下方,从而创建了额外的一行。

如果我们使用-1的话,最后只会有一行:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header -1;
  background: blue;
}
H

在这种情况下,隐式线在显式一线上方生成而我们的元素位于两行之间。

如果负整数给出,它代替计数反向,从起始显式网格的端部边缘

同时使用-11将给我们以下结果:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header -1;
  background: blue;
}

footer {
  grid-row-start: header 1;
  background: red;
}
H
F

这是另一个包含多个项目的示例,用于说明假定所有隐式网格线都具有该名称

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header 1;
  background: blue;
}
main {
  grid-row-start: main 1;
  background: red;
}
footer {
  grid-row-start: footer -1;
  background: green;
}
extra {
  grid-row-start: extra 5;
  background: orange;
}
H
M
F
E

在此示例中,我们总共需要6条隐式行,因为所有使用的整数都在该范围内[-1,5](不包括0无效值),并且,为了放置每个元素,所有这些行将具有为每个元素定义的名称。这就是为什么具有相同编号的两个元素将在同一行(如mainheader),因为即使名称不同,参考线也将相同。


现在,让我们添加grid-row-end到前面的示例中:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header;
  grid-row-end: header;
  background: blue;
}
H

什么都不会发生,并且会得到完全相同的结果,因为:

如果起点线等于终点线,请移除终点线。参考

让我们使用其他名称:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header;
  grid-row-end: foo;
  background: blue;
}
H

结果仍然相同,因为两者仍然相等(是的,它们相等!)。两个值都等于 1,因此两个都只需要一条隐含线。然后,浏览器将创建一条具有两个不同名称的隐式行,从而使我们的两个值相等。

让我们更改一个的值:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header 1;
  grid-row-end: foo 2;
  background: blue;
}
H

再次得到相同的结果,但使用“不同”的代码。在这种情况下,我们将有2条隐式线,并且我们的元素将放置在它们之间。

基本上,涉及隐式网格时,该名称不相关,因为它们都将共享同一行。仅当我们在显式网格内定义它们时才有意义:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: hello 1;
  grid-row-end: john 3;
  background: blue;
}
main {
  grid-row-start: main 1;
  grid-row-end: hi 2;
  background: red;
}
footer {
  grid-row-start: footer 2;
  grid-row-end: custom 5;
  background: green;
}
extra {
  grid-row-start: extra 3;
  grid-row-end: fsdfsdfsdfsd 5;
  background: orange;
}
H
M
F
E

在上面的示例中,您可以使用任意随机字符串更新名称,并且始终会得到相同的结果。它仅取决于整数:

考虑到以上所有,从逻辑上讲,它们的行为相同grid-column-*


现在,我们拥有了解初始示例所发生的一切所需的一切。

首先,我们有如下所示的显式网格:

body {
  display: grid;
  grid-template-areas: 
     "header"
     "footer";
  /* No relevant but to better illustrate*/
  grid-auto-rows:50px;
  grid-auto-columns:50px;
}

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

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

footer {
  grid-area: footer;
  background: blue;
}
Header

Footer

grid-template-areas属性从模板中的命名网格区域创建隐式命名线。对于每个命名网格区域foo,将创建四行隐式命名行:两foo-start行named ,命名命名网格区域的行开始行和列起始行,两foo-end行named ,命名命名网格区域的行末行和列末行网格区域。参考

现在,如果我们添加第三个元素,grid-area:main;则意味着

grid-row-start:main 1;
grid-row-end:main 1;
grid-column-start:main 1;
grid-column-end:main 1;

我们删除,*-end因为它们等于*-start

grid-row-start:main 1
grid-column-start:main 1

根据前面的解释,我们将需要一条额外的隐式线,main并将我们的元素放置在水平线的下方和垂直线的右侧:

body {
  display: grid;
  grid-template-areas: 
     "header"
     "footer";
  /* No relevant but to better illustrate*/
  grid-auto-rows:50px;
  grid-auto-columns:50px;
}

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

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

footer {
  grid-area: footer;
  background: blue;
}
Header
Main
Footer

如果我们删除了grid-auto-*,行会对其内容的高度,使得彼此的行footer-endmain空。该列将拆分网格元素的宽度,而网格元素是具有完整宽度的块元素。这就是为什么您只看到一个额外的列而不看到额外的行的原因:

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
Main
Footer

另一个有趣的观察结果是,如果您使用添加更多元素grid-area:,则它们都将位于彼此之上:

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

extra {
  grid-area: extra;
  background: red;
  opacity:0.8;
}
more {
  grid-area: more;
  background: green;
  opacity:0.3;
}
Header
Main
Footer
E More

根据前面的解释,所有这些都将具有以下内容:

grid-row-start: 1;
grid-column-start: 1;

由于数字相同(名称与我们已经说明的名称无关),它们都将属于同一区域。



1> Michael_B..:

这个答案分为四个部分。前三个帮助说明了第四个,其中涵盖了添加额外列的原因。如果您只对答案感兴趣,请跳到最后。

内容:

    不仅让人眼前一亮:还有额外的一排!

    grid-area属性。

    grid-template-areas属性。

    未引用网格区域的位置。


1.不仅让人眼前一亮:还有另外一排!

您仅部分定义了问题。是的,还有一栏。但是,还有另外一排。

由于尚未在网格容器上定义高度,因此该高度默认为auto–内容的高度(更多详细信息)。因此,没有内容的任何行都只会折叠并且不可见。

宽度不存在此问题,因为在这种情况下,您使用的是块级容器(由创建display: grid),默认情况下,该容器旨在消耗其父级的全部宽度(更多详细信息)。

这就是为什么您看不到多余的行。如果您给容器增加一些高度,则会出现该行。

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
Main
Footer


2> Temani Afif..:

这是对Michael_B已经说过的内容的扩展,以突出显示如何创建隐式网格线。

让我们从一个简单的例子开始:

.container {
  width:100px;
  display: inline-grid;

  grid-auto-rows: 40px;
  border: 1px solid;

}
header {
  grid-row-start: header;
  background: blue;
}
H

推荐阅读
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了W3C标准盒模型和IE传统盒模型的区别,探讨了CSS3中box-sizing属性的使用方法及其在布局中的重要性。通过实例分析,帮助读者更好地理解和应用这一关键概念。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 网易严选Java开发面试:MySQL索引深度解析
    本文详细记录了网易严选Java开发岗位的面试经验,特别针对MySQL索引相关的技术问题进行了深入探讨。通过本文,读者可以了解面试官常问的索引问题及其背后的原理。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 深度学习理论解析与理解
    梯度方向指示函数值增加的方向,由各轴方向的偏导数综合而成,其模长表示函数值变化的速率。本文详细探讨了导数、偏导数、梯度等概念,并结合Softmax函数、卷积神经网络(CNN)中的卷积计算、权值共享及池化操作进行了深入分析。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
author-avatar
手机用户2502904767_602
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有