如何将两个div彼此相邻放置?


370

考虑以下代码

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    width: 300px;
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

我希望两个div在包装div中彼此相邻。在这种情况下,绿色div的高度应确定包装纸的高度。

我如何通过CSS实现呢?



14
#wrapper { display: flex; }
icl7126 '18

Answers:


447

浮动一个或两个内部div。

浮动一格:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: hidden; /* will contain if #first is longer than #second */
}
#first {
    width: 300px;
    float:left; /* add this */
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    overflow: hidden; /* if you don't want #second to wrap below #first */
}

或者如果您同时浮动两个子元素,则需要鼓励包装器div包含两个浮动子元素,否则它会认为它是空的而不是在它们周围放置边框

浮动两个div:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: hidden; /* add this to contain floated children */
}
#first {
    width: 300px;
    float:left; /* add this */
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    float: left; /* add this */
}

2
您可以overflow:auto在#wrapper上进行设置,因此大小仍将适合内容大小。(不需要clear:both元素)
meo

是的,在示例一中,如果#first更长,则肯定可以-包含浮点数101 eh;)..隐藏在#second上的溢出避免了计算左裕度的需要,尽管否则解决方案基本相同
clairesuzy

3
究竟!我不想计算保证金。overflow: hidden在这里做得很好!但是,这对我来说仍然是一种魔力。我认为,如果内容不适合其容器,overflow: hidden则应隐藏该内容。但是,这里的行为有些不同。您能详细说明一下吗?
Misha Moroshko

4
overflow属性将清除水平和垂直方向的浮动,这就是为什么在我的第一个示例中,#second不需要左页边距,只要它的值不是visible。的原因,overflow属性就可以工作。滚动条不是偶然生成的(自动会这样做)..两种方式都不会隐藏任何内容,因为只有当它超出您的500px宽度时才会隐藏,但是只要没有高度内容正常包裹在宽度内..没有隐藏;)
clairesuzy 2011年

1
溢出:隐藏在#wrapper中的功能是,如果它变得比非浮动的#second div长,则可以垂直包含#first浮动。#second上的第二次溢出用于将内容包含在第一个浮点数旁边,否则将在水平方向上包含在第一个浮点数的下面。溢出属性的扩展行为在CSS2.1中的某个阶段中逐步执行,因此规范本身也进行了更改,以响应不包含清除元素或clearfix hack的包含浮点的方式,它的技术术语是当这样使用时,它会创建一个新的块格式化上下文
clairesuzy 2011年

130

有两个div

<div id="div1">The two divs are</div>
<div id="div2">next to each other.</div>

您还可以使用该display属性:

#div1 {
    display: inline-block;
}

#div2 {
    display: inline-block;
}

jsFiddle示例在这里

如果div1超过一定高度,div2将被放置div1在底部的旁边。要解决此问题,请vertical-align:top;在上使用div2

jsFiddle示例在这里


@BS即使接受的答案也使用float属性,该属性比主要浏览器的display属性更早支持。Chrome支持从v1.0开始浮动,从v4.0开始显示。也许在撰写本文时,可接受的答案更加向后兼容。
jim_kastrin

5
这种解决方案有一个烦人的问题:由于制作了divs,因此inline您不必在HTML中保留空格,新行等。否则,浏览器将在它们之间渲染一个空格。看这个小提琴:您不能设法将divs放在同一行上,除非您将它们的标签放在中间。
亚历山大·阿巴库莫夫

30

您可以使用CSS float属性将元素彼此相邻放置:

#first {
float: left;
}
#second {
float: left;
}

您需要确保wrapper div允许宽度浮动,并且页边距等设置正确。


17

尝试使用flexbox模型。它很容易写。

Live Jsfiddle

CSS:

#wrapper {
  display: flex;
  border: 1px solid black;
}
#first {
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}

默认方向是行。因此,它在#wrapper内部彼此对齐。但是不支持IE9或更低版本


1
我简直不敢相信它的使用多么简单flex。谢谢!
山姆

16

这是解决方案:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: auto; /* so the size of the wrapper is alway the size of the longest content */
}
#first {
    float: left;
    width: 300px;
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    margin: 0 0 0 302px; /* considering the border you need to use a margin so the content does not float under the first div*/
}

您的演示已更新;

http://jsfiddle.net/dqC8t/1/


谢谢。如果我省略,overflow: auto;它仍然有效。您能举一个需要它的例子吗?
Misha Moroshko

是的,可以肯定的:删除overflow auto,使第一个的内容更长,然后使second的内容更长,您会很好地看到,只有在您为其设置了overflow auto或使用清除元素:jsfiddle
meo

好,我明白了,谢谢!但是,我不喜欢,margin: 0 0 0 302px;因为它取决于width: 300px;。但是,还是谢谢你!!
Misha Moroshko

如果您为第二个格指定i宽度,则不需要它
meo

15

选项1

float:left在两个div元素上都使用,并为两个div元素设置一个总宽度为100%的%宽度。

使用box-sizing: border-box;浮动div元素。值border-box会将填充和边框强制为宽度和高度,而不是对其进行扩展。

在上使用clearfix <div id="wrapper">清除浮动子元素,这将使包装div缩放到正确的高度。

.clearfix:after {
   content: " "; 
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    border: 1px solid red;
    float:left;
    width:50%;
}
#second {
    border: 1px solid green;
    float:left;
    width:50%;
}

http://jsfiddle.net/dqC8t/3381/

选项2

position:absolute在一个元素上使用,在另一个元素上使用固定的宽度。

添加position:相对于<div id="wrapper">element,以使子元素绝对位于该<div id="wrapper">元素的位置。

#wrapper {
    width: 500px;
    border: 1px solid black;
    position:relative;
}
#first {
    border: 1px solid red;
    width:100px;
}
#second {
    border: 1px solid green;
    position:absolute;
    top:0;
    left:100px;
    right:0;
}

http://jsfiddle.net/dqC8t/3382/

选项3

display:inline-block在两个div元素上都使用,并为两个div元素设置一个总宽度为100%的%宽度。

再次(与float:left示例相同)box-sizing: border-box;在div元素上使用。值border-box会将填充和边框强制为宽度和高度,而不是对其进行扩展。

注意:内联块元素可能会存在间距问题,因为它受HTML标记中的空格影响。此处提供更多信息:https : //css-tricks.com/fighting-the-space-between-inline-block-elements/

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
    position:relative;
}

#first {
    width:50%;
    border: 1px solid red;
    display:inline-block;
}

#second {
    width:50%;
    border: 1px solid green;
    display:inline-block;
}

http://jsfiddle.net/dqC8t/3383/

最后一个选择是使用名为flex的新显示选项,但请注意,浏览器兼容性可能会发挥作用:

http://caniuse.com/#feat=flexbox

http://www.sketchingwithcss.com/samplechapter/cheatsheet.html


1
同意;float不要让我的船漂浮。inline-block岩石。(对不起)
SteveCinq

7

尝试使用以下代码更改将两个div放在彼此前面

#wrapper {
  width: 500px;
  border: 1px solid black;
  display:flex;
}

JSFiddle链接


7

这很容易-您可以用困难的方式做到

.clearfix:after {
   content: " "; 
   visibility: hidden;
   display: block;
   height: 0;
   clear: both;
}

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    border: 1px solid red;
    float:left;
    width:50%;
}
#second {
    border: 1px solid green;
    float:left;
    width:50%;
}
<div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

还是简单的方法

#wrapper {
  display: flex;
  border: 1px solid black;
}
#first {
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

还有大约一百万种其他方式。
但是我只是简单的方法。我还想告诉您,这里的许多答案都是错误的,但是我所展示的两种方法至少都适用于HTML 5。


5

这是正确的CSS3答案。希望这现在能以某种方式对您有所帮助:D我真的建议您阅读本书:https : //www.amazon.com/Book-CSS3-Developers-Future-Design/dp/1593272863实际上,我已经从现在阅读本书中获得了此解决方案。:D

#wrapper{
  display: flex;
  flex-direction: row;
  border: 1px solid black;
}
#first{
  width: 300px;
  border: 1px solid red;
}
#second{
  border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>


3
  1. float:left;在两个div中添加属性。

  2. 添加display:inline-block;属性。

  3. display:flex;在父div中添加属性。


2

我的方法:

<div class="left">Left</div>
<div class="right">Right</div>

CSS:

.left {
    float: left;
    width: calc(100% - 200px);
    background: green;
}

.right {
    float: right;
    width: 200px;
    background: yellow;
}

0

#wrapper {
width: 1200;
border: 1px solid black;
position: relative;
float: left;
}
#first {
width: 300px;
border: 1px solid red;
position: relative;
float: left;
}
#second {
border: 1px solid green;
position: relative;
float: left;
width: 500px;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>


0

在材料UI和react.js中,您可以使用网格

<Grid
  container
  direction="row"
  justify="center"
  alignItems="center"
>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>

</Grid>
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.