如何使一个div包裹两个浮动div里面?


76

我不知道这是否是常见问题,但到目前为止,我在网络上找不到解决方案。我想将两个div包裹在另一个div中,但是其中的两个div必须对齐同一级别(例如:左边一个包裹了wrapdDiv的20%宽度,右边一个包裹了80%的宽度)。为了达到这个目的,我使用了以下示例CSS。但是,现在换行DIV并没有将所有div换行。环绕Div的高度比其中包含的两个div的高度小。如何确定包装Div的高度是所包含div的最大高度?谢谢!!!

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
    <title>liquid test</title>
    <style type="text/css" media="screen">
        body
        {
            margin: 0;
            padding: 0;
            height:100%;
        }
        #nav
        {
            float: left;
            width: 25%;
            height: 150px;
            background-color: #999;
            margin-bottom: 10px;
        }

        #content
        {
            float: left;
            margin-left: 1%;
            width: 65%;
            height: 150px;
            background-color: #999;
            margin-bottom: 10px;
        }       
        #wrap
        {
          background-color:#DDD;
          height:100%;
        }

</style>
</head>
<body>
<div id="wrap">
    <h1>wrap1 </h1>
    <div id="nav"></div>
    <div id="content"><a href="index.htm">&lt; Back to article</a></div>
</div>
</body>
</html>

Answers:


73

当一个块中有两个浮点时,这是一个常见的问题。修复它的最佳方法是clear:both在第二个之后使用div

<div style="display: block; clear: both;"></div>

它应迫使容器达到正确的高度。


43
div已经是一个块元素,因此您可以将其从样式中删除。
mbillard

120

除了clear: bothhack之外,您还可以跳过多余的元素并overflow: hidden在包装上使用div

<div style="overflow: hidden;">
    <div style="float: left;"></div>
    <div style="float: left;"></div>
</div>

7
我最喜欢overflow:hidden方法。
西里尔·古普塔

9
我很高兴有人把它放在这里...当人们添加一个元素只是为了清除css问题的浮点数时,这让我发疯。
tybro0103 2010年

1
它适用于overflow:auto; 至。我认为这是带有溢出的hack,更优雅的“ hack”然后是div clear :)
Alex Dn 2012年

4
这有一些缺点,这个网站还建议.container { word-wrap: break-word; },并.container img { max-width: 100%; height: auto; }作大的内容表现良好。
科斯2012年

这似乎不适用于我有两个浮动div的body元素。即使溢出:隐藏,主体也不会占用内部元素的大小。我一直使用这种方法,不知道为什么它不起作用,请帮助!
A. Sallai 2013年

8

应该这样做:

<div id="wrap">
  <div id="nav"></div>
  <div id="content"></div>
  <div style="clear:both"></div>
</div>

8

overflow:hidden (如@Mikael S所提到的)并非在每种情况下都有效,但在大多数情况下都应该有效。

另一个选择是使用:after技巧:

<div class="wrapper">
  <div class="col"></div>
  <div class="col"></div>
</div>

.wrapper {
  min-height: 1px; /* Required for IE7 */
  }

.wrapper:after {
  clear: both;
  display: block;
  height: 0;
  overflow: hidden;
  visibility: hidden;
  content: ".";
  font-size: 0;
  }

.col {
  display: inline;
  float: left;
  }

对于IE6:

.wrapper { height: 1px; }

4

漂浮一切。

如果您有一个div非浮动内部的浮动对象div,那么一切都会变得很麻烦。这就是为什么大多数CSS框架(例如Blueprint和960.gs)都使用浮动容器和的原因divs

为了回答您的特定问题,

<div class="container">
<!--
.container {
  float: left;
  width: 100%;
}
-->
  <div class="sidebar">
  <!--
  .sidebar {
    float: left;
    width: 20%;
    height: auto;
  }
  -->
  </div>
  <div class="content">
  <!--
  .sidebar {
    float: left;
    width: 20%;
    height: auto;
  }
  -->
  </div>
</div>

只要您float:left;所有人都能正常工作<div>



2

这是另一个,我发现有帮助。它甚至也适用于自适应CSS设计。

#wrap
{
   display: table;
   table-layout: fixed; /* it'll enable the div to be responsive */
   width: 100%; /* as display table will shrink the div to content-wide */
}

警告:但是,此理论不适用于持有人具有绝对位置的内部元素的持有人。它将对固定宽度的布局产生问题。但是对于响应式设计,它非常出色。:)

除了Meep3D的答案

使用CSS3,可以在动态部分中通过以下方式将clear float添加到最后一个元素:

#wrap [class*='my-div-class']:last-of-type {
  display: block;
  clear: both;
}

您的div在哪里:

<div id="wrap">
<?php for( $i = 0; $i < 3; $i++ ) {
   <div class="my-div-class-<?php echo $i ?>>
      <p>content</p>
   </div> <!-- .my-div-class-<?php echo $i ?> -->
}
</div>

参考:


2

在这里,我向您展示解决问题的代码段(我知道,自您发布问题以来已经很久了,但是我认为这比“清除”修复程序更干净)

#nav
        {
            float: left;
            width: 25%;
            height: 150px;
            background-color: #999;
            margin-bottom: 10px;
        }

        #content
        {
            float: left;
            margin-left: 1%;
            width: 65%;
            height: 150px;
            background-color: #999;
            margin-bottom: 10px;
        }       
        #wrap
        {
          background-color:#DDD;
          overflow: hidden
        }
    <div id="wrap">
    <h1>wrap1 </h1>
    <div id="nav"></div>
    <div id="content"><a href="index.htm">&lt; Back to article</a></div>
    </div>


1

overflow:hidden为什么不简单地将固定高度(例如)设置height:500px为父分区,而不是使用hack呢?


1
<html>
<head>
    <style>
        #main { border: 1px #000 solid; width: 600px; height: 400px; margin: auto;}
        #one { width: 20%; height: 100%; background-color: blue; display: inline-block; }
        #two { width: 80%; height: 100%; background-color: red; display: inline-block; }
    </style>
</head>
<body>
<div id="main">
    <span id="one">one</span><span id="two">two</span>
</div>
</body>
</html>

秘密是inline-block。如果使用边框或边距,则可能需要减小使用它们的div的宽度。

注意:如果您使用“ DIV”而不是“ SPAN”,则在IE6 / 7中无法正常工作。(请参阅http://www.quirksmode.org/css/display.html


1

的HTML

<div id="wrapper">
    <div id="nav"></div>
    <div id="content"></div>      
    <div class="clearFloat"></div>
</div>

的CSS

.clearFloat {
    font-size: 0px;
    line-height: 0px;
    margin: 0px;
    padding: 0px;
    clear: both;
    height: 0px;
}
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.