Grid CSS container that scrolls horizontally when children use grid-column?

前端 未结 1 1845
梦谈多话
梦谈多话 2021-01-20 02:56

CODEPEN: https://codepen.io/matthewharwood/pen/ywKNVg

I\'m trying to achieve this layout in GridCSS:

Problems:

I\'m havin

相关标签:
1条回答
  • 2021-01-20 03:16

    You simply need to get rid of grid-template-columns: repeat(12, 1fr);1. No need to define column template since your number of element is unknown, let the browser handle this automatically by defining the implicit grid.

    You may need to define grid-auto-columns to set the width of each column.

    section {
      width: 100%;
      display: block;
      box-sizing: border-box;
      padding: 64px 48px;
      background: green;
    }
    
    .container {
      margin: 0 auto;
      max-width: 1032px;
      background: rgba(244, 244, 244, .25);
    }
    
    .grid {
      display: grid;
      grid-auto-flow: column;
      overflow: auto;
      grid-gap: 48px;
      grid-auto-columns: minmax(40px, 1fr);
    }
    
    .element {
      padding: 30px 0;
      text-align: center;
      background: papayawhip;
      grid-column: span 4;
    }
    
    img {
      max-width: 100%;
    }
    <section>
      <div class="container">
        <div class="grid">
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
        </div>
      </div>
    </section>
    
    <section>
      <div class="container">
        <div class="grid">
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
          <div class="element">
            <img src="https://placebear.com/400/500" alt="">
            <div class="copy">
              Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
            </div>
          </div>
    
        </div>
    </section>

    Remove grid-auto-columns: minmax(40px,1fr); from above and you will see this for the top grid:

    The red lignes are your columns with 0 width and as you can see each item is simply equal to 3 gaps. By setting the minmax() we will use 1fr when there isn't overflow and only few elements (enough space for 1fr). When will have a lot of elements and the 1fr will get smaller you will fix the width to 40px.

    Basically each element will have a min-width equal to 4*40px + 3*48px in this case. and if you remove the 1fr and use grid-auto-columns: 40px; then the min-width will simply be the width.


    1 The issue when defining the template columns is that you will told the browser that you have 12 columns with 1fr and later you will be using more if you have more than 3 items thus the implicit grid will contain more than 12 columns and the browser may calculate their width differently from what you set.

    Here is as simplified example to illustrate:

    .grid {
      display:grid;
      grid-template-columns:repeat(4,1fr);
      grid-auto-flow: column;
    }
    img {
      grid-column:span 2;
      border:2px solid green;
      max-width:100%;
    }
    <div class="grid">
     <img src="https://picsum.photos/200/200?image=0">
     <img src="https://picsum.photos/200/200?image=0">
     <img src="https://picsum.photos/200/200?image=0">
     <img src="https://picsum.photos/200/200?image=0">
    </div>

    Notice how the width of the first 2 images is different from the last 2. The first ones are inside the grid you defined and the other inside the one created by the browsers.

    By only setting grid-auto-columns you are sure that all will have the same width:

    .grid {
      display:grid;
      grid-auto-flow: column;
      grid-auto-columns:minmax(40px,1fr);
    }
    img {
      grid-column:span 2;
      border:2px solid green;
      max-width:100%;
    }
    <div class="grid">
     <img src="https://picsum.photos/200/200?image=0">
     <img src="https://picsum.photos/200/200?image=0">
     <img src="https://picsum.photos/200/200?image=0">
     <img src="https://picsum.photos/200/200?image=0">
    </div>

    0 讨论(0)
提交回复
热议问题