4

在任何地方都找不到解决方案(我猜这一定是一个很常见的问题)。

我正在创建一个带有侧边栏的响应式设计,其中侧边栏需要具有 200 像素的固定宽度并且具有未知的高度。我怎样才能做到这一点,以便主要内容区域占据所有剩余的宽度,而没有任何行为不端。

我最接近它的是以下,但它的问题是侧边栏可以与页脚重叠。任何人都可以建议我的代码修复,或与我分享一些有效的代码吗?

            * {
            padding: 0;
            margin: 0;
            outline: 0;
            -moz-box-sizing: content-box;
            -webkit-box-sizing: content-box;
            box-sizing: content-box;
        }
        body {
            background: orange;
        }
        #container {
            max-width: 1000px;
            min-width: 768px;
            margin: 0 auto;
            background: yellow;
            position: relative;
            height: 100%;
        }
        #header {
            background: purple;
            color: white;
            text-align: center;
            padding: 10px;
        }
        #main {
            position: relative;
        }
        aside {
            background: blue;
            width: 200px;
            color: white;

            position: absolute;
            top: 0;

            /* change this to "right: 0;" if you want the aside on the right. Also, change the "margin-left" code, below. */
            left: 0;

            padding-top: 20px;
            padding-bottom: 20px;

            padding-left: 10px; /* If you change this value, remember to change the margin-left value of #primary */
            padding-right: 10px; /* ditto */
        }
        #primary {
            background: red;

            /* change this to margin-right if you want the aside on the right. Also change the "left" code, above. */
            margin-left: 220px; /* aside_width + aside_left_padding + aside_right_padding = 200px + 10px + 10px */
            padding: 1em; /* whatever */
        }
        #footer {
            background: green;
            color: white;
            padding: 10px;
            position: absolute;
            bottom: 0;
            left: 0;
            right: 0;
        }

        <div id="container">
        <div id="header">
            <h1>LAYOUT TEST #2</h1>
        </div>
        <div id="main">
            <div id="primary">
                <h2>THIS IS THE MAIN CONTENT ** THIS IS THE MAIN CONTENT ** THIS IS THE MAIN CONTENT</h2>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <h2>sub heading</h2>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <h2>sub heading</h2>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
            </div>
            <aside>
                <h3>navigation (left)</h3>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
                <p>lorem ipsum</p>
            </aside>
        </div>
        <div id="footer">
            <h1>LAYOUT TEST #2</h1>
        </div>
    </div>
4

5 回答 5

8

1 = 使用弹性框:http: //jsfiddle.net/rudiedirkx/CjWbv/2/

#main {
    display: flex;
}
#primary {
    background: #bbb;
    flex: 1;
}
aside {
    background: #ddd;
    flex: 0 0 200px;
}

2 = 与calc():http: //jsfiddle.net/rudiedirkx/CjWbv/

#main:after { clearfix here }
#primary {
    float: left;
    background: #bbb;
    width: calc(100% - 200px);
}
aside {
    background: #ddd;
    float: right;
    width: 200px;
}

两者都需要对旧浏览器(和供应商前缀)进行后备。从其他答案中选择。

于 2013-03-15T17:07:36.360 回答
4

我认为所有这些position: absolute方法都不是最好的方法。

  1. 您想要一个带有max-width和的容器元素margin: 0 auto。不知道你为什么也想要一个min-width;你当然可以。

  2. 您放置的任何块元素都会自动获取所有width父元素。因此,页眉页脚没有问题,只需将它们放置在正确的位置,它们就会正确渲染。

  3. 正如您所做的那样,为您的主要部分使用容器元素。由于元素是从左到右呈现的,您可能需要aside#primary.

  4. 应用float: leftaside您想要的固定宽度。

  5. 主要内容#primary元素会自动占用剩余空间(或者只是 apply width: auto注意:剩余空间是父元素的剩余空间,所以,如果你在父元素上设置,min-width不要指望你#primary会更窄!

  6. 现在你会遇到一个问题:容器元素#main不会得到正确的高度。那是因为float. 要强制父元素达到其浮动子元素的高度,请使用overflow: hidden.

你应该准备好了。这是您的代码稍作修改的版本

于 2013-03-15T16:36:06.013 回答
4

在我们得到 flexbox 之前,我相信做你正在寻找的最好的方法是简单地使用 css display: table;。您需要将容器设置为display: table;,然后将每个列设置为display: table-cell;。这将消除使用浮点数或任何其他 JS 魔法的需要。此外,这适用于 IE8。我知道使用任何带有“表格”一词的布局都感觉很粗略,但试一试。

查看此链接了解更多信息。

这是您的代码的更新版本。

编辑:示例代码

html:假设这个标记

<div id="main">
    <div id="sidebar"></div>
    <div id="content"></div>
</div>

CSS:

#main {
    display: table;
    width: 100%;
}
#sidebar {
    display: table-cell;
    width: 200px;
}
#content {
    display: table-cell;
    /* no need to specify width. 
     * width will auto fill remaining width of parent `table` #main.
     * so 100% - 200px */
}
于 2014-05-27T17:38:29.747 回答
0
#main { position: relative; overflow:hidden;}

这会阻止侧边栏行为不端。

于 2013-03-15T16:22:03.150 回答
0

您可以通过添加或使用以下方法来margin-bottom: FOOTER_HEIGHT修复它:aside

<div id="container">
    <div id="header">
        YOUR_HEADER
    </div>
    <div id="body>
        <div id="sidebar">
            YOUR_SIDE_BAR_CONTENT
        </div>
        <div id="main">
            YOUR_CONTENT
        </div>
        <br />
    </div>
    <div id="footer">
        YOUR_FOOTER
    </div>
</div>

和CSS:

#sidebar {
    width: ...;
    height: ...;
    float: right;
}
#main {
    margin-right: WIDTH_OF_SIDE_BAR;
}
#body > br {
    clear: both;
}
于 2013-03-15T16:31:07.183 回答