使两列分别可滚动和视口剩余长度的高度

Posted

技术标签:

【中文标题】使两列分别可滚动和视口剩余长度的高度【英文标题】:Make two columns separately scrollable and the height of the remaining length of the viewport 【发布时间】:2019-05-20 14:31:29 【问题描述】:

我有一个 JS Fiddle 完全符合我的要求:http://jsfiddle.net/j7ay4qd8/5/

它由两列组成,可单独滚动,左列的不同部分可以通过 javascript 轻松滚动到,而不会影响右列或页面的其余部分。

然而,我为这个示例工作的唯一方法是使用两个导航的 px 对高度进行硬编码。

height:calc(100vh - 90px);

当然,这可能不适用于不同的浏览器、设备和分辨率。

如果添加任何元素或这些导航的大小发生变化,它将中断。

我真正想要的是让#form 自动调整大小以填充视口的剩余部分。

在我当前的示例中,如果我添加另一个元素(例如警报),#content 和 #sidebar 将比视口长,并且在 #content div 滚动后整个页面滚动时我会出现跳跃滚动。

警报和跳跃滚动示例:http://jsfiddle.net/c4k9u0mr/

我找到了这个 jsfiddle,它似乎可以解释我想要使用 flexbox 做什么:http://jsfiddle.net/7yLFL/

但是,我尝试使用 flexbox 进行此操作也没有奏效。我可以让#content 和#guidelines 分别滚动的唯一方法是,如果我给它们一个固定的高度,我又回到了如何使这些 div 成为容器 div 的 100% 的方方面面。

这是我使用 flexbox 失败的尝试(在本例中,它的高度固定为 100 像素):http://jsfiddle.net/jh6d5ztq/

是否可以在不使用 px 定义固定高度的情况下让第一个和第二个 JS Fiddle 工作?

【问题讨论】:

【参考方案1】:

    占据视口剩余高度的所有父元素都需要有一个100% 高度。在引导程序中,使用h-100

    这些元素最近的父元素必须是flex,并且必须有flex-direction: column。在引导程序中,使用d-flexflex-column。一些classes 例如row 已经是flex 所以不要使用d-flex

    flex-grow-1 用于占用剩余高度的元素。同样,一些classes(例如col)有flex-grow:1

引导弹性类

html,
body 
  height: 100%;
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" />
<div class="d-flex flex-column h-100">
  <div class="py-3 bg-danger">

  </div>
  <div class="py-3 bg-danger">

  </div>
  <div class="flex-grow-1 bg-primary">

  </div>
</div>

引导网格

html,
body 
  height: 100%;
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
<div class="fluid-container h-100">
  <div class="row flex-column h-100">
    <div class="col-auto py-3 bg-danger">

    </div>
    <div class="col-auto py-3 bg-success">

    </div>
    <div class="col bg-primary">

    </div>
  </div>
</div>

现在,div.col / div.flex-grow-1 占用视口的剩余高度。但是,如果它们的内容的高度大于viewport 的高度,它们就不会这样做:它们的高度与它们的内容的高度相同。如果要使其可滚动,请使用overflow: auto。我猜,bootstrap-4 没有任何overflow 属性的类。所以你应该使用自定义css。

https://codepen.io/anon/pen/JwWpgQ


附带说明,如果您想拥有footer at the bottom,请使用这些方法,但将colcol-auto 互换


如果您想让多个元素分别滚动,请对这些元素使用overflow-autoh-100

html,
body 
  height: 100%;


.overflow-auto 
  overflow: auto;


.h-200vh 
  height: 200vh;
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet" />
<div class="fluid-container h-100">
  <div class="row flex-column h-100">
    <div class="col-auto py-3 bg-danger">
    </div>
    <div class="col-auto py-3 bg-success">
    </div>
    <div class="col bg-dark d-flex">
      <div class="w-50 h-100 overflow-auto">
        <div class="bg-danger h-200vh"></div>
      </div>
      <div class="w-50 overflow-auto h-100">
        <div class="bg-primary h-200vh"></div>
      </div>
    </div>
  </div>
</div>

https://codepen.io/anon/pen/QzpQRO


结论:

像往常一样使用引导网格,但在 rowcol 上使用 flex-column 作为占据视口所有剩余高度的元素。如果要使其可滚动,请使用自定义 css 应用 overflow:auto


有什么问题可以留言,我会一一解答。我已经解决了你的问题,但我不会发布它,因为我认为你最好先尝试。

更新

这是我的解决方案。 https://codepen.io/anon/pen/Jwrzwm

【讨论】:

我只是在玩这个,现在想弄清楚。我注意到您的第三个示例有一个奇怪的问题,您可以向右滚动,因为页面外有一个偏移量,我认为它需要在第一个 .row 上“无排水沟”。当我有更具体的地方时,我会更新 我让它在#main 上使用绝对位置来偏移侧边栏和导航栏。虽然我不确定这一定是最好的方法:codepen.io/anon/pen/GPvVdE 我很想看看你没有发布比较的解决方案。 好吧,我想我已经解决了只使用填充而不是边距的问题(我想我需要再次阅读框大小)codepen.io/anon/pen/EGwYaP 说我仍然有兴趣看到解决方案你没有发帖。 codepen.io/anon/pen/Jwrzwm 你不应该改变元素的位置。如果您这样做,这些元素将从内容的正常流中删除。然后您需要使用边距和填充将相邻元素定位在正确的位置。 codepen.io/anon/pen/Jwrzwm我刚刚写了这个。我无法访问前几天写的解决方案。我会通过它。如果它比这更好,我将在下周发布它 - 假期后。 @约翰梅勒 当您可以使用网格或固定定位时,是否有理由将 flex 用于外部布局(导航栏和侧边栏)?

以上是关于使两列分别可滚动和视口剩余长度的高度的主要内容,如果未能解决你的问题,请参考以下文章

如何使两列格式相同的页面? [复制]

使两列相等

Firefox 100% 高度和自动滚动 div 问题

DIV+CSS布局,怎么实现两列高度会一致,其中左例随内容长度而定。

缩小视口时响应图像不填充DIV

BScroll使用