`

div之float,clear特性

阅读更多

转自:http://hi.baidu.com/sqying/blog/item/cc0ce111771008c5a6ef3fb0.html

在写HTML代码的时候,发现在Firefox等符合W3C标准的浏览器中,如果有一个DIV作为外部容器,内部的DIV如果设置了float样式,则外部的容器DIV因为内部没有clear,导致不能被撑开。看下面的例子:

HTML4STRICT代码:

  1. <div style="width:200px;border:1px solid red;">
  2.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  3.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  4.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  5.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  6.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  7. </div>


显示的结果如下:

P_1160709253_0.gif
容器DIV没有被撑开

大家可以看到,作为外部容器的边框为红色的DIV,没有被撑开。这是因为内部的DIV因为float:left之后,就丢失了clear:both和display:block的样式,所以外部的DIV不会被撑开。
我们想让外部容器的DIV随着内部DIV增多而增加高度,要怎么解决呢?

以前我都是用这样的方法来解决:
HTML4STRICT代码:
  1. <div style="width:200px;border:1px solid red;">
  2.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  3.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  4.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  5.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  6.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  7.     <div style="clear:both;"></div>
  8. </div>


显示的结果如下:

P_1160709321_0.gif
显示正常了

我们看到,在容器DIV内要显示出来的float:left的所有的DIV之后,我们添加了这样的一个DIV:<div style="clear:both"></div>    。这样,其实就在最后增加了clear的动作。

但是,我总觉得,这么多加一个DIV有点不妥。一是多了一个没有意义的DIV,二是在用dojo做Drag & Drop的时候,由于这个DIV是容器DIV的一个字节点,如果这个节点被移动,则会造成排版上的Bug:如果要显示的蓝框的DIV被移到这个DIV之后,则因为clear:both,它会被强制换一行显示。所以,我一直在寻找更好的解决办法。

昨天在无数次的询问了Google大仙后,我终于找到了How To Clear Floats Without Structural Markup 这篇文章,找到了解决的办法。

首先设置这样的CSS:
CSS代码:
  1. .clearfix:after {
  2.     content".";
  3.     displayblock;
  4.     height0;
  5.     clearboth;
  6.     visibilityhidden;
  7. }


然后,我们再修改原来的HTML代码,让外部的容器DIV来使用这个CSS:
HTML4STRICT代码:
  1. <div style="width:200px;border:1px solid red;" class="clearfix">
  2.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  3.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  4.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  5.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  6.     <div style="float:left;width:80px;height:80px;border:1px solid blue;">TEST DIV</div>
  7. </div>


在Firefox里测试一下,哈哈,这样做的确很有效,显示正常,而且dojo的 Drag & Drop 也不会有问题了。原来,这个clearfix的CSS使用了after这个伪对象,它将在应用clearfix的元素的结尾添加content中的内容。在这里添加了一个句号".",并且把它的display设置成block;高度设为0;clear设为both;visibility设为隐藏。这样就达到了撑开容器的目的啦。

但是,在文章中说,Windows IE并不支持这样做。所以要让IE也完美显示,则必须在clearfix这个CSS定义的后面加上一些专门为IE设定的HACK。CSS如下:
CSS代码:
  1. .clearfix:after {
  2.     content".";
  3.     displayblock;
  4.     height0;
  5.     clearboth;
  6.     visibilityhidden;
  7. }
  8. /* Hides from IE-mac \*/
  9. * html .clearfix {height1%;}
  10. /* End hide from IE-mac */


因为转义字符"\",Mac IE浏览器会忽略掉这段Hack,但Windows IE不会,它会应用 * html .clearfix {height: 1%;} 来达到撑开DIV容器的目的(貌似Mac IE没有办法解决这个问题,不过幸好用户数量是在是太少了,Safari支持就可以了:p)。

测试一下,果然大功告成。

P_1160709321_0.gif

分享到:
评论

相关推荐

    div+css float 布局,适配手机

    在高洛峰老师的 `div+css` 视频教程中,他可能详细讲解了如何创建浮动布局,包括设置 `div` 的宽高、设置 `float` 属性、清理浮动(clear floats)以防止父元素高度塌陷,以及如何使用媒体查询进行响应式设计。...

    css1--关于float的div撑不起父div的问题

    然而,这种浮动特性可能会导致一些意料之外的结果,其中之一就是“父级元素无法被子元素完全撑开”,即父级`div`不会根据内部浮动`div`的大小自动调整其高度。 这个现象的原因在于,当元素浮动后,它会脱离常规文档...

    float样式对DIV的影响

    在网页设计中,`float`样式是一个至关重要的CSS属性,它对`div`元素的影响深远且多样。`float`最初是为图像布局设计的,但随着时间的发展,它成为了创建复杂网页布局的关键工具。本文将深入探讨`float`样式如何影响`...

    如何终止DIV的float属性简单实现

    终止 DIV 的 float 属性,在 css 里面定义一个样式 复制代码代码如下: .clear_float { clear: both; } 页面使用时加上一行 &lt;div class=clear_float&gt;&lt;/div&gt; 后面的 div 将不再 float。

    CSS教程:div设置float后高度不自动增加

    相关文章:https://www.jb51.net/css/divcss-4952.html ...额外标签法这种方法就是向父容器的末尾再插入一个额外的标签,并令其清除浮动(clear)以撑大父容器。这种方法浏览器兼容性好,没有什么问题,缺点就

    DIV设置 float以后使下一个DIV另起一行的方法

    在给定的描述和示例中,我们可以看到一个常见解决方案:在设置`float`的`DIV`与后续元素之间插入一个具有`clear`类的空`DIV`。这个`clear`类的`DIV`起到了清除浮动的作用,确保后续元素不会继续跟随前面浮动的元素,...

    子Div使用Float后撑开父Div的几种方法

    在浮动的子元素后面添加一个空的div,并设置其clear属性为both,这个div将强制自身不能紧贴前面的浮动元素,从而清除之前的浮动,达到撑开父元素的效果。这种方法虽然简单,但可能会增加额外的HTML标记,影响页面的...

    前端学习clear清除

    为了使新元素`div.c`不与`div.a`发生重叠,我们可以设置`clear:left`,这会使得`div.c`位于`div.a`的下方而不是旁边。具体实现如下: ```html &lt;div class="container" style="border: 1px solid green;"&gt; &lt;div ...

    CSS浮动属性Float详解 什么是CSS Float?

    空 div 方法是使用一个空的 div 元素来清除 Float,而 overflow 方法是使用 overflow 属性来扩展父元素以包含浮动。 Float 属性是 CSS 中非常重要的一部分,掌握 Float 属性可以帮助我们创建复杂的网页布局。但是,...

    div布局中float详解[收集].pdf

    2. 空div方法:在浮动元素后添加一个无内容的空div,并设置`clear: both`。 3. `overflow`方法:将父元素的`overflow`属性设置为`auto`或`hidden`,这会让父元素包裹其内部的浮动元素,但要注意可能会无意中触发滚动...

    详细说明了div怎么在div上实现浮动的代码

    要实现`div`在`div`上的浮动,你需要为相应的`div`元素添加`float`属性。以下是一些基本的CSS样式示例: ```css /* 创建一个左侧浮动的div */ .left-float { float: left; } /* 创建一个右侧浮动的div */ .right-...

    html div没有被撑开的原因及解决办法

    通过使用`lj_设置子dom的height 100%即可.png`、`必须清除子dom的float才能撑开父dom.txt`、`absolute存在的时候floate会失效.txt`、`css - div层为什么没有被自动撑开-.url`这些资源,你可以更深入地学习和实践这些...

    CSS-float详解.pdf

    通过本文档,我们将深入探讨`float`属性的基本概念、工作原理以及常见应用场景,帮助读者更好地理解和运用这一特性。 #### 二、CSS `float` 属性概述 ##### 2.1 基本概念 在HTML文档中,每个元素都有其默认的显示...

    通过float实现两个div不换行

    由于`div#row2`没有设置`float`属性,它会按照正常的文档流排列,但由于`div#row1`已经向左浮动,所以`div#row2`实际上是在`div#row1`的右侧,实现了两个`div`不换行的效果。 然而,`float`属性使用时需要注意以下...

    DIVCSS布局:CSS浮动float属性详解.doc

    浮动(float)属性是CSS布局中的一个关键特性,主要用于创建流式布局、多列布局以及解决元素定位问题。在传统表格布局中,我们依赖表格的对齐方式来组织内容,但在Web标准开发中,浮动属性成为了实现灵活布局的核心...

Global site tag (gtag.js) - Google Analytics