浮动的特点

 
浮动(float)属性提出的作用是实现文字的环绕效果,一个元素浮动后,会脱离普通流。主要的特点如下:
  1. 浮动的元素会向左或者向右移动直到它的外边缘接触容器框(containing block)的边缘或者另外一个浮动元素的外边缘,因此浮动元素是不会浮动到中间的。
  2. 如果没有足够的水平空间让浮动元素占据,浮动元素将向下移动,直到下方空间足够容纳或者下方已经没有浮动元素。
  3. 因为浮动已经脱离普通流,所以非定位的非浮动块级元素会表现得浮动元素没有存在一样,但是inline box元素(包括普通inline box元素、块级元素内的inline box元素、浮动元素中的inline元素)依然会为浮动元素让出空间,但当浮动元素的外高度(包括margin和border)为0时,inline box元素则不会让出空间。
  4. 浮动元素的margins不会和相邻元素的重叠(collapse)。
  5. 根元素<html>不能浮动。
  6. 一个行内元素(inline element)或者一个块级元素(block element)浮动后同样会表现得和行内块级元素相似,可以设置高度和宽度,不设置时默认表现和行内元素一样,浮动元素内的容器框(containing block)会水平排列,可能会挤占相邻的浮动元素外的空间(故会有人建议应该为浮动元素设置宽度,图片等一些隐含宽度的元素则另外考虑),元素不再占领一行等等。
-----------------------------------------------------------举个栗子-----------------------------------------------------------
对应特点3
HTML:
 <div class="container">
<div class="floatdiv">--浮动div--</div>
<div class="floatdiv">..浮动div..</div>
<div class="nofloatdiv">(不浮动div)</div>
</div>

CSS:

 .container {
border: 1px solid #000;
}
.floatdiv {
background-color: #ccc;
float: left;
}
.nofloatdiv {
background-color: #aaa;
}
表现如下:
(图1.1)
但是给浮动元素加上属性height:0后chrome,Firefox,opera,IE8+表现如下,inline box中的文字都重叠在了一起:
(图1.2)
IE7的表现如下,只有未浮动的元素内的inline元素和浮动元素内的inline元素重合:
IE6表现如下,依然不重合:
IE6和IE7的表现和hasLayout有关,这里不做讨论。另外,需要注意的是,这个高度是指float元素的外高度,即包括border和margin,只要任意一个属性使得浮动元素的外高度不为0,则inline元素都会让出空间,这个特性了解就好了,似乎没有什么应用,也很少人会在这里犯错误。
 
对应特点2
浮动元素的排列有个有趣的现象,见例子:
HTML:
 <div class="container">
<div class="floatdiv_1">浮动div.1</div>
<div class="floatdiv_2">浮动div.2</div>
<div class="floatdiv_3">浮动div.3</div>
</div>
CSS:
 .container {
border: 1px solid #000;
width: 400px;
overflow: hidden;
*zoom:;/*兼容IE6,IE7*/
}
.floatdiv_1 {
background-color: #999;
float: left;
height: 50px;
width: 150px;
}
.floatdiv_2 {
background-color: #bbb;
float: left;
height: 30px;
width: 150px;
}
.floatdiv_3 {
background-color: #ddd;
float: left;
height: 30px;
width: 150px;
}
各版本浏览器均表现如下:
div.floatdiv_3不会另起一行,而是卡在了div.floatdiv_1右边。
-----------------------------------------------------------吃完栗子-----------------------------------------------------------
 
浮动特点引起的一些问题与解决方法
 
1、浮动元素与块级元素重叠
当一个非定位的非浮动块级元素元素挨着一个浮动元素时,参照浮动特点3:非定位的非浮动块级元素会表现得浮动元素没有存在一样。故这个块级元素不会为浮动元素让出空间,沿用上一个例子未修改前的代码,用chrome检查元素可以看出 div.nofloatdiv 占据了浮动元素占据的空间,但是 div.nofloatdiv 内的inline box元素依然为浮动元素让出了空间:
但是有时候我们希望div.nofloatdiv 不要和浮动元素重合,那么只要把 div.nofloatdiv BFC化就可以了,BFC方法不止一种,具体参照:CSS定位与布局:普通流。这里举用得比较多的一种,修改div.nofloatdiv的CSS如下:
 .container {
border: 1px solid #000;
overflow: hidden;
*zoom:;/*兼容IE6,IE7*/
}
表现如下:
在IE6中,浮动元素旁边获得hasLayout属性(*zoom:1)的元素会和浮动元素之间有3px的间隙,这是IE6的一个bug(The IE6 Three Pixel Text-Jog),表现如下:
 
2、未BFC化的外容器框不计算浮动元素的高度
当未BFC化的容器框中含有浮动元素时,容器框是不计算浮动元素的高度的。很多文章会把这个特点叫做浮动元素使父元素高度为0,甚至会有人认为这是bug,这当然不是bug,要是bug那些先进的浏览器早就fix了,而至于前一种说法感觉不是很严谨,因为如果容器框中有其他非浮动元素时,容器框的高度是会自动加上非浮动元素的高度,当然也就不为0了。这里看一下例子就清楚了:
HTML:
 <div class="container">
<div class="floatdiv">浮动div</div>
<div class="nofloatdiv">不浮动div</div>
</div>
CSS:
 .container {
border: 1px solid #000;
width: 400px;
}
.floatdiv {
background-color: #ccc;
float: left;
height: 50px;
}
.nofloatdiv {
background-color: #aaa;
}
chrome,Firefox,opera,IE8+表现如下,浮动元素溢出了外容器框:
IE6,IE7表现如下,能够包裹浮动元素的原因是width属性触发了外容器框的hasLayout属性:
往往我们是希望外容器框能够包裹住浮动元素的,那么解决的方法也很简单,那就是将外容器框BFC化,即在div.container上加属性:
 .container {
border: 1px solid #000;
width:400px;
overflow: hidden;
*zoom:;
}
各浏览器均表现如下。在这个例子中这里的*zoom:1本来是用来触发IE6,IE7下元素的hasLayout属性,但由于width的存在,这个属性便没有作用了。但是在没有设置width的情况下,就需要这个属性对IE6和IE7进行hack,所以在这里还是加上:
注:
1)除了利用BFC外,清除浮动也可以解决这个问题,这在下面会讲到。
2)这个特性其实在宽度的表现上也是一样的,当浮动元素的宽度大于外容器框时,容器框不会去包裹浮动元素,浮动元素宽度会溢出容器框。解决的方法也一样,不赘述。
 
3、清除浮动
有时候我们希望利用浮动向左或者向右移动的性质来创建两栏布局或者三栏布局,此时我们不希望有额外的行内元素环绕浮动元素,这个时候就要用到清除浮动。
 
-----------------------------------------------------------举个栗子-----------------------------------------------------------
HTML:
 <div class="container">
<div class="floatdivLeft">左浮动div</div>
<div class="floatdivRight">右浮动div</div>
<div class="footdiv">页脚</div>
</div>
CSS:
 .container {
border: 1px solid #000;
text-align: center;
width: 404px;
overflow: hidden;
*zoom:;/*兼容IE6,IE7*/
}
.floatdivLeft {
border: 1px solid #000;
float: left;
width: 100px;
height: 100px;
}
.floatdivRight {
border: 1px solid #000;
float: right;
width: 300px;
height: 100px;
}
.footdiv {
background-color: #eee;
height: 50px;
}
在chrome,Firefox,opera,IE8+表现如下,此时div.footdiv作为页脚元素并没有按我们的想法出现在最下方,而是和浮动元素重叠了,此时就需要用清除浮动:
而IE6,IE7的表现却是这样的,因为height属性触发了div.footdiv的hasLayout属性:
修改div.footdiv的CSS如下:
 .footdiv {
background-color: #eee;
height: 50px;
clear: both;
}
chrome,Firefox,opera,IE6+表现如下(IE6,IE7表现不变),clear:both清除了浮动:
 
知道了清除浮动的原因,接下来介绍清除浮动的几个方法,同样沿用这个例子:
1)设置clear:both,除了上面例子直接在div.footdiv上设置clear:both属性外,一般是通过设置一个div来清除浮动:
HTML:
 <div class="container">
<div class="floatdivLeft">左浮动div</div>
<div class="floatdivRight">右浮动div</div>
<div class="clearfix"></div>
<div class="footdiv">页脚</div>
</div>
CSS其他不变,添加一个CSS类:
 .clearfix {
clear: both;
}
注:
1、当只有左浮动时候,可以设置为clear:left;当只有右浮动的时候,可以设置为clear:right;
2、这个方法添加了一个无语义的div标签,不利于页面语义化;
 
2)除了上面那种方法外,HTML不变,.clearfix可以通过加一个:after伪元素来清除浮动:
 .clearfix:after {
content: ".";
display: block;
height:;
clear: both;
visibility: hidden;
}
但是:after伪元素在IE6、IE7中无法被识别,所以需要hack,其实也是触发hasLayout属性,方法如下:
 .clearfix{
*display: inline-block;
}
或者:
 .clearfix{
*zoom:;
}
-----------------------------------------------------------吃完栗子-----------------------------------------------------------
 
 
浮动向左或向右停靠的特点使得它在网页布局上有很多的应用,比如两栏或三栏布局等等,具体可以参考:
除此之外,国外还有个特别牛的网站里面有专门介绍float特点以及应用的地方,看完精通float属性没有问题:Floatutorial
 
本文参考:
Max Design . Floatutorial
Eric A. Meyer . Containing Floats
 
感谢博主
 
水平有限,错误欢迎指正。原创博文,转载请注明出处。

CSS定位与布局:浮动的更多相关文章

  1. CSS定位与布局:普通流

    CSS定位与布局属于CSS的基础,也是CSS布局影响很大的一部分,具体主要包括三种定位与布局机制( Positioning schemes):普通流,浮动,绝对定位. 其实除了这三种之外,还有一些定位 ...

  2. web前端css定位position和浮动float

    最近做了几个项目:配资公司,ecmal商城等,客户对前台要求都很高.所以,今天来谈谈css的基础,以及核心,定位问题. div.h1或p元素常常被称为块级元素.这意味着这些元素显示为一块内容,即“块框 ...

  3. CSS定位机制之浮动定位float

    一.浮动定位实现的效果 二.使用float实现浮动定位 三.使用clear属性清除浮动定位 四.浮动定位的应用(布局) 一.浮动定位实现的效果   (一).块元素(div)在文档流中默认垂直排列,如果 ...

  4. CSS定位与布局

    我们在编写网页代码时,首先应该做的就是设计好页面的布局形式,然后再往里面填充内容.网页布局的好与坏,直接决定了网页最终的展示效果.PC端常见的网页布局形式有两列布局.三列布局等.在CSS中,我们通常使 ...

  5. CSS定位机制:浮动 float及清除浮动的常用方法

    CSS的定位机制 1.普通流(标准流) 默认状态,元素自动从左往右,从上往下排列 块元素的特征: 独占一行 可以设置宽高 如果不设置宽度,宽度默认为容器的100% 常见的块元素:div p h1-h6 ...

  6. CSS易混淆知识点总结与分享-定位与布局

    CSS定位有四种模式:static.relative.absolute.fixed,其它static是默认值,下面分别讲解下各自的特点: static:静态定位,处于动态布局流中,按照页面中的各元素先 ...

  7. CSS定位(CSS定位概述、相对定位、绝对定位、浮动)

    CSS 定位属性 CSS 定位属性允许你对元素进行定位. 属性 描述 position 把元素放置到一个静态的.相对的.绝对的.或固定的位置中. top 定义了一个定位元素的上外边距边界与其包含块上边 ...

  8. CSS定位——浮动定位

    CSS定位机制Ⅱ——浮动定位 float属性:进行浮动定位   left,right clear属性:清除浮动   left,right,both  ㈠  float属性 1.概述 ⑴div实现横向多 ...

  9. CSS定位布局

    CSS定位布局 基础知识 在CSS布局中,定位布局也是一种非常常见的技术手段,我们以京东为例: 上面是非常好的例子,对于定位布局来说它可以将一个元素放在页面上的任意一个位置. 但是定位布局也不能滥用, ...

随机推荐

  1. v-model 的修饰符

    1..trim 自动过滤输入内容最开始 和 最后的 空格,中间的会保留一个空格,多的会被过滤掉 2..lazy 一般情况下,在input的 v-model是一直在同步 输入的内容与显示的内容,不过再添 ...

  2. 关于spark入门报错 java.io.FileNotFoundException: File file:/home/dummy/spark_log/file1.txt does not exist

    不想看废话的可以直接拉到最底看总结 废话开始: master: master主机存在文件,却报 执行spark-shell语句:  ./spark-shell  --master spark://ma ...

  3. C#实现eval 进行四则运算(有码)

    在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~ 在这里为大家封装了一个C#版本的eval函数,具体的设计参考了<大 ...

  4. Leetcode 488.祖玛游戏

    祖玛游戏 回忆一下祖玛游戏.现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W). 现在你手里也有几个球. 每一次,你可以从手里的球选一个,然后把这个球插入到一串球中 ...

  5. [oldboy-django][2深入django]分页功能

    1 django自带分页 1.1 分页模板 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  6. 学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符的嵌套来完成此题:C表示。

    # -*- coding: utf8 -*- # Author:wxq #python 2.7 #题目:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符 ...

  7. maven学习(十三)——eclipse整合maven插件

    一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenProject/Maven2EclipsePlugin

  8. 【转】网页游戏能用PHP做后端开发吗? PHP Libevent扩展安装及应用

    网页游戏能用PHP做后端开发吗? 当然可以.最好走HTTP,也可以做网络编程,而且写代码超简单,1个函数就可以建一个服务器端.stream_socket_server()多线程不是什么好主意,你可以用 ...

  9. iOS开发UI篇—CALayer

      一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UIView之所以能显示在屏幕上,完全 ...

  10. input[type="radio"]自定义样式

    input为radio时,虽然会有默认选中的样式,但是并不符合大多数项目的需求,我们的目标是可以随心所欲自定义它的样式.怎么做呢?其实很简单,只要抓住3点.分别是1.label 2.隐藏自带样式 3. ...