【问题标题】:Add space before and after first and last grid items在第一个和最后一个网格项之前和之后添加空格
【发布时间】:2019-08-08 05:46:00
【问题描述】:

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

这是我正在使用的codepen

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

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

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

2.将::before::after 伪类应用于网格容器

它不允许我操纵::beforewidth。由于某种原因,::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的宽度?

【问题讨论】:

  • 前一个元素只是一个网格元素,因此它将采用为其他元素定义的相同宽度(请注意,元素位于网格轨道内,因此其宽度在另一个隐藏的包装器内定义)
  • @TemaniAfif 但为什么它允许我操纵::afterwidth,这似乎也是一个网格元素?以及如何更改::before 的宽度?
  • 不确定这可能与溢出有关
  • @TemaniAfif 我怀疑它与auto-flowauto-columns 有关系,而不是溢出?
  • 是的,肯定会溢出。轨道具有正确的宽度,但溢出不考虑轨道的宽度,而只考虑元素宽度。基本上after 的行为与before 相同,但它的轨道溢出并且不在滚动区域内。

标签: css css-grid grid-layout


【解决方案1】:

改变之前的宽度的一个想法是定义一个像下面这样的列模板,它将强制第一个元素的宽度,然后另一个将遵循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>

【讨论】:

  • 精彩
  • @Anthony 是的,任何值都可以;)您也可以尝试auto1fr 他们会这样做
【解决方案2】:

这是another one of those instances flexbox 可以提供比网格更简单、更容易和更有效的解决方案。

:root {
  --gap: 25px;
}

#c {
  display: flex;
  overflow-x: auto;
  height: 50px;
  border: solid red 1px;
}

.i {
  height: 25px;
  flex: 0 0 calc(calc(100% - calc(var(--gap) * 2)) / 1.5); /* fg, fs, fb */
}

#c::before {
  content: '';
  flex: 0 0 var(--gap);
}

.i {
  margin-right: 20px;
}

#c::after {
  content: '';
  flex: 0 0 calc(var(--gap) - 20px); /* gap less margin */
}

.i:nth-child(odd)  { background: skyblue; }
.i:nth-child(even) { background: pink; }
body               { margin: 0; }
*                  { box-sizing: border-box; }
<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>

您可能还需要考虑使用透明边框作为开始和结束端的间距。 Last margin / padding collapsing in flexbox / grid layout

【讨论】:

  • 感谢您的建议,但由于grid-gap,网格在这种情况下要优越得多。现在一切正常。 flex 的问题是你总是必须添加边距或填充并不断调整它们
  • 对。在这个情况下。但也许不是在其他人身上。这就是我发布答案的原因。此外,gap property 预计将在弹性容器中提供。
  • 这就是我的想法,但我发现在大多数情况下,对我个人而言,grid 远远优于 flex。 预期在弹性容器中可用?什么时候?
  • 我猜今年年底之前,但我没有内幕消息。
  • 而网格是一项卓越的技术。但是flex still has advantages.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 2022-07-07
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多