热门标签 | 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

推荐阅读
  • python自学教程哪里好,python比较好的教程
    本文目录一览:1、想学python去哪里比较好? ... [详细]
  • 智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台
    智能家居巨头 Aqara 基于 KubeSphere 打造物联网微服务平台 ... [详细]
  • docker整体了解
    Docker是一个基于LXC技术构建的容器引擎,基于Go语言开发,遵循Apache2.0协议开源Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移 ... [详细]
  • 1、对于List而言,要不然就使用迭代器,要不然就从后往前删除,从前往后删除会出现角标越界。因为我List有两个remove方法,一个是int作为形参(删除指定位置的元素),一个是 ... [详细]
  • 记录工作和学习中遇到和使用过的Python库。Target四个Level整理Collect学习Learn练习Practice掌握Master1.Python原生和功能增强1.1py ... [详细]
  • 在Oracle中执行动态SQL的几种方法在一般的sql操作中,sql语句基本上都是固定的,如:SELECTt.empno,t.ename FROMscott.emptWHEREt. ... [详细]
  • 重学数据结构之链表篇
    本文是重学数据结构系列文章的第二篇,本文和大家一起探讨链表的相关知识。重学数据结构之数组篇文章目录链表是怎么样的数据结构链表的特点常见的链表结构单链表双向链表循环链表链表or数组链 ... [详细]
  • ROC曲线原理及Python实现
    受试者工作特征曲线(receiveroperatingcharacteristiccurve,简称ROC曲线),是比较两个分类模型好坏的可视化工具ROC曲线的作用:1.较容易地查出 ... [详细]
  • DDOSDDOS的中文名叫分布式拒绝服务***,俗称洪水***DDoS***概念DoS的***方式有很多种,最基本的DoS***就是利用合理的服务请求来 ... [详细]
  • 1、上机的形式全国所有院校的机试都大同小异,大部分院校都有自己的OJ系统,一般通过OJ在线做题的方式来进行考核,一般要求在2-3个小时解决5-8道算法题。所谓OnlineJud ... [详细]
  • cherry-pick命令cherry-pick命令可以将另一分支的commit内容合并到当前分支。假如现在有两个分支v1.0,v1.1。v1.0有如下commit:commit4 ... [详细]
  • 无需人类知识,DeepMind新一代围棋程序AlphaGo Zero再次登上Nature
    选自DeepMind机器之心编译在今年五月击败柯洁之后,AlphaGo并没有停止自己的发展。昨天,DeepMind在《自然》杂志上发表了一篇论文 ... [详细]
  • SpringMVC启动流程——DispatcherServlet由于DispatcherServlet本身就是一个Servlet,它的本质上是一个Servlet,只是子类不断的对H ... [详细]
  • springioc_SpringIOC和DI
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringIOC和DI相关的知识,希望对你有一定的参考价值。1.Spring的概 ... [详细]
  • 在JAVA中专门设计了一组类,他们实现了各种各样的数据存储,这种专门用来存储其他对象的类,被称为容器类,这组类和接口的设计结构也被称为集合框架(CollectionFramework)。JAVA集 ... [详细]
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社区 版权所有