2列div布局:固定宽度的右列,左侧流体


158

我的要求很简单:2列,其中正确的列具有固定的大小。不幸的是,无论是在stackoverflow上还是在Google中,我都找不到可行的解决方案。如果我在自己的上下文中实现,那么那里描述的每个解决方案都会失败。当前的解决方案是:

div.container {
    position: fixed;
    float: left;
    top: 100px;
    width: 100%;
    clear: both;
}

#content {
    margin-right: 265px;
}

#right {
    float: right;
    width: 225px;
    margin-left: -225px;
}

#right, #content {
    height: 1%; /* fixed for IE, although doesn't seem to work */
    padding: 20px;
}
<div class="container">
    <div id="content">
        fooburg content
    </div>
    <div id="right">
        test right
    </div>
</div>

我得到以上代码的以下内容:

|----------------------- -------|
| fooburg content  |            |
|-------------------------------|
|                  | test right | 
|----------------------- -------|

请指教。非常感谢!

Answers:


268

除去左列上的浮子。

在HTML代码处,右列需要在左列之前。

如果右边有一个浮点数(和宽度),并且左边的列没有宽度和浮点数,它将很灵活:)

还要overflow: hidden对外部div 施加一个高度(可以是自动的),使其围绕两个内部div。

最后,在左侧列添加width: autooverflow: hidden,这使左侧列与右侧列保持独立(例如,如果调整浏览器窗口的大小,并且右侧列触及左侧列,则没有这些属性,则左侧列将运行围绕正确的对象(具有此属性,它将保留在其空间中)。

HTML示例:

<div class="container">
    <div class="right">
        right content fixed width
    </div>
    <div class="left">
        left content flexible width
    </div>
</div>

CSS:

.container {
   height: auto;
   overflow: hidden;
}

.right {
    width: 180px;
    float: right;
    background: #aafed6;
}

.left {
    float: none; /* not needed, just for clarification */
    background: #e8f6fe;
    /* the next props are meant to keep this block independent from the other floated one */
    width: auto;
    overflow: hidden;
}​​

此处的示例:http : //jsfiddle.net/jackJoe/fxWg7/


2
@Mir A clear: both 任何列中都不会影响外部浮点数。这不是“脆弱的”,除非您将透明对象放在两列之间的同一列上,如果将其放在最后,则不会造成任何危害。
jackJoe 2012年

6
我会考虑使用亚当的例子。我认为将html标记中的右列放在左列之前不是一个好主意。
Danny_Joris

1
@Danny_Joris我同意。另外,如果你使用媒体查询,它现在很难推右柱下方的左侧栏
andrewtweber

2
对于那些谁是好奇它的工作原理,解释可以在这里找到:stackoverflow.com/questions/25475822/...
哈希姆Qolami

1
我想知道是否有办法在左边之后加上右边的列,以便正确地堆叠(不使用flexbox)
Dominic

71

请参阅http://www.alistapart.com/articles/negativemargins/,这正是您所需要的(示例4)。

<div id="container">
    <div id="content">
        <h1>content</h1>
        <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.  Phasellus varius eleifend tellus. Suspendisse potenti. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nulla facilisi. Sed wisi lectus, placerat nec, mollis quis, posuere eget, arcu.</p>
        <p class="last">Donec euismod. Praesent mauris mi, adipiscing non, mollis eget, adipiscing ac, erat. Integer nonummy mauris sit amet metus. In adipiscing, ligula ultrices dictum vehicula, eros turpis lacinia libero, sed aliquet urna diam sed tellus. Etiam semper sapien eget metus.</p>
    </div>
</div>

<div id="sidebar">
    <h1>sidebar</h1>
    <ul>
        <li>link one</li>
        <li>link two</li>
    </ul>
</div>

#container {
    width: 100%;
    background: #f1f2ea url(background.gif) repeat-y right;
    float: left;
    margin-right: -200px;
}
#content {
    background: #f1f2ea;
    margin-right: 200px;
}
#sidebar {
    width: 200px;
    float: right;

1
神奇,简单的解决方案,并保持正确的HTML顺序!
user1794295 2014年

3
这比接受的解决方案好,因为标记顺序正确。
Petri Lehtinen 2014年

我对此一无所知。我怎么不知道这一点。完善!我一直在尝试做整个“流体输入,定宽搜索按钮”,显然,这里的源顺序非常重要。这钉它。谢谢!
马拉巴尔前线

我喜欢这种解决方案,因为移动断点时间的右侧栏/边栏将显示在下方,而不是左侧栏的内容上方。
dougtesting.net 17-4-2

我无法使用这种方法获得正确的列以到达顶部。
mulllhausen '18

29

最好避免将右列放在左边,只需使用负的右边距即可。

并通过包含@media设置进行“响应”,使右列在窄屏上位于左下方。

<div style="background: #f1f2ea;">
  <div id="container">
    <div id="content">
        <strong>Column 1 - content</strong>
    </div>
  </div>
  <div id="sidebar">
    <strong>Column 2 - sidebar</strong>
  </div>
<div style="clear:both"></div>

<style type="text/css">
#container {
    margin-right: -300px;
    float:left;
    width:100%;
}
#content {
    margin-right: 320px; /* 20px added for center margin */
}
#sidebar {
    width:300px;
    float:left
}
@media (max-width: 480px) {
    #container {
        margin-right:0px;
        margin-bottom:20px;
    }
    #content {
        margin-right:0px;
        width:100%;
    }
    #sidebar {
        clear:left;
    }
}
</style>

1
很好的解决方案。对于HTML之类的布局而言,将HTML的右对齐保持在左下方至关重要,因为其中的博客内容更为重要。
2014年

3
很好的答案!这是Codepen上的一个工作示例:codepen.io/martinkrulltott/pen/yNxezM
Martin

11

迄今为止最简单,最灵活的解决方案table display

HTML,左div排在首位,右div排在第二位……我们从左到右进行读写,因此将div从右向左放置没有任何意义

<div class="container">
    <div class="left">
        left content flexible width
    </div>
    <div class="right">
        right content fixed width
    </div>
</div>

CSS:

.container {
  display: table;
  width: 100%;
}

.left {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}​​

.right {
  display: table-cell;
  width: (whatever you want: 100%, 150px, auto)
}

案例示例:

// One div is 150px fixed width ; the other takes the rest of the width
.left {width: 150px} .right {width: 100%}

// One div is auto to its inner width ; the other takes the rest of the width
.left {width: 100%} .right {width: auto}

很好,很好,谢谢。有时,在没有合适的替代方法的情况下,有时会有时间和地点摆放桌子。而不是把正确的内容之前,在不正确的堆栈。该DOM
多米尼克

1
我喜欢这是一个“干净”的解决方案。但是,将div置于表单元格模式的唯一问题是您最好也使用Tables&Tds。而且您最终会失去诸如溢出滚动等功能
。– MarzSocks

这是不公平的,因为这种解决方案至少是语义正确,朝着简单RWD技术友好,同时使用tabletd最肯定不是!
ianp

如果列变窄,此方法很容易允许媒体查询删除常规div的Table。干净整洁。我喜欢。
AnthonyVO '18年

6

我想提出一个尚未提及的解决方案:使用CSS3 calc()进行混合%px组合。如今,它calc()具有出色的支持,并且可以快速构建非常复杂的布局。

这是下面代码的JSFiddle链接。

HTML:

<div class="sidebar">
  sidebar fixed width
</div>
<div class="content">
  content flexible width
</div>

CSS:

.sidebar {
    width: 180px;
    float: right;
    background: green;
}

.content {
    width: calc(100% - 180px);
    background: orange;
}

这是另一个JSFiddle,展示了此概念适用于更复杂的布局。我在这里使用SCSS是因为它的变量允许使用灵活的自描述代码,但是如果不存在“硬编码”值,则可以在纯CSS中轻松地重新创建布局。


2

这是一个通用的HTML源代码有序解决方案,其中:

  • 源顺序中的第一列是可变的
  • 源顺序中的第二列是固定的
    • 此列可以使用CSS向左或向右浮动

固定/第二列在右边

#wrapper {
  margin-right: 200px;
}
#content {
  float: left;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: right;
  width: 200px;
  margin-right: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

固定/第二列在左侧

#wrapper {
  margin-left: 200px;
}
#content {
  float: right;
  width: 100%;
  background-color: powderblue;
}
#sidebar {
  float: left;
  width: 200px;
  margin-left: -200px;
  background-color: palevioletred;
}
#cleared {
  clear: both;
}
<div id="wrapper">
  <div id="content">Column 1 (fluid)</div>
  <div id="sidebar">Column 2 (fixed)</div>
  <div id="cleared"></div>
</div>

另一种解决方案是使用display:table-cell ; 结果列的高度相等。


右边的第二列将不起作用。如果左列中有完整的文本,则右列将显示为新行。
2015年

您是否尝试过放置更多内容并调整大小。只是测试了您的代码而没有用。
TomSawyer

@TomSawyer我不确定您在说什么。这是我尝试提供的更多内容:jsfiddle.net/salman/mva6cnxLjsfiddle.net/salman/mva6cnxL/1。完美地工作。
Salman A

我所搜寻的。谢谢

0

嘿,您可以做的是对两个容器都应用固定的宽度,然后在clear:both处使用另一个div类,例如

div#left {

width: 600px;
float: left;
}

div#right {

width: 240px;
float: right;

}

div.clear {

clear:both;

}

在左右容器下方放置一个clear div。


-3

我简化了:我编辑了杰克乔的答案。我认为不需要高度自动等。

CSS:

#container {
position: relative;
margin:0 auto;
width: 1000px;
background: #C63;
padding: 10px;
}

#leftCol {
background: #e8f6fe;
width: auto;
}

#rightCol {
float:right;
width:30%;
background: #aafed6;
}

.box {
position:relative;
clear:both;
background:#F39;
 }
</style>

HTML:

<div id="container">

  <div id="rightCol"> 
   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
 </div>

 <div id="leftCol">

   <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

Lorem ipsum dolor坐下来,管教高尚。菜豆。Lorem ipsum dolor坐立不安,擅长上等。Phasellusvarius eleifend。

</div>

</div>

<div class="box">
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>

  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
  <p>Lorem ipsum dolor sit amet,consectetuer adipiscing elit. Phasellus varius eleifend. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.Phasellus varius eleifend.</p>
</div>

原始问题想要一个固定大小的右列。
Dr. Aaron Dishno '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.