使用 CSS GRID 为什么我会出现这种差距?

2023-12-10

我正在学习 CSS GRID,但我不知道为什么在下面的示例中出现空白。 第二个项目可以适合第一个轨道,但我却在那里出现了间隙。 这是代码:

.container {
  display: grid;
  margin: 40px;
  grid-gap: 20px;
  text-align: center;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(4, 1fr);
}

.container div {
  background: #ff8000;
}

.container .item1 {
  grid-column: 2/4;
}
<div class="container">
  <div class="item1">1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
  <div>10</div>
  <div>11</div>
  <div>12</div>
</div>

现在如果我添加以下属性grid-row: 1/2;对于第一个项目,现在第二个项目占据了第一个轨道。这就是我所期望的。这是添加的代码grid-row: 1/2;:

.container {
  display: grid;
  margin: 40px;
  grid-gap: 20px;
  text-align: center;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(4, 1fr);
}

.container div {
  background: #ff8000;
}

.container .item1 {
  grid-column: 2/4;
  grid-row: 1/2;
}
<div class="container">
  <div class="item1">1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
  <div>10</div>
  <div>11</div>
  <div>12</div>
</div>

我的问题是:

为什么在第一个代码中我出现了一个间隙?第二个项目可以放入第一个轨道中。

我写的第一个和第二个代码有什么区别?


您需要了解放置算法才能理解此行为。从规格您可以找到完整的算法以及如何识别when每个项目都会被处理,这是理解两种情况之间差异的关键。

算法的主要步骤是:

  1. 生成匿名网格项

  2. 放置任何未自动定位的东西。

  3. 处理锁定到给定行的项目。

  4. 确定隐式网格中的列。

  5. 放置剩余的网格项。

让我们从最后一个示例开始,您在其中明确定义了grid-colum and grid-row对于第一个项目,使其成为不自动定位元素,因此我们将其放置在步骤 (1) 中。

然后我们将进入步骤(4)来放置剩余的项目

自动放置光标定义网格中的当前“插入点”,指定为一对行和列网格线。最初的自动放置光标设置为隐式网格中最开始的行线和列线。

因此,我们的光标位于顶部/左侧单元格,item2 将放置在那里,我们只需按照树顺序放置所有其他元素:

对于前面步骤中尚未定位的每个网格项,按顺序修改的文档顺序:

当然,没有任何项目会与已放置的 item1 重叠,并且我们会按照算法不断增加每个项目的光标。


现在让我们考虑第一个tricky唯一的区别是您没有指定的情况grid-row这将不再使你的元素成为不自动定位一是因为您只定义了grid-column因此该行将被自动定义,并且该项目现在将落入步骤(4),如果仔细检查步骤(4),您会发现两个子步骤:

如果该项目有明确的列位置:

如果该项目在两个轴上都有自动网格位置:

item1 将考虑第一个,将被放置在第二列中,并将增加光标!。光标的增量使得第二个元素放置在其后。

在您的第二个示例中,item1 将不会使用光标,因为它在步骤 (1) 中被考虑,因此 item2 将是第一个使用光标的项目,这与第一个示例中的 item1 将是第一个使用它的项目不同。

值得注意的是,在步骤(4)中我们有两种算法。 “稀疏”行为(默认行为),我们从不重置光标,并且总是递增它,从而产生间隙。 “密集”算法在每一步重置光标以填充所有单元格。要激活“密集”算法,您需要考虑grid-auto-flow

.container {
  display: grid;
  margin: 40px;
  grid-gap: 20px;
  text-align: center;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(4, 1fr);
  grid-auto-flow: dense;
}

.container div {
  background: #ff8000;
}

.container .item1 {
  grid-column: 2/4;
}
<div class="container">
  <div class="item1">1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
  <div>9</div>
  <div>10</div>
  <div>11</div>
  <div>12</div>
</div>

dense

如果指定,自动放置算法将使用“密集”打包算法,如果稍后出现较小的项目,该算法会尝试先填充网格中的空洞。这可能会导致项目看起来无序,因为这样做会填补较大项目留下的漏洞。

If omitted, a “sparse” algorithm is used, where the placement algorithm only ever moves “forward” in the grid when placing items, never backtracking to fill holes. This ensures that all of the auto-placed items appear “in order”, even if this leaves holes that could have been filled by later item ref


与使用相同算法解释的另一个非直观行为相关的问题:CSS 网格:自动放置算法的工作原理

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

使用 CSS GRID 为什么我会出现这种差距? 的相关文章

  • 如何在文本区域中使用除“文本插入符号”之外的透明字体?

    我有一个简单的文本区域 我需要制作透明字母 同时允许文本插入符可见 当我应用以下规则时 我会得到隐形插入符 textarea background transparent opacity 0 当我键入不可见文本时 我需要看到文本插入符移动
  • 从 MVC 中的 FormCollection 获取选定的下拉列表值

    我有一个使用 MVC 发布到操作的表单 我想从操作中的 FormCollection 中提取选定的下拉列表项 我该怎么做 我的 HTML 表单
  • php中的条件格式化html表与时间戳比较

    echo table style width 100 tr echo td Order td echo td Destination td echo td Location td echo td Status td echo td Time
  • 如何隐藏 URL 中的锚标记

    如何隐藏地址栏中以下链接 href 的哈希值 a href index php dev name 所以它会将我重定向到index php dev name 但我希望地址栏只显示index php 您可以使用 Javascript oncli
  • 使用 CSS 自定义字体?

    我见过一些在其网站上使用自定义字体的新网站 除了常规的 Arial Tahoma 等 他们支持大量的浏览器 如何做到这一点 同时 如果可能的话 还会阻止人们免费下载该字体 一般来说 您可以使用自定义字体 font face在你的 CSS 中
  • CSS设置默认滚动位置

    有没有办法将滚动位置设置为默认值 我知道如何在 javascript 中做到这一点 例如使用 jquery div divWithScroll attr scrollTop 200 但我只想用CSS来做 我不知道是否可行 不 CSS 中没有
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 如何倾斜 div 并保持背景图像不倾斜

    我已经花了几个小时了 所以希望有人能提供帮助 我有一个网站 其中大部分 div 都是倾斜的 大多数 div 都包含背景图像 现在我已经让 div 倾斜了 内容完美地位于其中 唯一的问题是背景图像 它与父级一起倾斜 我用谷歌搜索了很多 但找不
  • 如何将udp发送到udp node.js服务器?

    我对此很陌生 所以我真的不知道我在做什么 但我已经设置了一个 node js udp 服务器 我想从客户端 来自网站 向它发送一个数据包 但我不知道如何在 javascript 中做到这一点 或者是否可能 我不是在研究如何从 Node js
  • 如何在HTML中的PHP中注释掉HTML和PHP?

    这是我想注释掉的一行代码 h1 class post title a href title a h1 一种流行的注释方法是分别注释 html 和 php 有一个更好的方法吗
  • Modernizr - 加载 polyfills / 使用自定义检测的正确方法

    我想在网页上使用一些新的 HTML5 表单属性和输入类型 有些浏览器已经支持它们 有些浏览器不支持 也永远不会支持 这就是我想使用 Modernizr 的原因 这就是我的麻烦开始的原因 据我了解 Modernizr 本身并不是一个 poly
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 如何为背景图像添加边距?

    我想向背景图像添加边距 以便将其与屏幕中间保持距离 但将其添加到该类中会为整个主体添加边距 body poppage background url Imagenes tip3 png 50 200px no repeat E2E4E9 我怎
  • W3C 验证器:“握手警报:unrecognized_name”

    我正在尝试验证我的网站W3C Nu Html 检查器 https validator w3 org nu doc https 3A 2F 2Fwww healthdrop in 2F但我遇到了以下错误 不知道为什么 IO 错误 握手警报 u
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • JSTL 在循环中每 5 个字段集创建一个新行

    您好 我目前正在迭代并在表中显示字段集列表 为了让布局变得更得体一些 我想在每次循环到达第五个字段集时创建一个新行 谢谢 JSP div class det table class det tr td td tr table div
  • 如何获取 UIWebView 中元素的位置?

    我在 iPad 程序中加载了 html 的 UIWebView 通过使用 webkit column width 我将 html 分为几列 padding 0px height 1024px webkit column gap 0px we
  • 三级十进制有序列表 CSS

    我有一个 html 中的三级有序列表 我想为其提供如下样式 1 Item 1 1 1 Item 2 1 1 1 Item 3 下一个 plunker 中有一个 html 示例 http plnkr co edit DqhZ5pJILTUHG

随机推荐

  • 在 Windows 上安装“kgio-2.9.2”Gem 时出错

    在 Windows 上安装 kgio gem 时遇到问题 使用 Ruby 2 1 6 32 位和已安装的 DevKit Installing kgio 2 9 2 with native extensions Gem Ext BuildEr
  • 无效的应用程序二进制文件[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 今天我们收到了有关我们提交的反馈 我们不明白所报告的问
  • 在node.js中读写json文件

    好的 我有这个 json 文件 joe name joe lastName black matt name matt lastName damon 我想用node js添加一个人 joe name joe lastName black ma
  • 以 S+(版本 31 及更高版本)为目标需要 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一

    我正在制作通知应用程序并努力解决以下错误 java lang IllegalArgumentException com tonyapp rabbitfarm Targeting S version 31 and above requires
  • Backbone.js - 从 url 返回 JSON

    在尝试学习 Backbone js 时 我一直在尝试使用以下代码获取 JSON 文件的内容 function var MyModel Backbone Model extend var MyCollection Backbone Colle
  • 在 R 中定义 CTE(公用表表达式)?

    我在服务器上有这个表 我正在使用 R 查询它 library dplyr library DBI con lt dbConnect RSQLite SQLite memory dbWriteTable con iris iris 我能够运行
  • 重新分配选票,同时淘汰候选人

    考虑一下这个想法 我有一个排名选择投票系统 不符合门槛的候选人将在不同轮次中被淘汰 在此示例中 我们有 6 名候选人在初选中竞选两个席位 此时 我们已进入第四轮 没有获胜者 其中候选人 3 和 5 已被淘汰 在这一轮中 候选人4将被淘汰 他
  • 克隆芹菜链

    我有一个有趣的问题 试图克隆芹菜链以在组中使用 我的预期用例是这样的group chain clone args args for args in it 然而它一直抱怨没有足够的论据 我已经使用下面的内容对此进行了分解 在一个名为tasks
  • 春季启动 JSP 404

    我正在尝试在我的 Spring Boot 服务中添加一个 jsp 页面 我的问题是 每次我尝试进入该页面时 我都会遇到以下问题 白标错误页面 此应用程序没有 error 的显式映射 因此您会看到 这是后备措施 2015 年 EEST 4 月
  • 如何为 MVC 创建自定义验证属性

    我想为 MVC2 的电子邮件地址创建一个自定义验证属性 该属性不是从 RegularExpressionAttribute 继承 但可以在客户端验证中使用 有人能指出我正确的方向吗 我尝试了这样简单的事情 AttributeUsage At
  • 如果 HTML 文件已更新,则执行 JavaScript [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我正在尝试在 JavaScript jQuery 甚至 PHP 中找到一个插件或函数 如
  • 从 URL 中删除应用程序名称

    我的网站使用 JSF 并且 url 似乎是 http mysitename com wompower6 faces home xhtml 我正在使用 Prettyfaces 因此如果我在 Pretty config xml 中使用以下内容
  • 如何在 PostgreSQL 中搜索一定范围的整数?

    我有一个整数列 我需要搜索该列以 19 开头的行 在 MySQL 中我会使用 SELECT WHEREid喜欢 19 ERROR operator does not exist integer unknown LINE 1 select f
  • 如何从 NSDictionary 获取键/值对?

    我在 NSDictionary 方面需要很少的帮助 如果我有字典 我怎样才能得到一对 让我们说一个 id 的值 NSDictionary allCourses NSJSONSerialization JSONObjectWithData a
  • Django 管理员。显示分层下拉过滤器

    我有以下模型 from django db import models class State models Model name models CharField max length 30 abbreviation models Cha
  • Azure-Functions:您可以使用 web.config 限制(例如 IP 限制或基本身份验证)

    Azure 网站可能存在 IP 限制 as 正在使用基本身份验证保护站点 这些技术或任何其他 web config 技术是否可以在 Azure Functions 上使用 或者是否需要进行编码 我在 Azure Function 的 www
  • AchartEngine 中的圆环图半径

    我正在尝试在 aChartengine 中设置圆环图内圆半径和外圆半径 下面是我的代码 public class MainActivity extends Activity GraphicalView gv RelativeLayout r
  • 如何在 Bottle 中将 wsgi.url_scheme 设置为 https?

    我想将所有请求重定向到http to https 是否有通用的设置方法wsgi url scheme to https在 Python 2 7 Bottle 应用程序中 应用程序的一般结构是 setup py contains instal
  • Maven 中的传递 AAR 依赖项

    我正在从使用 android maven plugin 的 Maven 项目构建 Android 应用程序 在这个项目中 我使用新的测试版数据绑定库 它包含在 Android SDK 的本地 m2repository extras andr
  • 使用 CSS GRID 为什么我会出现这种差距?

    我正在学习 CSS GRID 但我不知道为什么在下面的示例中出现空白 第二个项目可以适合第一个轨道 但我却在那里出现了间隙 这是代码 container display grid margin 40px grid gap 20px text