【问题标题】:Fixed Header/Footer + Content height 100% cause undesired vertical Scrolling固定页眉/页脚 + 内容高度 100% 导致不需要的垂直滚动
【发布时间】:2013-08-15 03:17:17
【问题描述】:

我正在尝试实现一个带有固定页眉和页脚的水平滚动网站。

目标: 1. 固定页眉和页脚 2.没有垂直滚动 3.内容div填充页眉和页脚之间的所有空间

我在内容上使用了 position: absolute 来确保 height:100% 占据页眉和页脚之间的区域。 (我的第三个目标) 但是,这也会导致出现垂直滚动条。

现场演示: http://jsfiddle.net/wQ2XR/230/

如何在不出现垂直滚动条的情况下实现我的目标?

提前非常感谢!

html代码:

    <div id="total">
        <header id="1">
            <div id="a">
                    <h1>Header</h1>

            </div>
        </header>

        <div id="2">
            <div id="b">
                <div id="bb">
                    <h2>Post Title Example One</h2> 
                <p>hello world! Have you thoroughly searched for an answer before asking your question? </p>
                </div>
            </div>
        </div>
        <footer id="3">
            <div id="c">
                    <h1>footer</h1>

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

CSS:

body, html {
    height: 100%;
    padding: 0;
    margin: 0;
}
body {
    width: 100%;
}

header {
}

#a {
    position: fixed;
    height: 50px;
    top: 0;
    width: 100%;
    background-color: blue;
}

 #2 {
    position: relative;
    padding: 50px 0 25px 0;
}

#b {
    height: 100%;
    position: absolute;
}

#bb {
    position: relative;
    height: 100%;
    margin: 50px 0 0 0;
    width: 2000px;
    background-color: yellow;
}

 footer {
}

#c {
    position: fixed;
    height: 25px;
    bottom: 0;
    width: 100%;
    background-color: green;
}

【问题讨论】:

    标签: html css css-position horizontal-scrolling


    【解决方案1】:

    嗯,问题在于页眉和页脚之间的内容周围的包装器使用height:100% 占据了视口的高度。因此,当您应用边距以垂直偏移这些内容包装器(以便标题变得可见)时,它们会被推到低于视口的位置(50 像素,标题的高度)。结果,您会得到一个垂直滚动条,因为内容包装器是视口的全部高度并且被向下推 - 所以它们无法适应屏幕。

    如何避免这种情况?好吧,如果您的页脚和页眉高度不是动态的(即,您将始终通过 CSS 控制它们的高度),您可以使用 position:absolute 以相当简单的方式实现这一点。

    我稍微修改了你的结构;我删除了#2#b 元素,因为看起来它们只是为了正确定位/调整#bb,实际包含内容的元素:

    <div id="total">
        <header id="1">
            <div id="a">
                <h1>Header</h1>
            </div>
        </header>
        <div id="bb">
            <h2>Post Title Example One</h2> 
            <p>hello world! Have you thoroughly searched for an answer before asking your question?</p>
        </div>
        <footer id="3">
            <div id="c">
                <h1>footer</h1>
            </div>
        </footer>
    </div>
    

    现在,通过您的 CSS,我删除了样式 #2#b 的定义。此外,我将#bb CSS 修改为:

    #bb {
        position: absolute;
        top: 50px;
        bottom: 25px;
        width: 2000px;
        background-color: yellow;
    }
    

    这里有一个updated JSFiddle 来展示它所取得的成果。此外,这是您在其中一个答案中作为评论提供的JSFiddle implementing your multiple-row layout

    overflow:hidden 不能正常工作的原因是#bb 实际上仍会延伸到视口下方——只是不会创建垂直滚动条,因为浏览器会忽略溢出区域。但是,当您使用百分比高度时,#bb 的高度显然不是可见的。无论如何,希望这会有所帮助!如果这不是您想要的,请告诉我,我很乐意为您提供进一步帮助。祝你好运!

    【讨论】:

    • 看准了!谢谢。与您并行,我想出了以下解决方案。实际上更长且不同:jsfiddle.net/wQ2XR/237。使用填充(因此必须在 bb 上仍然放置 100% 的高度)并且必须删除背景颜色。这仅在您也将边框框应用于 bb 时才有效。你知道这是为什么(尤其是边框)吗?无论哪种方式,我都会实施您的解决方案,因为它更短;)
    • 很高兴我能帮上忙!这是使用边界框的一个有趣的解决方案。它起作用的原因是当在#bb 上设置box-sizing:border-box 时,这意味着它的填充被计算到它的高度,所以height:100% 让它成为视口的高度,即使有填充也是如此。当您将.row 元素放入其中时,它们可以展开到的可用高度是#bb 的高度减去其填充。 #bb 的填充隐藏在页脚和页眉后面,而 .row 元素扩展以填充它们之间的空间。希望这很清楚!评论对于答案来说有点短......
    • 我明白你的解释。这显然是它的作用。对我来说,边界框的名称表明它是一个围绕边界的框,所以我的直觉告诉我它在填充之外(边界所在的位置)放置了一个框。剩下的有效盒子(在我的css中调用它之后)是盒子是填充内的所有东西(就像你提到的那样)。显然不是你所期望的第一手资料。老实说,我很高兴它能按它的方式工作,总有一天它可能会派上用场。谢谢你的帮助!你拯救了这一天。
    【解决方案2】:

    要隐藏滚动条,请使用:

    overflow: hidden;
    

    但是,文本需要放在某个地方(否则它将被隐藏),因此您需要使容器更大或使用文本列。

    您是否打算实现类似 Windows 8 Metro UI 的滚动功能?

    【讨论】:

    • 感谢您的回复!您的建议解决了我的部分问题,但为了向您展示其余部分,我们必须深入挖掘。我为您更新了我的示例:jsfiddle.net/wQ2XR/234
      正如您所看到的,我正在使用 Metro 风格的 UI(您猜对了!),其中 3 行高度设置为 33%。滚动条不见了。但是底行虽然在 CSS 中设置为 height:33%,但不会与其他行隔开。解决这个问题将完全解决我的问题!你知道怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 2014-08-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多