【问题标题】:Full Page design: How to force a Div to stop expanding at the bottom of the page整页设计:如何强制 Div 在页面底部停止扩展
【发布时间】:2016-09-16 02:16:21
【问题描述】:

如果标题有点混乱,我很抱歉,但我不知道如何用一句话来描述我的问题。所以基本上我几天以来一直在全页/屏幕设计上苦苦挣扎。

在我的设计中,我有多个包含一些文本的 Div,其中一个比正常屏幕分辨率的高度大很多。此外,我不希望网站在查看者浏览器的一侧有滚动,我宁愿在 div 中有一个太大的滚动(例如在这个 div 中使用 overflow: auto;) .但是我似乎无法同时获得 div 和滚动的正确位置。

Here is a CodePen of my situation,我希望红色和蓝色的 div 像这样定位,但我也希望蓝色的 div 在到达页面底部时停止扩展,并且如果确实发生了滚动。

我发现获得滚动的唯一方法是使用 max-height绝对定位。然而,这些解决方案都不可行,因为每个屏幕分辨率的蓝色 div 的最大高度是不同的,而红色 div 的高度不是固定的。此外,如果我尝试使用绝对定位,我最终会看到蓝色 div 站在红色 div 上方,因为蓝色 div 的绝对定位使它离开“流程”(我不能使用 margin-top: “红色div的高度”;解决这个问题,因为红色div的高度不固定)。

希望我的解释很清楚,有人能够帮助我。顺便说一句,我宁愿不使用 JS,但如果有必要我会使用它。此外,我欢迎一个不在旧版本 IE 上的解决方案,因为我的观众都没有使用它们。

谢谢,托马斯 A

编辑:为了更清楚,我希望它看起来像 that 但蓝色 div 的高度 (#bottom-inside-container) 是动态的并且不固定(无论页面大小如何,从 div 的开头到页面底部)

【问题讨论】:

  • 你在哪里使用 clear:both ?

标签: css overflow


【解决方案1】:

3 年后,有了更好的浏览器支持,使用 flexbox 属性很容易。您可以在 CSS 中添加以下内容:

#wrapper {
    display:flex; 
    flex-direction:column;
}
#top-inside-container {
    flex-grow:2;
}
#bottom-inside-container {
    flex-grow:1;
    overflow-x: hidden;
    overflow-y: auto;
}

在容器的顶部设置 flex-grow:2,它很小,是什么让它增长直到它显示它的所有内容。在容器底部设置溢出将隐藏(用于水平滚动)并设置(用于垂直滚动)滚动条,具体取决于它必须显示的内容量。

这是一个基于您的 codepen 的代码,经过最少的修改:

http://codepen.io/anon/pen/BLKENA

PD:我来自 Google,正在寻找类似的答案...无论如何它可以帮助某人。

【讨论】:

    【解决方案2】:

    您的包装不会滚动,因为它没有高度(或 100%)。 然后,应用默认浏览器滚动,但您不能在包装级别滚动。

    只需为包装器指定高度即可实现滚动 - 例如:

    #wrapper { 
      position:fixed;
      right:550px;
      left:0;
      background:rgb(200,200,200);
      height: 500px;
      overflow: auto;
    }
    

    希望这会有所帮助

    【讨论】:

    • 您好,感谢您的回答。我已经考虑过这个解决方案,但问题是我只想在蓝色 div (#bottom-inside-container) 中有一个滚动,而不是整个包装器。我希望它看起来像这样:codepen.io/anon/pen/rGlom 但蓝色 div 的高度是动态的而不是固定的(从 div 的开头到页面底部,无论页面大小如何)。
    【解决方案3】:

    您可以通过将蓝色 div 设置为 position: absolute 然后设置顶部和底部值来做到这一点。即

    html, body{
        width: 100%; height: 100%; margin: 0; padding: 0;
    }
    #top-inside-container {
        position: absolute; top: 0; width: 100%; height: 100px; background:rgb(75,0,0);
    }
    #bottom-inside-container {
        position: absolute; width: 100%; top: 100px; bottom: 0; background:rgb(0,75,200); overflow-y: scroll;
    }
    

    它在这里工作: http://codepen.io/anon/pen/qnwFf

    【讨论】:

    • 您好,感谢您的回答。您的代码的问题是您为红色 div (#top-inside-container) 提供了 100px 的高度,但在我的网站上,红色 div 没有固定高度,所以我可以t 给 #bottom-inside-container 一个固定的像素数作为“top”属性的值。
    • 在这种情况下,我相信您需要使用 javascript 来测量红色 div 的高度,以便在蓝色 div 上设置最高值。
    • 是的,不幸的是我认为使用一些 JS 是不可避免的(参见 Nelson 的回答)。无论如何,非常感谢您的帮助!
    【解决方案4】:

    您说您的第二个失败选项(在蓝色 div 上使用绝对定位)无法完成,因为它离开了正常流程。好吧,我通过将红色和蓝色 div 都包含在相对父级中,使蓝色 div 成为绝对的,同时不离开正常流程,请参阅http://codepen.io/anon/pen/KEdwG

    但是,它仍然失败..原因是,您将现在的绝对蓝色 div 设置为多少高度?你不能给出答案,我也不能,但是“溢出:滚动”需要知道在什么高度开始滚动。这就是为什么这不能仅使用 CSS 完成的原因。

    因此,如果您不介意将两行 jquery 添加到您的 document.ready() 中,请参阅 my pen 关于以这种方式解决它,您可以忽略您页面的 window.resize() 代码,就像我把它放在笔中一样这样您就可以垂直拖动 iframe 并查看蓝色 div 如何保持预期的高度。

    另外,如果您查看我笔的 css cmets,我将您的 left:25px 更改为 4%,因为相对父母需要它来正确处理(除了通常使用 % 比使用 px 更好)。

    为了方便,我把pen jquery代码贴在这里:

    $(document).ready(function() {
      max = $(document).height() - $('#bottom-inside-container').offset().top;
      $('#bottom-inside-container').css('max-height',max);
    });
    

    【讨论】:

    • 您好,非常感谢您的帮助。几天来,我一直在尝试在不使用 jQuery 的情况下达到与您相同的结果,但我想这是不可能的。所以我毕竟会使用一些 JS(这不是世界末日:D)。我现在会尝试将您的解决方案包含在我的网站中,如果可行,我会将我的主题标记为已解决。
    • 好的,它在我的网站上效果很好。顺便说一句,我删除了 #top-insideparent 并直接使用了 position:relative;在 #top-inside-container 上。此外,我保留了 jQuery 的两行,否则如果查看者在网站上更改浏览器大小,则 #bottom-inside-container 高度不会改变。我以这个结尾:codepen.io/anon/pen/fLKJH 这是我想要的。谢谢@Nelson!
    • 抱歉,我需要 15 的声望才能支持您的回答:/.
    • 肯定是 $(window).height()?使用 document 可以阻止 div 变得比开始时更大,但是如果它开始时比屏幕大,这肯定不会起作用吗?
    猜你喜欢
    • 2014-07-23
    • 2018-09-17
    • 2012-11-06
    • 2010-09-13
    • 2013-07-05
    • 2012-04-02
    • 2019-10-26
    • 2011-12-03
    相关资源
    最近更新 更多