代码之家  ›  专栏  ›  技术社区  ›  klugjo

防止CSS网格中出现双边框

  •  74
  • klugjo  · 技术社区  · 7 年前

    给定当前的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>
    9 回复  |  直到 6 年前
        1
  •  71
  •   Michael Benjamin    6 年前

    不要在网格项周围使用实际的边框,而是使用容器上的背景色(表示“边框”颜色)和 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>
        2
  •  58
  •   Temani Afif    4 年前

    您可以这样做:

    .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=“包装器”>
    <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>
        3
  •  23
  •   EoghanM    5 年前

    我通过使用 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>
        4
  •  22
  •   Krzysztof Mazur    7 年前

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

    这应该可以奏效。

        5
  •  14
  •   Niklan    5 年前

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

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

    P、 这里的主要诀窍是 box-sizing: content-box . 如果不使用其他值全局覆盖它,则不需要它。但许多人使用 border-box ,在这种情况下,此替代解决了间隙问题。

        6
  •  3
  •   dan richardson    6 年前

    我成功地使用了一个简单的方法,就是在网格项中添加一个方框阴影,以及一个列和行间距。这样,列的大小就可以始终与中确定的大小完全相同 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>
        7
  •  0
  •   urDMG    2 年前

    对于那些需要处理奇数个元素和特定数量帧的人,可以使用以下方法

    <style>
      .wrapper {
        width: 100%;
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr));
        border: 1px solid;
        grid-gap: 1px;
      }
    
      .element {
        display: flex;
        flex-direction: column;
        background-color: azure;
        min-height: 10rem;
        border: 1px solid;
        margin: -1px;
      }
    </style>
    
    <body>
      <div class="wrapper">
        <div class="element"></div>
        <div class="element"></div>
        <div class="element"></div>
        <div class="element"></div>
        <div class="element"></div>
        <div class="element"></div>
      </div>
    </body>
    

    https://codepen.io/sergeytkhojevskiy/pen/XWZOJOL

        8
  •  -1
  •   okater    6 年前

    双赢的准则是

    • 网格项目:边框底部(&M);右边框
    • 网格包装:边框顶部(&P);左侧边框

    因此,即使顶柱不等于底柱,它也会正确

    .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>
    
        9
  •  -1
  •   Mansour Alnasser    3 年前

    如果您确定每行的项目数,此解决方案将适合您,

    此示例适用于每行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>