Search code examples
htmlcssmarginpaddingcss-grid

CSS Grid with fixed size scrolling: How to solve issue where bottom margin/padding isn't shown?


EDIT:

So I saw the duplicate link that was pointed to, and in my opinion, this question is to solve issues where you have given a fixed size (fixed width or fixed height).

The original question's solution is more about fixing the container using hacky methods. I decided to make a different approach of fixing it, while also fixing my own issue laid out in this question.


In CSS, when working with display: grid and fixed height, with overflow: auto turned on, you may get this kind of layout, shown below:

.scroll {
  overflow:  auto;
  background-color: #bbddee;
}

.container {
  padding: 10px;
  display: grid;
  grid-template-columns: 1fr;
  grid-row-gap: 10px;
  height: 420px;
}

.itemContainer {
  border: 1px solid #efefef;
  padding: 10px 20px;
  background-color: #fff;
}

.itemTitle {
  text-align:center;
  margin: 0 auto;
}

.itemLink {
  text-align: center; 
  margin: 0 auto;
}
<div id="retailerContent" class="tab-pane fade in active show">
  <div class="scroll">
    <div id="retailerOffersContainer" class="container">

      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      <div class="itemContainer">
        <div class="itemTitle">15% Off Room Essentials Cubes &amp; Bins</div>
        <div class="itemLink"><a>Get Offer&nbsp;&gt;</a></div>
      </div>
      
    </div>
  </div>
</div>

When this happens, there is an issue where there are no paddings/margins down at the very bottom of the scroll list. How should the HTML and CSS be modified, so the bottom padding/margin would show up inside a scrollable CSS grid layout?


Solution

  • This is my fix for when I was using CSS Grids:

    /* Fix scrollbar removing padding-bottom */
    @supports (-moz-appearance:none) {
      .container::after {
        content: "";
        height: 1px;
        margin: calc(var(--padding) - var(--gap));
      }
    }