【问题标题】:CSS Grid Vertical Divider Between Two Items两个项目之间的 CSS 网格垂直分隔线
【发布时间】:2021-06-03 01:53:48
【问题描述】:

我正在使用 CSS Grid 创建一个网格布局。我想让整个网格项目在下一个项目之前有右分隔符,但除了同一行中的最后一个项目动态取决于网格条件。

这是我尝试过的,第 3 项的分隔符不应该存在,因为它是第 1 行的最后一项,以及第 5 项。

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  white-space: nowrap;
}

html, body {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 14px;
}

div {
  position: relative;
  display: block;
}

.grid {
  width: 25em;
  padding: .5em;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(6em, 1fr));
  grid-gap: .5em;
  border: 1px dashed palevioletred;
}

.grid > .item {
  padding: 2em;
  display: flex;
  align-items: center;
  justify-content: center;
}

.grid > .item::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  right: .025em;
  width: 1px;
  background-color: cornflowerblue;
}
<div class="grid">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
  <div class="item">Item 4</div>
  <div class="item">Item 5</div>
</div>

这里出了什么问题?

【问题讨论】:

  • 如果最后一行只有一个元素会怎样?
  • 它不会有分隔线,因为它旁边已经没有项目了

标签: html flexbox css-grid


【解决方案1】:

鉴于您的列数固定为 3

你可以用元素的边框来做到这一点,但是我使用了伪元素来代替它的宽度。

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  white-space: nowrap;
}

html,
body {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 14px;
}

div {
  position: relative;
  display: block;
}

.grid {
  width: 25em;
  padding: .5em;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(6em, 1fr));
  grid-gap: .5em;
  border: 1px dashed palevioletred;
}

.grid>.item {
  padding: 2em;
  display: flex;
  align-items: center;
  justify-content: center;
}


/* Added */
.grid>.item:nth-child(3n+2):before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: -.5em;
  right: -.5em;
  height: 100%;
  border-left: .5em solid red;
  border-right: .5em solid red;
}

.grid>.item:last-child:before {
  border-right: none;
}
<div class="grid">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
  <div class="item">Item 4</div>
  <div class="item">Item 5</div>
  <div class="item">Item 6</div>
</div>
<div class="grid">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
  <div class="item">Item 4</div>
  <div class="item">Item 5</div>
</div>
<div class="grid">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
  <div class="item">Item 4</div>
</div>

【讨论】:

  • 谢谢,它有效,它也适用于动态列号吗?
  • @JustinusHermawan 不,提供的代码仅适用于 3 列布局,如果动态列数可能无法实现,我将不得不进行更多测试
【解决方案2】:

试试这个方法

 .grid > .item:not(:nth-child(3n))::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  right: .025em;
  width: 1px;
  background-color: cornflowerblue;
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  white-space: nowrap;
}

html, body {
  font-family: Arial, Helvetica, sans-serif;
  font-size: 14px;
}

div {
  position: relative;
  display: block;
}

.grid {
  width: 25em;
  padding: .5em;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(6em, 1fr));
  grid-gap: .5em;
  border: 1px dashed palevioletred;
}

.grid > .item {
  padding: 2em;
  display: flex;
  align-items: center;
  justify-content: center;
}

.grid > .item:not(:nth-child(3n))::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  right: .025em;
  width: 1px;
  background-color: cornflowerblue;
}
<div class="grid">
  <div class="item">Item 1</div>
  <div class="item">Item 2</div>
  <div class="item">Item 3</div>
  <div class="item">Item 4</div>
  <div class="item">Item 5</div>
</div>

【讨论】:

  • 但是,我需要让整个项目自动换行
  • 对于第 5 项,它也不应该存在,因为它是该行中的最后一个