Search code examples
htmlcsscss-grid

Preventing double borders in CSS Grid


Given the current CSS grid example, how can I collapse the borders in order to avoid the double borders ?

This is such a simple thing to achieve using an Html table. How do I do it using 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>


Solution

  • You may do like this :

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

    Another idea is to rely on gradient to fill gaps like below:

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

    You can also adjust the initial solution to make it more flexible and it will work with any number of items inside a row.

    Run the below code on full page and resize the window:

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