防止CSS网格中的双边框

klu*_*gjo 22 html css css3 css-grid

鉴于当前的CSS网格示例,我如何折叠边框以避免双边框?

使用Html表实现这是一件非常简单的事情.我该怎么做display: grid

.wrapper {
  display: grid;
  grid-template-columns: 50px 50px 50px 50px;
}

.wrapper > div {
  padding: 15px;
  text-align: center;
  border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
</div>
Run Code Online (Sandbox Code Playgroud)

Mic*_*l_B 31

不使用网格项周围的实际边框,而是使用容器上的背景颜色(用于"边框"颜色)和grid-gap属性(用于"边框"宽度).

.wrapper {
  display: inline-grid;
  grid-template-columns: 50px 50px 50px 50px;
  border: 1px solid black;
  grid-gap: 1px;
  background-color: black;
}

.wrapper > div {
  background-color: white;
  padding: 15px;
  text-align: center;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要透明的背景,这将不起作用 (3认同)
  • 如果单元格具有不同的边框大小/颜色,则这不起作用。 (3认同)

Tem*_*fif 15

你可能喜欢这样:

.wrapper {
  display: inline-grid;
  grid-template-columns: 50px 50px 50px 50px;
  border-bottom: 1px solid black;
  border-left: 1px solid black;
}

.wrapper > div {
  padding: 15px;
  text-align: center;
  border-top: 1px solid black;
  border-right: 1px solid black;
}

body {
 background:pink;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
</div>
Run Code Online (Sandbox Code Playgroud)

另一个想法是依靠渐变来填补下面的空白:

.wrapper {
  display: inline-grid;
  grid-template-columns: 50px 50px 50px 50px;
  grid-gap:1px;
  background:
    linear-gradient(#000,#000) center/100% 1px no-repeat,
    repeating-linear-gradient(to right,
        transparent ,transparent 50px,
        #000 50px,#000 51px);
  border:1px solid;
}

.wrapper > div {
  padding: 15px;
  text-align: center;
}

body {
 background:pink;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 如果容器具有顶部边框,则更有意义,这样如果网格中只有 6 个项目,网格将不会有随机线。 (2认同)

Nik*_*lan 11

有一种简单的方法可以做到这一点:

.grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-gap: 1px;
}

.grid__item {
  border: 1px solid gray;
  box-sizing: content-box;
  width: 100%;
  height: 100%;
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
  <div class="grid__item">1</div>
  <div class="grid__item">2</div>
  <div class="grid__item">3</div>
  <div class="grid__item">4</div>
  <div class="grid__item">5</div>
  <div class="grid__item">6</div>
  <div class="grid__item">7</div>
  <div class="grid__item">8</div>
  <div class="grid__item">9</div>
  <div class="grid__item">10</div>
  <div class="grid__item">11</div>
  <div class="grid__item">12</div>
</div>
Run Code Online (Sandbox Code Playgroud)

Ps 这里的主要技巧是在box-sizing: content-box. 如果您不使用另一个值全局覆盖它,则不需要它。但是很多人使用border-box,在那种情况下,这个覆盖解决了gap的问题。


小智 10

.wrapper {
  display: grid;
  grid-template-columns: 50px 50px 50px 50px;
}

.wrapper > div {
  padding: 15px;
  text-align: center;
  border: 1px solid black;
  margin:0 -1px -1px 0;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
  <div>7</div>
  <div>8</div>
</div>
Run Code Online (Sandbox Code Playgroud)

margin:0 -1px -1px 0; 
Run Code Online (Sandbox Code Playgroud)

这应该可以解决问题.

  • 有点老套,但至少它起到了作用。不敢相信没有更简单的方法来做到这一点。我不妨用 flexbox 构建我的网格.. (2认同)

小智 6

我通过使用该outline属性找到了解决方案。

.grid {
	width: 100%;
	height: 700px;
	display: grid;
	grid-template-columns: repeat(4, 25fr);
	grid-template-rows: repeat(4, 25fr);
	margin-bottom: 30px;
	grid-gap: 1px;
}

.grid-item {
	background-color: silver;
	outline: 1px solid gray; /* The outline creates the border */
	text-align: center;
	position: relative;
	z-index: 1; /* original z-index */
}

/* If you want to change the color on the hover state */
.grid-item:hover {
	outline: 1px solid red;
	z-index: 2; /* You must apply a z-index bigger than the original z-index or else some parts of the outline will be behind other grid elements */
}
Run Code Online (Sandbox Code Playgroud)
<div class="grid">
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
  <div class="grid-item"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 你只需要添加一个 `.grid { grid-gap: 1px; }` 来修复元素的叠加。 (2认同)