css - 在第一个和最后一个网格元素之前和之后添加空格

标签 css css-grid grid-layout

我的问题与此相同question,但给定的解决方案不起作用。

这是一个codepen我正在处理的事情。

我尝试了两种不同的方法,两种方法几乎都是正确的,但又不完全正确:

1。将 ::before::after psuedo 类应用于第一个和最后一个网格项

不幸的是,当我分别向第一个和最后一个网格项添加 margin-leftmargin-right 属性时,它会向网格项添加空间,就好像它是padding 空间而不是 margin 空间,否则效果很好。

2。将 ::before::after psuedo 类应用到网格容器

它不允许我操纵::before宽度。由于某种原因,::beforewidth 属性不生效。值得注意的是,它的 width 值似乎与任何给定网格项的 width 值相同。

我还注意到了这种方法的另一个特点,这最终是无关紧要的。如果我将 width 应用于 ::aftergrid-gap 也会被应用,就像插入一个不可见的网格项一样。

:root {
  --gap: 25px;
}

body {
  width: 100vw;
  overflow-x: hidden;
  margin: 0
}

#c {
  width: 100%;
  height: 50px;
  overflow-x: auto;
  display: grid;
  grid-gap: 20px;
  grid-auto-flow: column;
  grid-auto-columns: calc(calc(100% - calc(var(--gap) * 2)) / 1.5);
  border: solid red 1px;
}

/* second approach */
#c::before {
  content: '';
  width: var(--gap);
}

#c::after {
  content: '';
  width: 1px; /* works out to about 25px or var(--gap) */
}

.i {
  width: 100%;
  height: 25px;
}

/* first approach */
/*
.i:first-child::before {
  content: '';
  margin-left: var(--gap);
}

.i:last-child::after {
  content: '';
  margin-right: var(--gap);
}
*/

.i:nth-child(odd) {
  background: skyblue;
}

.i:nth-child(even) {
  background: pink;
}
<div id='c'>
  <div class='i'>1</div>
  <div class='i'>2</div>
  <div class='i'>3</div>
  <div class='i'>4</div>
  <div class='i'>5</div>
  <div class='i'>6</div>
  <div class='i'>7</div>
  <div class='i'>8</div>
  <div class='i'>9</div>
  <div class='i'>10</div>
  <div class='i'>11</div>
  <div class='i'>12</div>
  <div class='i'>13</div>
  <div class='i'>14</div>
  <div class='i'>15</div>
  <div class='i'>16</div>
  <div class='i'>17</div>
  <div class='i'>18</div>
  <div class='i'>19</div>
  <div class='i'>20</div>
  <div class='i'>21</div>
  <div class='i'>22</div>
  <div class='i'>23</div>
  <div class='i'>24</div>
</div>

有人知道为什么会发生这种事吗?

如何更改 ::before 的宽度?

最佳答案

更改 before 宽度的一个想法是定义一个如下所示的列模板,该模板将强制第一个元素的宽度,然后另一个元素才会遵循grid-auto-columns。基本上,我们定义一个包含 1 列的显式网格,然后浏览器将根据需要添加更多列来创建隐式网格:

:root {
  --gap: 25px;
}

body {
  width: 100vw;
  overflow-x: hidden;
  margin: 0
}

#c {
  width: 100%;
  height: 50px;
  overflow-x: auto;
  display: grid;
  grid-gap: 20px;
  grid-template-columns:1px;
  grid-auto-flow: column;
  grid-auto-columns: calc(calc(100% - calc(var(--gap) * 2)) / 1.5);
  border: solid red 1px;
}

/* second approach */
#c::before {
  content: '';
}

#c::after {
  content: '';
  width: 1px; /* works out to about 25px or var(--gap) */
}

.i {
  /*width: 100%; not needed*/
  height: 25px;
  /*display: inline-block; not needed*/
}

.i:nth-child(odd) {
  background: skyblue;
}

.i:nth-child(even) {
  background: pink;
}
<div id='c'>
  <div class='i'>1</div>
  <div class='i'>2</div>
  <div class='i'>3</div>
  <div class='i'>4</div>
  <div class='i'>5</div>
  <div class='i'>6</div>
  <div class='i'>7</div>
  <div class='i'>8</div>
  <div class='i'>9</div>
  <div class='i'>10</div>
  <div class='i'>11</div>
  <div class='i'>12</div>
  <div class='i'>13</div>
  <div class='i'>14</div>
  <div class='i'>15</div>
  <div class='i'>16</div>
  <div class='i'>17</div>
  <div class='i'>18</div>
  <div class='i'>19</div>
  <div class='i'>20</div>
  <div class='i'>21</div>
  <div class='i'>22</div>
  <div class='i'>23</div>
  <div class='i'>24</div>
</div>

关于css - 在第一个和最后一个网格元素之前和之后添加空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211520/

相关文章:

html - 为什么将 child 定位为其相关 parent 的绝对地位将其推到父 div 之外?

css - 使用 CSS Grid 时如何让内容居中并让背景覆盖整个栏目?

jquery - 如何创 build 备固定的容器?

css - 使用 css 对进入中心图形然后环绕中心图形进行动画处理

html - 删除一个 div 上的主体边距

CSS Flexbox - CSS 网格中的截断文本(仅限 Firefox)

CSS 网格不符合

java - 框架未显示正确使用 Swing

html - Bootstrap 网格容器不断调整

html - 如何使用 HTML、CSS 和 Bootstrap 将两个盒子集中起来