【问题标题】:horizontal scroll for css grid-layoutCSS网格布局的水平滚动
【发布时间】:2018-10-04 12:59:32
【问题描述】:

我需要为仪表板设置不同的布局。如果项目超出以适合可见视口,我只需要布局容器的水平滚动。我遇到了具有以下要求的布局。

我使用 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

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

容器内的项目数量是动态的。无论项目计数如何,布局都必须维护每个可见组的结构。

有人可以帮助如何实现这一目标吗?

提前致谢。

【问题讨论】:

  • 试试overflow-x:scroll...可能有帮助
  • 它不工作,你能检查一下代码笔吗?
  • 对于水平滚动,您需要在父div中添加任何特定的宽度。
  • @KhushbuVaghela,我在问题中插入了代码 sn-ps。你说的我已经加了。这没有用。我猜你正在使用display: block 寻址容器,但我使用的是display: flex or grid; 如果我不明白你所说的,你可以发送代码 sn-p 吗?

标签: html css flexbox css-grid


【解决方案1】:

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

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

我在我的问题中使用fr 定义了网格线,这就是项目缩小的原因。现在我使用了%,因为我希望单元格项目流出可见区域以在需要时产生滚动。

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

来自 MDN:span &amp;&amp; [ &lt;integer&gt; || &lt;custom-ident&gt; ]

为网格项的放置提供一个网格跨度,使得网格项的网格区域的对应边缘距相对边缘的 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】:

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

    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>

    【讨论】:

    • 嗨迈克尔,我之前的方法和现在提到的一样。项目计数是动态的,我使用 Angular ng-repeat 来呈现所有组件的 HTML。因此,由于某些必须与布局一起使用的其他功能,这种方法会产生一些性能问题。你能帮我用 CSS Grid 方法吗?
    • 我使用 CSS Grid 的方法类似于 flex。我对这个问题并不完全清楚。也许您可以提供更多详细信息。
    • 你在我的问题中看到了图片,我已经更新了它,对!首先 items[1,2,3] 将显示在视口中,其中 item[1] 将占据 100% 的宽度,而其他项目将仅占据 50% 的宽度。当我滚动时,items[4,5,6] 将从 rtl 时尚出现(要实现这一点,我需要水平滚动)。我得到了一系列项目,例如 items = [1,2,3,4,5,6]。我使用 angular 1。所以,我渲染 Html 内容,如 &lt;div class="flexbox"&gt; &lt;div class="item" ng-class="item.class" ng-repeat="item in items"&gt;{{item.text}}&lt;/div&gt;
      ` 。所以我不能为每个视图设置单独的容器。
    【解决方案3】:

    主要技巧是将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】:

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

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

      【讨论】:

      • 我要求display: flex;display: grid;,我知道你说的会有用。但是,我想用容器内的项目来维护布局。你检查过代码笔吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-10
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多