使用CSS将Div分成2列


89

我一直在尝试使用CSS将div分为两列,但是我还没有设法使其正常工作。我的基本结构如下:

<div id="content">
  <div id="left">
     <div id="object1"></div>
     <div id="object2"></div>
  </div>

  <div id="right">
     <div id="object3"></div>
     <div id="object4"></div>
  </div>
</div>

如果我尝试将左右div浮动到各自的位置(左右),则似乎会忽略内容div的背景色。我从各种网站尝试过的其他代码似乎无法转换为我的结构。

谢谢你的帮助!


2
:有这么多的解决方案,你可以看到这个stackoverflow.com/questions/211383/...
enmaai

Answers:


60

当您浮动这两个div时,内容div会折叠为零高度。只需添加

<br style="clear:both;"/>

在#right div之后但在内容div中。这将迫使内容div包围两个内部浮动div。


16
不幸的是,这已经被否决了很多次。您应该真正避免不必要的标记,尤其是考虑到还有其他可行的,广泛使用的补救措施。
Jbird

89

这对我有用。我将屏幕分为两半:20%和80%:

<div style="width: 20%; float:left">
   #left content in here
</div>

<div style="width: 80%; float:right">
   #right content in there
</div>

3
如果这是您要做的一切,那么这些元素的父元素将没有高度。
tybro0103

简单有效。谢谢!
亚历克西斯·加玛拉2015年

47

另一种方法是将其添加overflow:hidden;到浮动元素的父元素中。

溢出:隐藏将使元素增长以适合浮动元素。

这样,就可以在CSS中完成所有工作,而不必添加另一个html元素。


1
我鼓励读者也查看我的其他答案。我认为实际上比这更好。
tybro0103

1
还有一点需要注意:overflow:auto;有时可能是一个更好的选择
tybro0103

这绝对是一种有效的手段。但是,值得一提的是,这可能会带来一些明显的布局挑战。例如,如果我希望我的父元素的溢出可见。
Jbird

16

最灵活的方法是:

#content::after {
  display:block;
  content:"";
  clear:both;
}

这与将元素追加到#content的行为完全相同:

<br style="clear:both;"/>

但实际上没有添加任何元素。:: after被称为伪元素。这比添加overflow:hidden;到#content 更好的唯一原因是,可以使绝对定位的子元素溢出并且仍然可见。同样,它将允许仍显示框阴影。


这也是一个很好的解决方案,但是值得一提的是,这在IE8中不起作用。成为这样的人真的让我很痛苦,我为成为“那个家伙”而表示歉意。
Jbird

@Jbird try #content:after(只是一个冒号而不是两个冒号)...如果我没记错的话,对伪元素使用两个冒号是更合适的,但是较旧的IE仅在有一个冒号的情况下才能识别它。...或类似的东西-自从我处理了这个问题已经有一段时间了。
tybro0103

10

给出的答案均未回答原始问题。

问题是如何使用CSS将div分为2列。

以上所有答案实际上将2个div嵌入到一个div中,以模拟2列。这是一个坏主意,因为您将无法以任何动态方式将内容流到2列中。

因此,代替上面的方法,使用CSS定义一个包含2列的单个div,如下所示...

.two-column-div {
 column-count: 2;
}

将上面的内容作为一个类分配给div,它实际上会将其内容流入2列。您可以走得更远,也可以定义边距之间的差距。根据div的内容,您可能需要弄乱单词break值,以使内容不会在列之间被分割。


9

无论出于什么原因,我都不喜欢清除方法,我依赖于浮点数和百分比宽度来进行此类操作。

这是一些在简单情况下有效的方法:

#content { 
  overflow:auto; 
  width: 600px; 
  background: gray; 
} 

#left, #right { 
  width: 40%; 
  margin:5px; 
  padding: 1em; 
  background: white; 
} 

#left  { float:left;  }
#right { float:right; } 

如果您将一些内容放入其中,则会看到它起作用:

<div id="content">
  <div id="left">
     <div id="object1">some stuff</div>
     <div id="object2">some more stuff</div>
  </div>

  <div id="right">
     <div id="object3">unas cosas</div>
     <div id="object4">mas cosas para ti</div>
  </div>
</div>

您可以在这里看到它:http : //cssdesk.com/d64uy


8

使儿童div inline-block并排放置:

#content {
   width: 500px;
   height: 500px;
}

#left, #right {
    display: inline-block;
    width: 45%;
    height: 100%;
}

观看演示


我也更喜欢这种方法而不是float。有时需要设置一个:vertical-align:top;(或底部等)大小不相同的左侧和右侧元素。
james 2016年

4

我知道这篇文章很旧,但是如果你们中有人还在寻找更简单的解决方案。

#container .left,
#container .right {
    display: inline-block;
}

#container .left {
    width: 20%;
    float: left;
}
#container .right {
    width: 80%;
    float: right;
}

3

垂直划分div的最佳方法-

#parent {
    margin: 0;
    width: 100%;
}
.left {
    float: left;
    width: 60%;
}
.right {
    overflow: hidden;
    width: 40%;
}

3

您可以使用flexbox来控制div元素的布局:

* { box-sizing: border-box; }

#content {
  background-color: rgba(210, 210, 210, 0.5);
  border: 1px solid #000;
  padding: 0.5rem;
  display: flex;
}

#left,
#right {
  background-color: rgba(10, 10, 10, 0.5);
  border: 1px solid #fff;
  padding: 0.5rem;
  flex-grow: 1;
  color: #fff;
}
<div id="content">
  <div id="left">
     <div id="object1">lorem ipsum</div>
     <div id="object2">dolor site amet</div>
  </div>

  <div id="right">
     <div id="object3">lorem ipsum</div>
     <div id="object4">dolor site amet</div>
  </div>
</div>


1
在无数类似的尝试中,我发现到目前为止(最好),它一直有效。我发现(并尝试过)的所有其他内容都使内容溢出。非常感谢。
user12379095

1

浮动不影响流程。我倾向于做的是添加一个

<p class="extro" style="clear: both">possibly some content</p>

在“包装div”的末尾(在这种情况下为内容)。我可以说出可能需要这样一段来从语义上证明这一点。另一种方法是使用clearfix CSS:

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

#content {
  display: inline-block;
}
/*  \*/
* html #content {
  height: 1%;
}

#content {
  display: block;
}
/*  */

带有注释的技巧是为了实现跨浏览器兼容性。


0

这是最好的在这里得到解答的问题211383

如今,任何自重的人都应使用规定的“ micro-clearfix”清除浮标的方法。


0
  1. 使父DIV中的字体大小等于零。
  2. 为每个子DIV设置宽度%。

    #content {
        font-size: 0;
    }
    
    #content > div {
        font-size: 16px;
        width: 50%;
    }

*在Safari中,您可能需要设置49%才能使其正常运行。


尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。
msrd0

0

将分隔分为两列非常容易,如果您将其放置(例如width:50%)并为左列设置float:left,为右列设置float:right,则只需指定列的宽度即可。


请添加带有相关标签的更多信息。
阿曼·加格

希望这段代码可以帮助您更好地理解它; @AmanGarg CSS:#column { overflow:auto; width: 100%; } #column50pleft, #column50pright{ width: 49%; margin:2px; padding: 0.5%; background: white; } #column50pleft { float:left; } #column50pright { float:right; } HTML: <div id="column"> <div id="column50pleft"> </div> <div id="column50pright"> </div> </div>
Rashid Jorvee '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.