css网格布局的水平滚动

时间:2018-04-24 09:59:51

标签: html css css3 flexbox css-grid

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

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>
&#13;
&#13;
&#13;

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

所以,我认为,CSS网格可以帮助解决这个问题。所以我尝试了一些但不明白如何获得它。

&#13;
&#13;
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;
}
&#13;
<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>
&#13;
&#13;
&#13;

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

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

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

有人可以帮忙解决这个问题吗?

提前致谢。

4 个答案:

答案 0 :(得分:4)

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

  

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

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

定义网格单元区域中的

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

  

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

     

为网格项目的位置提供网格跨度,使网格项目的网格区域的相应边缘距离相对边缘为n行。

&#13;
&#13;
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;
}
&#13;
<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>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

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

&#13;
&#13;
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;
}
&#13;
<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>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

主要技巧是将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;
}

答案 3 :(得分:-1)

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

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