HTML/CSS全高度侧边栏

11

我在互联网上找到了很多关于这个问题的讨论和问题,但是它们似乎都与我的情况不匹配,并且解决方案高度特定于某种情况。

我有一个顶部高度为 100pxheader元素。我有一个左浮动的宽度为 250pxdiv#sidebar 元素, 最后一个也是左浮动的div#main元素。

htmlbodydiv#sidebar的高度均为 100%

我的目标是使 div#sidebar 延伸到页面底部,而不考虑浏览器大小或内容大小。显然,如果内容超过可视页面高度,它应该正常工作并超出页面末端,引入滚动条。

然而,现在情况是,页面高度已经被计算为100% + 100px,即使没有任何会推动div#sidebar向下的内容,也引入了滚动条。到目前为止,我没有找到有效的解决方案,或者我可能错过了它,或者弄错了一个解决方案。不管怎样,我已经在这个问题上花费了超过一个小时的时间,我快要抓狂了。

是否有一种非JavaScript的方法可以使这正常工作,以防止header的高度被添加到100%中?


这是我的HTML/CSS代码——虽然我在上面包含了所有相关细节,但这应该会有所帮助。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>My Awesome Template!</title>
        <link href="./stylesheet.css" rel="stylesheet" />
    </head>
    <body>
        <header id="primary">
            <h1>My Awesome Template!</h1>
        </header>
        <div id="sidebar">
            <h1>Sidebar</h1>
        </div>
        <div id="main">
            <h1>Main</h1>
        </div>
    </body>
</html>

CSS:

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

body
{
    background: #fff;
    font: 14px/1.333 sans-serif;
    color: #080000;
}

header#primary
{
    width: 100%;
    height: 100px;
    background: #313131;
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#4d4d4d), to(#313131));
    background-image: -moz-linear-gradient(#4d4d4d, #313131);
    background-image: -o-linear-gradient(#4d4d4d, #313131);
    background-image: linear-gradient(#4d4d4d, #313131);
}
header#primary h1
{
    margin: 0px 0px 0px 20px;
    padding: 0px;
    line-height: 100px;
    color: #ffffff;
}

#sidebar
{
    float: left;
    width: 250px;
    background: #ccc;
    min-height: 100%;
}

#main
{
    float: left;
}

你确定树形结构(子元素)中所有内容都放置在正确的位置吗?例如,头部是主体的子元素吗? - Sherif elKhatib
1
@mamoo - 带有HTML/CSS的帖子已经被编辑。 - user685018
请在jsFiddle.net上创建一个示例。 - chchrist
3
你真的无法将几行代码复制/粘贴到本地文件中吗? - user685018
您可以从以下链接中找到一些HTML CSS侧边栏菜单导航: http://www.designerslib.com/html-css-sidebar-menu-navigations/ - Karuppiah RK
我也觉得没有jsfiddle很烦人,所以我把它放在那里了(注意:这不是关于复制/粘贴的懒惰,而是在浪费时间复制它之前知道它是什么):https://jsfiddle.net/1kndu9or/ - LFLFM
6个回答

12

我发现在这篇文章中描述的方法是解决这个问题非常简单的方法。

你需要用另一个div来包围你的#sidebar和#main divs,这样你的html代码就变成了:

...
<div id="content">
    <div id="sidebar">
        <h1>Sidebar</h1>
    </div>
    <div id="main">
        <h1>Main</h1>
    </div>
</div>
...

然后以下的CSS将会实现接近你想要的效果:

#content {
    position: relative;
    width: 100%;
}
#sidebar {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    width: 240px;
}
#main {
    position: relative;
    margin-left: 250px;
}

(稍加调整,例如我发现在#main中h1的边距似乎被忽略了...但是#sidebar上的h1边距没有!)


坏链接。你能否用正确的链接替换它或者将其删除? - vastlysuperiorman
从互联网档案馆https://web.archive.org/web/20150227203316/http://offshootinc.com/blog/2011/11/23/getting-100-column-height-with-css/获取 - 希望它能存活更久... - Murray Jensen

5
您正在寻找臭名昭著的“伪列”技术。这里有一个教程链接:教程
基本上,您不能使用简单的背景颜色来实现它,必须使用重复的背景图像。

我原本希望避免这种情况的发生;最近我一直倾向于更加简约和无图像的模板。 - user685018
1
抱歉,据我所知并且我已经搜索了很多,没有其他方法。我没有尝试过,但也许可以尝试通过定位将一个附加到列底部的 div 放入相同的背景颜色,并包含一个非断行空格 (&nbsp;),看看是否有效。如果有效,请告诉我们。 - Iterate
没有使用JS,就没有其他“干净”的方法(我看到了其他技术,它们真的会污染标记,并使用许多跨浏览器兼容性的黑客技巧,所以在我看来,它们不是好的解决方案)... - mamoo
@StevenZezulak 您的解决方案使用了overflow: auto,这应该被考虑进去。 - KitKat
我不明白使用图像的原因,通过为包装器(侧边栏)设置灰色背景和内容设置白色背景可以实现相同的效果。 - michaeltintiuc

3
如果您不关心较低版本的IE,请在父元素上使用display: table,并在元素上使用display: table-cell。这应该将它们的高度固定在一起。至于间隙,请使用margin-top: -100 px; padding-top: 100px;

1

不确定您是否尝试过这种方法,或者它是否适用于您(我刚学编程),但是请尝试将侧边栏向左浮动,内容向右浮动,两者都靠左对齐,并使用百分比来设置宽度。

#sidebar
    {
float: left;
width: 25%;
background: #ccc;
min-height: 100%;
text-align: left;
    }

#main
    {
float: right;
text-align: left;
width: 70%;
    }

如果您有其他设置,您将不得不以不同的方式处理它们,但这可能有效。

0
$(".sidebar").height(Math.max($(".content").height(),$(".sidebar").height()));

你可以通过这个jQuery代码做到这一点。调用主内容的高度。

$(".left-sidebar, .right-sidebar").height(Math.max($(".content").height())); 您可以混合使用两个侧边栏。 - John Louie Biñas

-3

jQuery 轻松优雅地处理这个问题,所以我不确定为什么你不想使用 js。大多数编写过几个网站的开发人员都花费了相当多的时间寻找神奇的答案,就像我一样,但没有什么比使用 js 更好。


1
正如我在上面的评论中提到的那样,我最近对JavaScript和不含图片的极简主题感兴趣。当然,使用JavaScript / jQuery没有任何问题;这只是我寻找“神奇答案”的探索 :) - user685018

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接