【问题标题】:Preventing double borders in CSS Grid防止 CSS Grid 中的双边框
【发布时间】:2018-06-01 15:35:20
【问题描述】:

鉴于当前的 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;
}
<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>

【问题讨论】:

    标签: html css css-grid


    【解决方案1】:

    .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;
    }
    <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>
    margin:0 -1px -1px 0; 
    

    这应该可以解决问题。

    【讨论】:

    • 有点老套,但至少可以解决问题。不敢相信没有更简单的方法可以做到这一点。我不妨用 flexbox 构建我的网格 ..
    【解决方案2】:

    你可以这样做:

    .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;
    }
    <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>

    另一个想法是依靠渐变来填补空白,如下所示:

    .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 0 50px,#000 0 51px);
      border:1px solid;
    }
    
    .wrapper > div {
      padding: 15px;
      text-align: center;
    }
    
    body {
     background:pink;
    }
    <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>

    您还可以调整初始解决方案以使其更加灵活,并且可以处理一行中的任意数量的项目。

    在整页上运行以下代码并调整窗口大小:

    .wrapper {
      display: grid;
      max-width:800px;
      grid-template-columns: repeat(auto-fill,minmax(100px,1fr));
      border-top: 1px solid black;
      border-left: 1px solid black;
    }
    
    .wrapper > div {
      padding: 15px;
      text-align: center;
      border-bottom: 1px solid black;
      border-right: 1px solid black;
    }
    
    body {
     background:pink;
    }
    <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>9</div>
      <div>10</div>
      <div>11</div>
    </div>

    【讨论】:

    • 这个答案更适用于非实线和半透明边框。但是,这里的单元格项目是 49 像素,这可能有点麻烦。这很容易解决。
    • 如果容器顶部有边框会更有意义,这样如果网格中只有 6 个项目,则网格不会有随机线。
    • 这才是真正的答案!它甚至适用于包装内容
    【解决方案3】:

    不要在网格项周围使用实际边框,而是使用容器上的背景颜色(用于“边框”颜色)和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;
    }
    <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>

    【讨论】:

    • @pttsky 你可以改变整个div的不透明度。
    • 不行,有不同的边框宽度。
    • 如果单元格有不同的边框大小/颜色,这不起作用。
    【解决方案4】:

    我通过使用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 */
    }
    <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>

    【讨论】:

    • 你只需要添加一个.grid { grid-gap: 1px; }来修复元素的叠加。
    【解决方案5】:

    我成功使用的方法是简单地为网格项目添加一个盒子阴影,以及一个列和行间隙。然后,这允许列大小始终与grid-template-columns 中确定的完全相同。 然后只需更改列和行间距以及框阴影大小即可获得更厚的边框。

    .wrapper {
      display: grid;
      grid-template-columns: 50px 50px 50px 50px;
      grid-column-gap: 1px;
      grid-row-gap: 1px;
    }
    .wrapper > div {
      padding: 15px;
      text-align: center;
      box-shadow: 0 0 0 1px;
    }
    <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>

    【讨论】:

    • 如果您只想要上下边框而左右没有边框,效果很好。网格:row-gap: 1px 项目:box-shadow: 0 1px black, 0 -1px black;
    【解决方案6】:

    双赢的代码是设置

    • 网格项目:border-bottom & border-right
    • 网格包装器:顶部边框和左侧边框

    所以即使顶列不等于底列也会纠正

    .wrapper {
      display: inline-grid;
      grid-template-columns: 50px 50px 50px 50px;
      border-top: 1px solid black;
      border-left: 1px solid black;
    }
    
    .wrapper > div {
      padding: 15px;
      text-align: center;
      border-bottom: 1px solid black;
      border-right: 1px solid black;
    }
    
    <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>
    

    【讨论】:

      【解决方案7】:

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

      .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%;
      }
      <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>

      附:这里的主要技巧是box-sizing: content-box。如果您不使用另一个值全局覆盖它,则不需要它。但是很多人用border-box,这样的话,这个override就解决了gap的问题。

      【讨论】:

        【解决方案8】:

        如果您要修复每行的项目数,此解决方案将适合您,

        此示例为每行 3 个,但您可以编辑

        .grid-container {
          display: grid;
          grid-template-columns: 1fr 1fr 1fr;
          grid-template-rows: 1fr;
          gap: 0;
          grid-template-areas: '. . .';
        }
        
        .grid-item {
          order: 0;
          flex: 0 1 auto;
          text-align: center;
          padding: 1rem;
          font-size: 12px;
          background-color: #e8e8e8;
          border-color: #000;
          border-style: solid;
          border-width: 0;
        
          border-right-width: 1px;
          border-bottom-width: 1px;
        }
        
        /*first 3 items*/
          .grid-item:nth-child(-n + 3) {
            border-top-width: 1px;
          }
        
        /*last item on each row*/
          .grid-item:nth-child(3n + 0) {
            border-right-width: 1px;
            background-color: cadetblue;
          }
          
        /*first item on each row*/
        
        .grid-item:first-child,
          .grid-item:nth-child(3n + 1) {
            border-left-width: 1px;
            background-color: red;
          }
          
        /*middel item on each row (not used)*/
          .grid-item:nth-child(3n - 1) {
           // border-left-width: 1px;
           background-color: yellow;
          }
        
        /*last item (not used)*/
          .grid-item:last-child {
           // border-left-width: 0;
            background-color: green
            }
        <div class="grid-container">
        
        <div class="grid-item"> 1 </div>
        
        <div class="grid-item"> 2 </div>
        
        <div class="grid-item"> 3 </div>
        
        <div class="grid-item"> 1 </div>
        
        <div class="grid-item"> 2 </div>
        
        <div class="grid-item"> 3 </div>
        
        <div class="grid-item"> 1 </div>
        
        <div class="grid-item"> 2 </div>
        
        
        </div>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多