【问题标题】:Responsive horizontal scrolling CSS Grid with fixed number of grid-items per breakpoint响应式水平滚动 CSS Grid,每个断点具有固定数量的网格项
【发布时间】:2019-08-06 22:06:05
【问题描述】:

问题:CODEPEN

如何使用 CSS Grid 设计一个网格,以制作一个轮播,其中的网格项响应固定数量的网格列,每个断点会有所不同?

问题: 网格项在响应断点上没有按预期缩放。网格项的峰值不符合规范。

请查看video,了解我希望网格项如何按断点缩放:https://imgur.com/070Zwve

背景

我问了一个关于如何使用 css 网格使网格项水平流动的问题:

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

最后我得到了适用于桌面但不适用于任何其他断点的代码:

CSS:

.section {
  width: 100%;
  display: block;
  background: red;
  box-sizing: border-box;
  padding: 40px 24px;

  @media screen and (min-width: 600px) and (max-width: 1139px) {
    background: orange;
    padding: 56px 48px;
  }

  @media screen and (min-width: 1140px) {
    padding: 64px 48px;
    background: green;
  }
}

.container {
  margin: 0 auto;
  background: rgba(244,244,244, .25);
  max-width: 599px;


  @media screen and (min-width: 600px) and (max-width: 1139px) {
    max-width: 1039px;
    background: rgba(244,244,244, .25);
  }

  @media screen and (min-width: 1140px) {
    max-width: 1032px;
    background: rgba(244,244,244, .25);
  }
}

.samba-grid {
  display: grid;
  background: inherit;
  width: 100%;
  overflow-x: auto;
  overflow-y: hidden;

  grid-auto-columns: minmax(55px, 1fr);
  grid-gap: 24px;

  @media screen and (min-width: 600px) and (max-width: 1139px)  {
    grid-auto-columns: minmax(44px, 1fr);
    grid-gap: 48px;
  }

  @media screen and (min-width: 1140px) {
    grid-auto-columns: minmax(42px, 1fr);
    grid-gap: 48px;
  }
}


.element {
  display: grid;
  background: rgba(0,0,0,.3);
  grid-column: span 3;
  grid-row-start: 2; // REMOVE THIS

  @media screen and (min-width: 600px) and (max-width: 1139px) {
    grid-column: span 3;
  }

  @media screen and (min-width: 1140px) {
    grid-column: span 4;
  }
}
.element img {
  width: 100%;
}

HTML:

<section class="section">
  <div class="container">
    <div class="samba-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 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>

^ 请注意,此视频显示成行的网格项堆栈不会水平滚动。

【问题讨论】:

    标签: html css css-grid


    【解决方案1】:

    您可以将grid-auto-columns 定义为百分比来控制它。公式应为(100% - (N-1)*Gap)/N,其中N 是您要显示的元素数:

    这是一个带有 3 个断点的简化示例:

    .grid {
      display:grid;
      grid-auto-flow: column;
      grid-auto-columns:calc((100% - 2*10px)/3); /*3 items visible*/
      grid-gap:10px;
      margin:10px;
      max-width:800px;
      overflow:auto;
    }
    img {
      max-width:100%;
    }
    
    @media all and (max-width:800px) {
    .grid {
      grid-auto-columns:calc((100% - 5px)/2); /*two items visible*/
      grid-gap:5px;
     }
    }
    
    @media all and (max-width:400px) {
    .grid {
      grid-auto-columns:100%; /*one item visible*/
      grid-gap:5px;
     }
    }
    <div class="grid">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
    </div>

    可以使用 CSS 变量优化的代码:

    .grid {
      --n:3; /*3 visible items */
      --g:10px;
      
      display:grid;
      grid-auto-flow: column;
      grid-auto-columns:calc((100% - (var(--n) - 1)*var(--g))/var(--n)); 
      grid-gap:var(--g);
      margin:10px;
      max-width:800px;
      overflow:auto;
    }
    img {
      max-width:100%;
    }
    
    @media all and (max-width:800px) {
    .grid {
      --n:2; /*2 visible items */
      --g:5px;
     }
    }
    
    @media all and (max-width:400px) {
    .grid {
      --n:1; /*1 visible item */
     }
    }
    <div class="grid">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
     <img src="https://picsum.photos/500/500?image=0">
    </div>

    【讨论】:

    • 一个了不起的解决方案。如果您使用 scroll-snap 尤其需要,因为您希望容器滚动 N 的项目。
    • 嗨,很好的解决方案。我将如何绕过this problem? 谢谢
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2018-08-09
    相关资源
    最近更新 更多