代码之家  ›  专栏  ›  技术社区  ›  techno geek

css网格布局的水平滚动

  •  5
  • techno geek  · 技术社区  · 6 年前

    我需要有一个仪表板不同的布局。我只需要水平滚动的布局容器,如果项目超过,以适应在一个可见的视口。我遇到了一个具有以下要求的布局。

    This is the layout I required

    我用CSS flexbox创建了布局样式,但无法获得水平滚动,只能获得垂直滚动。

    html,
    body {
      height: 100%;
      margin: 0px;
    }
    * {
      box-sizing: border-box;
    }
    .flexbox {
      height: 100%;
      width: 100%;
      display: flex;
      flex-wrap: wrap;
      overflow-x: auto;
      background-color: lightgreen;
    }
    .item {
      min-width: 50%;
      min-height: 50%;
      flex: 1 0 0;
      border: 1px solid;
    }
    .item:nth-child(odd) {
      background-color: lightblue;
    }
    
    .item:nth-child(even) {
      background-color: lightslategray;
    }
    .item1 {
      min-width: 100%;
    }
    <div class="flexbox">
      <div class="item item1">1</div>
      <div class="item item2">2</div>
      <div class="item item3">3</div>
      <div class="item item1">4</div>
      <div class="item item2">5</div>
      <div class="item item3">6</div>
    </div>

    https://codepen.io/TechnoGeek/pen/GdZodo

    所以,我认为CSS网格可以帮助实现这一点。所以我尝试了一些东西,但不知道如何得到它。

    html,
    body {
      height: 100%;
      margin: 0px;
    }
    
    .grid {
      display: grid;
      height: 100%;
      background-color: lightgreen;
      grid-template-columns: repeat(2, 1fr);
      grid-template-row: repeat(2, 1fr);
      grid-gap: 5px;
      /*   grid-auto-flow: column; */
    }
    
    .item {
      border: 1px solid;
    }
    
    .item:nth-child(odd) {
      background-color: lightblue;
    }
    
    .item:nth-child(even) {
      background-color: lightslategray;
    }
    
    .item1 {
      grid-column: 1/3;
    }
    <div class="grid">
      <div class="item item1">1</div>
      <div class="item item2">2</div>
      <div class="item item3">3</div>
      <div class="item item1">4</div>
      <div class="item item2">5</div>
      <div class="item item3">6</div>
    </div>

    https://codepen.io/TechnoGeek/pen/BxKoaG

    在栅格布局中,项目正在缩小以适应布局。

    容器中的项目数是动态的。无论项目数量如何,布局必须保持每个可见组的结构。

    有人能帮助实现这一点吗?

    提前谢谢。

    4 回复  |  直到 6 年前
        1
  •  13
  •   Community CDub    4 年前

    我使用CSS网格布局找到了一个令人满意的答案。

    在栅格布局中,项目正在缩小以适应布局。

    我已使用 fr 在我的问题中,这就是为什么这些物品在缩水。现在我用了 % 因为我希望单元格项目从可见区域流出,以便在需要时生成滚动。

    span 定义网格单元区域中的关键字对网格单元的自动放置有很大帮助。

    来自MDN: span && [ <integer> || <custom-ident> ]

    为网格项放置贡献一个网格跨度,以便网格项网格区域的相应边与相对边相距n行。

    html,
    body {
      height: 100%;
      margin: 0px;
    }
    
    .grid {
      display: grid;
      height: 100%;
      background-color: lightgreen;
      grid-template-columns: repeat(2, 50%);
      grid-template-rows: repeat(2, 50%);
      /*grid-gap: 5px;*/
      grid-auto-columns: 50%;
      grid-auto-flow: column;
    }
    
    .item {
      border: 1px solid;
      grid-area: span 1 / span 1;
    }
    
    .item:nth-child(odd) {
      background-color: lightblue;
    }
    
    .item:nth-child(even) {
      background-color: lightslategray;
    }
    
    .item1 {
      grid-area: span 1/ span 2;
    }
    <div class="grid">
      <div class="item item1">1</div>
      <div class="item item2">2</div>
      <div class="item item3">3</div>
      <div class="item item1">4</div>
      <div class="item item2">5</div>
      <div class="item item3">6</div>
    </div>
        2
  •  0
  •   Michael Benjamin William Falcon    6 年前

    对于水平滚动,最简单的解决方案是为每个视图创建一个单独的容器。然后制作整个容器( body )行方向的柔性容器。

    body {
      display: flex;
      margin: 0;
    }
    
    .flexbox {
      flex: 0 0 100vw;
      height: 100vh;
      display: flex;
      flex-wrap: wrap;
      background-color: lightgreen;
    }
    
    .item {
      flex: 1 0 50%;
      min-height: 50%;
      border: 1px solid;
    }
    
    .item1 {
      flex-basis: 100%;
    }
    
    .item:nth-child(odd) {
      background-color: lightblue;
    }
    
    .item:nth-child(even) {
      background-color: lightslategray;
    }
    
    * {
      box-sizing: border-box;
    }
    <div class="flexbox">
      <div class="item item1">1</div>
      <div class="item item2">2</div>
      <div class="item item3">3</div>
    </div>
    <div class="flexbox">
      <div class="item item1">4</div>
      <div class="item item2">5</div>
      <div class="item item3">6</div>
    </div>
        3
  •  0
  •   Tunji Oyeniran    4 年前

    主要技巧是添加 grid-auto-flow: column; 到容器的显示网格css样式。

    例如

    .container-grid {
      display: grid;
      grid-gap: 1rem;
      grid-template-columns: repeat(auto-fill, minmax(20rem, 20rem));
      grid-auto-flow: column;
      overflow-x: auto;
    }
    
        4
  •  -2
  •   aswin darma    6 年前

    尝试将具有此样式的类添加到要在其上进行水平滚动的元素中

    display: block;
    width: 99%;
    overflow-x: auto;