在第一个和最后一个网格项前后添加 space
Add space before and after first and last grid items
我的问题与此相同,但给定的解决方案不起作用。
这是我正在使用的codepen。
我尝试了两种不同的方法,这两种方法都几乎正确但不完全正确:
1.将 ::before
和 ::after
伪 类 应用于第一个和最后一个网格项
不幸的是,当我分别将 margin-left
和 margin-right
属性添加到第一个和最后一个网格项时,它会将 space 添加到网格项,就好像它是 padding
space 而不是 margin
space,否则效果很好。
2。将 ::before
和 ::after
伪 类 应用于网格容器
它不允许我操纵 ::before
的 width
。由于某种原因,::before
的 width
属性 没有生效。值得注意的是,它的 width
的值似乎与任何给定的网格项的 width
值相同。
我注意到另一个与此方法完全无关的特性。如果我将 width
应用到 ::after
,grid-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
的宽度?
改变之前的宽度的一个想法是定义一个像下面这样的列模板,它将强制第一个元素的宽度,然后另一个将跟随 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>
这是 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
我的问题与此相同
这是我正在使用的codepen。
我尝试了两种不同的方法,这两种方法都几乎正确但不完全正确:
1.将 ::before
和 ::after
伪 类 应用于第一个和最后一个网格项
不幸的是,当我分别将 margin-left
和 margin-right
属性添加到第一个和最后一个网格项时,它会将 space 添加到网格项,就好像它是 padding
space 而不是 margin
space,否则效果很好。
2。将 ::before
和 ::after
伪 类 应用于网格容器
它不允许我操纵 ::before
的 width
。由于某种原因,::before
的 width
属性 没有生效。值得注意的是,它的 width
的值似乎与任何给定的网格项的 width
值相同。
我注意到另一个与此方法完全无关的特性。如果我将 width
应用到 ::after
,grid-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
的宽度?
改变之前的宽度的一个想法是定义一个像下面这样的列模板,它将强制第一个元素的宽度,然后另一个将跟随 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>
这是
: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