为什么 grid-gap 会改变 CSS Grid 中列的宽度?

2023-12-25

使用 css-grid,我在容器内设置了一个 1002px 宽的 24 列网格。

在容器 div 内,有一个跨 21 列的子 div。我期望子 div 的宽度是:

21/24 * 1002 = 876.75

当添加 grid-gap 属性时,列的宽度减小到 873px,这是不希望的。

如何编写 CSS 以使 div 的宽度为 876.75px?

参见示例:https://codepen.io/edtalmadge/pen/MvLrqW?editors=1100 https://codepen.io/edtalmadge/pen/MvLrqW?editors=1100

HTML

<div class="container1">
  <div class="column">
    <p>No grid-gap ...width is 876px as expected</p>
  </div>
</div>

<div class="container2">
  <div class="column">
    <p>grid-gap: 30px; ...width becomes 873px (3px too narrow)</p>
  </div>
</div>

CSS

   /* no grid gap */
   .container1 {
      display: grid;
      grid-template-columns: repeat(24, 1fr);
      width: 1002px;
      background-color: #ededed;
    }

    /* has grid gap */
    .container2 {
      grid-gap: 30px; // This causes the width of .column to increase
      display: grid;
      grid-template-columns: repeat(24, 1fr);
      width: 1002px;
      background-color: #ededed;
    }

    .column {
      grid-column: span 21;
      background-color: gray;
    }
.container1 {
  display: grid;
  grid-template-columns: repeat(24, 1fr);
  width: 1002px;
  background-color: #ededed;
}

.container2 {
  display: grid;
  grid-template-columns: repeat(24, 1fr);
  width: 1002px;
  background-color: #ededed;
  grid-gap: 30px;
  border-top: 1px solid yellow;
}

.column {
  grid-column: span 21;
  background-color: gray;
}

p {
  text-align: center;
  color: #fff;
  font-family: Helvetica, Arial, sans-serif;
}
<div class="container1">
  <div class="column">
    <p>No grid-gap ...width is <strong style="color: lime;">876px</strong> as expected</p>
  </div>
</div>

<div class="container2">
  <div class="column">
    <p>grid-gap: 30px; ...width becomes <strong style="color: #fb665e;">873px</strong> (3px too narrow)</p>
  </div>
</div>

两个网格容器都有 24 列,宽度为 1002px:

grid-template-columns: repeat(24, 1fr);
width: 1002px

您的问题仅涉及前 21 列:

.column {
   grid-column: span 21;
}

这意味着最后三列和网格间隙应从计算中排除。

Using Firefox's grid overlay tool https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts. The striped bars are the gutters.


第一个集装箱

在第一个容器中,没有排水沟,每个fr单位等于 41.75px。

1002 / 24 = 41.75

这意味着 21 列等于 876.75 像素的宽度。

41.75 * 21 = 876.75px

第二个容器

关于第二个容器,首先要记住的是fr单位仅代表可用空间。这是考虑其他尺寸后剩下的空间,包括排水沟.

7.2.3.灵活的长度:fr unit https://www.w3.org/TR/css3-grid-layout/#valdef-flex-fr

灵活的长度或<flex>是一个维度fr单位,代表一部分可用空间在网格容器中。

可用空间 https://www.w3.org/TR/css3-grid-layout/#free-space

等于可用网格空间减去基本尺寸的总和 所有网格轨道(包括排水沟),都归零。如果可供使用的话 网格空间是无限的,自由空间也是无限的。

在第一个容器中,所有空间都是可用空间。在第二个容器中则不然。

另外值得注意的是:grid-gap属性仅适用于网格项目之间,而不适用于项目和容器之间。

10.1.排水沟:grid-column-gap, grid-row-gap, and grid-gap特性 https://www.w3.org/TR/css3-grid-layout/#gutters

这些属性指定网格行和网格之间的间距 列,分别。

因此,在 24 列的网格中,有 23 个装订线(见上图)。

因此,对于第二个容器,我们必须首先减去排水沟所占用的空间:

1002 - (30 * 23) = 312

我们现在知道第二个容器中的可用空间是 312px。

现在我们需要确定每个的值fr unit.

312 / 24 = 13

So each fr单位等于13px。

现在我们需要计算 21 列的装订线和 fr 的总宽度:

21 * 13 = 273px (total width of free space)
20 * 30 = 600px (total width of gutters)
          -----
          873px

或者你可以直接减去三fr总宽度中的单位和三个装订线:

1002px - (13 * 3) - (30 * 3) = 873px

Solution

由于您正在使用fr由于建立长度的单位以及容器之间的可用空间量不同,因此您的代码只能在全宽(24 列)下为两个容器实现相同的宽度。

要在小于全宽的情况下实现相等宽度,您需要使用不同的调整大小方法,例如px or em,对于列。

根据您的总体目标,可能还有其他解决方案。

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

为什么 grid-gap 会改变 CSS Grid 中列的宽度? 的相关文章

  • rvest如何通过id选择特定的css节点

    我正在尝试使用 rvest 包从网页中抓取数据 简单来说 html 代码如下所示 div class style div
  • Anchor Cycler / 下拉菜单定期导入学校班级数据

    SO 我最近一直在研究一些 html javascript css 为我的学生创建一个在线表格来查看详细信息 分数和各种信息 但我遇到了困难 不确定如何做我正在尝试的事情去做 我将所有这些内容发布在一个线程中的原因是因为我认为其中几个可能会
  • 添加自定义 CSS 到 Jekyll

    我是 Jekyll 新手 我正在按顺序使用自定义 html 和 css 制作一个网站 Jekyll 默认下载 minima 主题 所以我用以下 html 覆盖了主页 all my html
  • 角度按钮单击旋转图标

    我有以下按钮
  • 使用 Jsoup 选择没有类的 HTML 元素

    考虑一个像这样的 html 文档 div p p p p p class random class name p div 我们怎样才能选择所有p元素 但不包括p元素与random class name class Elements ps b
  • FontAwesome 与 PrimeFaces

    我一直渴望在 Primefaces 中包含 FontAwesome 图标 最后 Optimus 昨天发布了这个伟大的新图标 gt http blog primefaces org p 3004 comment 5422 http blog
  • 居中时仅在文本的最后一行下划线

    我只想在某些文本的最后一行下划线 当文本换行到更多行时 仍然只有最后一行需要加下划线 我找到了这个解决方案 https stackoverflow com questions 15180827 advanced css challenge
  • 带填充的 Tailwind CSS 导航悬停下拉菜单

    我正在尝试展示子 ul 当项目悬停时 在第一个导航项目上列出 一切正常 除了有时 时好时坏 当您位于第一行的填充之间时 ul 项目和子项目 ul 项目 次要项目 ul 会消失 当我从下拉菜单导航到项目列表时 如何保持辅助导航列表打开 JSF
  • 将较新版本的 WebKit 嵌入 Android 应用程序

    我正在使用 Web 技术开发 Android 应用程序 CSS 转换 对于应用程序的功能非常重要 因为它们负责滚动和滑动页面 非常缓慢 根据互联网上找到的信息 CSS 过渡不是硬件加速的 除非进行 3 维转换 我发现很多文章说我应该放置 w
  • 这个 CSS 选择器是什么? [类* =“跨度”]

    我在 Twitter Bootstrap 中看到了这个选择器 show grid class span background color eee text align center border radius 3px min height
  • 交替 div 使图像向左(偶数)或向右(奇数)

    我正在尝试更好地排列图像 而不仅仅是一列中的图像 请参阅附件中的示例 每篇文章的图像可以位于左侧和右侧 这是我的代码 HTML section class content list page section
  • 如何实现右边缘倾斜的 div? [复制]

    这个问题在这里已经有答案了 我几天来一直在寻找使 div 的右边缘倾斜 45 度的代码 这是我特别想要得到的图像示例 似乎有很多 倾斜边缘 div 的示例 但我找不到任何具有特定右侧倾斜的示例 我花了很多时间试图改变其他人的代码 但结果却一
  • 使用jquery和css点击按钮后旋转div文本

    我想使用 jquery 和 css 单击按钮后旋转 div 文本 如果用户点击Rotate Left按钮 然后文本在左侧旋转 or用户点击Rotate Right按钮然后文本在右侧旋转 Example div Happy Birthday
  • CSS:多属性选择器

    我想设置 电子邮件 和 密码 类型的表单输入样式 但不设置其他任何样式 我正在想象类似以下的事情 input type email type password 然而 属性选择器的工作方式似乎将其解释为 输入 其中类型同时是 电子邮件 and
  • 是否可以在没有 Javascript(仅 CSS)的情况下执行相同的操作(悬停效果)?

    我正在尝试创建一个带有图标的按钮像这样 http jsfiddle net pRdMc HTML div div class icon div span Send Email span div CSS button width 270px
  • CSS 中 calc() 的结果是什么

    我们现在已经开始使用calc 在CSS中 用于设置计算结果的宽度 例如 div div div div parent width 100px calcWidth width calc 100 3px height 100px backgro
  • 在打印 CSS 上在每个页面周围绘制边框?

    打印时我需要在每个页面周围绘制边框 我最初是使用带有分页符的 div 来完成此操作 例如 media print contentContainer position inline height 98 width 100 top 0px le
  • 使用溢出时无法隐藏滚动条:auto

    我有这个CSS div background color red position relative height 414px overflow auto width 902px margin 0px auto 我尝试过overflow y
  • 如何在 Bootstrap 列中使用文本溢出?

    假设我有一行具有固定高度 并且我在其列中插入了一些文本 如果太长 我希望将其剪掉 并在行尾添加三个点 如下所示 我在用着文本溢出 省略号 我的行中有此属性 但无法使其工作 JsFiddle http jsfiddle net Alexnot
  • 跨浏览器:禁用输入字段的不同行为(文本可以/不能复制)

    我有一个被禁用的输入 html 字段 在某些浏览器 Chrome Edge Internet Explorer 和 Opera 中可以选择并复制文本 但至少在 Firefox 中这是不可能的 您可以通过在不同浏览器中执行以下代码来测试

随机推荐

  • 如何使用 C# 检查邮件已读或未读属性 (Lotus Notes)

    我想使用 C 检查邮件已读和未读属性 即想检查邮件是否被阅读 使用Domino dll 未读标记表不会通过 后端类 这是您最有可能在 Domino dll 中使用的类 公开 这可以通过较低级别的 C API 获得 需要处理更多的工作 但如果
  • 带有 PL/pgSQL 的 CRC32 函数

    如何计算 32 位循环冗余校验 CRC 32 作为 PostgreSQL 中的函数 方法与MySQL http dev mysql com doc refman 5 7 en mathematical functions html func
  • decltype(..., void()) 和 void_t 之间的区别

    上次我发现了许多关于 SFINAE 的答案 建议使用void t帮手 但我似乎不明白它有什么特别之处 decltype void 考虑这个例子 template
  • 类继承,强制新类实现某些功能

    好吧 我正在搞一些事情 特别是接口 假设我有一个类 猫 其基础为 动物 动物有一个方法 如下所示 public virtual void Walk Do walking stuff 所以 Cat 会用以下内容覆盖它 public overr
  • 如何为同源的 iframe 提供单独的 sessionStorage

    标准 W3C 标准对 localStorages 的描述如下 不同的作者共享一个主机名 例如用户在geocities com 所有共享一个本地存储对象 没有通过路径名限制访问的功能 因此 敦促共享主机上的作者避免使用这些功能 因为其他作者读
  • 在 Flask 中上传图片

    我必须在项目目录的静态文件夹中上传一些图像 但我不知道如何对我的代码说 在下面的 code py 中 我可以上传图像并将其存储在静态文件夹同一级别的项目目录中 但我希望该图像可以存储在静态文件夹内 app route uploader me
  • 根据 python 中的列表测试用户输入

    我需要测试用户输入是否与列表的元素相同 现在我正在这样做 cars red yellow blue guess str input if guess cars 1 or guess cars 2 print success 但是我正在处理更
  • 包私有类中的公共方法

    将方法标记为有什么区别吗public在包私有类中 class SomePackagePrivateClass void foo package private method public void bar public method 之间的
  • 如何将参数传递到 Flex/actionscript 中的事件侦听器函数中?

    因为当使用 sql lite 时 如果你尝试同时执行一个函数 它会抛出一个错误 我只是想创建一个函数来检查它是否正在执行 如果它在 10 毫秒内重试 这个函数就可以正常工作如果我不必向函数传递任何参数 但我很困惑如何将变量传递回它将执行的函
  • Pandas 到 Excel 条件格式整列

    我想将 Pandas 数据框写入 Excel 并格式化 为此我正在使用xlsxwriter 我的问题有两个 首先 如何将条件格式应用于整列 在里面examples http xlsxwriter readthedocs io example
  • 如何在Python内部列表中运行嵌套循环,以便外部循环始终从列表的下一个元素开始,依此类推

    我有一个类似的列表 16777230 0 16777226 1 16777252 2 16777246 0 我想在 python 中的操作的循环 嵌套循环 内创建一个循环 以便内部循环始终从外部循环的下一个元素开始 例如 外循环将在每次迭代
  • '(' 或 '[' 预期

    尝试编译我的程序时出现以下错误 预期为 或 public AccountArrayList line one below is the hi lighted code ArrayList accounts new ArrayList acc
  • Python 模块初始化

    在模块代码中初始化模块中的对象是不好的做法吗 in Module py class Foo object def init self self x Foo Foo Foo 与用户代码相比 您可以 gt gt gt from Module i
  • 同时支持 Android 和 Android TV 的 Android Studio 项目

    我正在尝试创建一个同时支持 Android 手机 平板电脑 和 AndroidTV 的 AndroidStudio 项目 目标是在手机 平板电脑和 AndroidTV 上拥有类似的功能 同时不需要另一个来操作 并重用代码 当我创建一个新项目
  • 在 iPhone 上的 iOS Safari 中访问相机

    I have 单页网络应用程序 SPA 那个verifies用户作为注册过程的一部分 验证的一部分是捕获selfie用户的 为此 我实现了以下代码的一个版本来获取camera输入到一个video网页上的元素 然后我可以从中sample图像转
  • 如何在添加数据后调整android webview的大小

    在布局 线性 垂直 层次结构中 我有多个视图 其中之一是 WebView 它们都有相同的参数 android layout width fill parent android layout height wrap content 对于所有视
  • c++filt 不会分解 typeid 名称

    我正在 GCC 上运行代码C 编译器 输出 type info name include
  • SQLException:等待空闲的可用连接超时

    我正在用 java 构建一个应用程序Play Framework 2 0 4 该应用程序部署在heroku使用cleardb数据库 用户不断收到此偶尔的错误 PlayException Execution exception Persist
  • WPF 应用程序中的 IIS 平滑流处理

    我怎样才能玩IIS 平滑流式传输 http www iis net expand SmoothStreamingWPF 应用程序中的视频 我知道 Silverlight 对其有内置支持 但我找不到 WPF 的太多信息 会不会MediaEle
  • 为什么 grid-gap 会改变 CSS Grid 中列的宽度?

    使用 css grid 我在容器内设置了一个 1002px 宽的 24 列网格 在容器 div 内 有一个跨 21 列的子 div 我期望子 div 的宽度是 21 24 1002 876 75 当添加 grid gap 属性时 列的宽度减