一、前言

  浮动元素以脱离标准流的方式来实现元素的向左或向右浮动,并且浮动元素还是在原来的行上进行浮动的。float浮动属性的四个参数:left:元素向左浮动;right:元素向右浮动;none:默认值,元素不浮动;inherit:继承父元素的float属性值。

举两个栗子

父元素是否注意到自己有个浮动的子div呢?

<div style="width: 400px; height: auto; border: 2px solid black;">
<div style="width: 50px; height: 100px; background-color: green; float: right;"></div>
我才不知道有没有浮动框,我只显示文字的高度
</div>

从中我们可以发现,处于标准流中的父div并不知道浮动元素的存在,而浮动元素却知道它父元素的边界,它一直向右浮动直到撞到了父框的右边界为止。

<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: right;">
框二
</div>
</div>

我们发现框二并没有跑到框一这一行的右侧去,而浮动到了原来这行的的右侧。

下面我们一起逐步学习CSS中的浮动属性float。

二、浮动之于文本

CSS参考手册上对float的说明:

  float 属性定义元素在哪个方向浮动。以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动。浮动元素会生成一个块级框,而不论它本身是何种元素。

  如果浮动非替换元素,则要指定一个明确的宽度;否则,它们会尽可能地窄。

1.实现文本环绕图像

  浮动框虽然脱离了标准流,但标准流中的文本依旧会做相应的移动,为浮动框留出空间。浮动框旁边的行框被缩短,从而给浮动框留出空间,行框围绕浮动框。

  因此,创建浮动框可以使文本围绕图像:

举两个小栗子

<div style="width: 350px; background-color: #33FFFF;">
<img src="http://h5ip.cn/ge0w" style="width: 100px; height: 100px; float: right;">
<span>
路飞性格积极乐观,爱憎分明,而且十分重视伙伴,不甘屈居于他人之下,对任何危险的事物都超感兴趣。和其他传统的海贼所不同的是,他并不会为了追求财富而杀戮,而是享受着身为海贼的冒险和自由
</span>
</div>
<span>虽然我先写于浮动元素,但还是被挤到了右边。。。</span>
<div style="width: 100px; height: 100px; background: blue; float: left;"></div>

2.任何元素浮动后都将生成块级框

  首先应当注意块级框不等同于块状元素,块级元素会独占一行而块级框却不会,浮动元素产生的效果类似于行内块元素。对行内非替换元素设置width和height是无效的,但生成浮动元素之后width和height将有效,并且不会单独占一行,所以说它类似于行内块元素。

<span style="width: 100px; height: 50px; background-color: #6699FF;">
不浮动的span
</span>
<span style="width: 100px; height: 50px; background-color: #33FFFF; float: left;">
浮动的span
</span>

三、浮动之于块

  浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

不浮动的div为块级元素,各自独占一行

<!-- 不浮动 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue;">
框三
</div>
</div>
<!-- 框一右浮 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: right;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue;">
框三
</div>
</div>

当框 1 向左浮动时,它脱离文档流并且向左移动,直到它的左边缘碰到包含框的左边缘。因为它不再处于文档流中,所以它不占据空间,实际上覆盖住了框 2,使框 2 从视图中消失。

<!-- 框一左浮,覆盖框二 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue;">
框三
</div>
</div>

如果把所有三个框都向左移动,那么框 1 向左浮动直到碰到包含框,另外两个框向左浮动直到碰到前一个浮动框,这时父框的高度为0

<!-- 三框左浮 -->
<div style="width: 240px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: left;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue; float: left;">
框三
</div>
</div>  

如果包含框太窄,无法容纳水平排列的三个浮动元素,那么其它浮动块向下移动,直到有足够的空间。

<!-- 三框左浮,父框太窄 -->
<div style="width: 200px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 80px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: left;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue; float: left;">
框三
</div>
</div>

如果浮动元素的高度不同,那么当它们向下移动时可能被其它浮动元素“卡住”

<!-- 三框左浮,框一卡框三 -->
<div style="width: 200px; height: auto; border: solid 1px black;">
<div style="width: 80px; height: 100px; background-color: red; float: left;">
框一
</div>
<div style="width: 80px; height: 80px; background-color: green; float: left;">
框二
</div>
<div style="width: 80px; height: 80px; background-color: blue; float: left;">
框三
</div>
</div>

四、浮动的副作用及处理

  通过上面的介绍可以总结出浮动的两个副作用:1.页面塌陷,也就是子元素不能将父元素撑开;2.元素覆盖,浮动元素不在标准流中因此可能会覆盖标准流中的元素。四种解决方案如下:

1.手动给父元素添加高度

  这种方法用来解决父元素的页面塌陷问题,应当注意的是,为保证父框的高度等于最高浮动元素的高度应当充分考虑浮动元素的边框以及内外边距。

<!-- 对于有边框的浮动子元素,父元素的height = 子元素的height + 2*子元素的边框大小 -->
<div style="width: 300px; height: 52px; border: solid 1px black;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
</div>  

这种方式治标不治本,当浮动子元素增加时,页面塌陷问题重现

2.通过clear属性清除内部和外部浮动

  clear 属性规定元素的哪一侧不允许其他浮动元素。clear属性的四个参数:none(默认值)、left、right、both;如果声明为左边或右边清除,会使元素的上外边框边界刚好在该边上浮动元素的下外边距边界之下。

  none:允许两边都可以有浮动对象;left:不允许左边有浮动对象;right:不允许右边有浮动对象;both:不允许有浮动对象。

添加clear属性之前
<!-- 如果后一个div未添加clear属性,它将被红色div覆盖 -->
<div style="width: 300px; height: auto; border: solid 1px black; clear: both;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; border: solid 1px #FFF; clear: left; "></div>
</div> 添加之后
添加clear前
<!-- 在最后增加一个具有clear属性的空div -->
<div style="width: 300px; height: auto; border: solid 1px black; clear: both;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
<div style=" clear: both;"></div>
</div> 添加之后
 

3.给父元素添加overflow属性并结合zoom:1使用

<!-- 使用overfloat和zoom代替clear -->
<div style="width: 300px; height: auto; border: solid 1px black; clear: both; overflow: hidden; zoom: 1;">
<div style="width: 80px; height: 50px; background-color: red; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: green; float: left; border: solid 1px #FFF;"></div>
<div style="width: 80px; height: 50px; background-color: blue; float: left; border: solid 1px #FFF;"></div>
</div>

overflow属性是用来修剪溢出的元素,所以使用此种方案会使溢出元素被截掉

使用overflow前
<div style="width: 300px; height: auto; border: solid 1px black; clear: both; padding: 5px; overflow: hidden;">
<div style="width: 500px; height: 50px; background-color: red; border: solid 1px #FFF; float: left;"></div>
</div>
使用后

zoom是IE浏览器专用的属性,通过子元素的高度来设置父元素的高度,添加该属性用来兼容IE浏览器

4.给父元素添加浮动

  这是一种”以毒攻毒“的方法,因为父元素浮动后虽然消除了浮动子元素对其的影响,但父元素下面的元素就可能就会受该浮动父元素的影响。

<div style="width: 300px; height: auto; border: solid 1px black; clear: both; float: left;">
  <div style="width: 100px; height: 50px; background-color: red; float: left;"></div>
</div>
<div style="width: 200px; height: 100px; background-color: blue;"></div>

这四种常用的清除浮动解决办法可以根据实际情况进行使用,当然还有一些也比较好的解决办法,例如使用before伪类清除浮动,等进一步学习之后再补充。

五、最后

  感谢博主谦行的博客:CSS布局 ——从display,position, float属性谈起以及W3School提供的学习资料!所学不深,如有错误或不足之处还望留言指出,十分感谢!

【CSS学习】--- float浮动属性的更多相关文章

  1. [转] CSS float 浮动属性

    http://www.cnblogs.com/polk6/p/3142187.html CSS float 浮动属性 本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式: ...

  2. 给li设置float浮动属性之后,无法撑开外层ul的问题。

    最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style="clear:both"></div>解决了,但自己不是特别明白,又在网上查 ...

  3. 给li设置float浮动属性之后,无法撑开外层ul的问题。(原址:http://www.cnblogs.com/cielzhao/p/5781462.html)

    最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style="clear:both"></div>解决了,但自己不是特别明白,又在网上查 ...

  4. CSS清除float浮动

    一.浮动产生原因   -   TOP 一般浮动是什么情况呢?一般是一个盒子里使用了CSS float浮动属性,导致父级对象盒子不能被撑开,这样CSS float浮动就产生了. 本来两个黑色对象盒子是在 ...

  5. [Web前端] 给li设置float浮动属性之后,无法撑开外层ul的问题。

    cp from : https://www.cnblogs.com/cielzhao/p/5781462.html 最近在项目中有好几次遇到这个问题,感觉是浮动引起的,虽然用<div style ...

  6. CSS float 浮动属性

    本篇主要介绍float属性:定义元素朝哪个方向浮动. 目录: 1. 页面布局方式:介绍文档流.浮动层以及float属性. 2. float:left :介绍float为 left 时的布局方式. 3. ...

  7. CSS基础之浮动属性float图文详解

      宏观地讲,我们的web页面的制作,是个“流”,必须从上而下,像“织毛衣”.   标准流里面的限制非常多,导致很多页面效果无法实现.如果我们现在就要并排.并且就要设置宽高,那该怎么办呢?办法是:超脱 ...

  8. css之float(浮动)的特性

    详解CSS float属性  float本身不脱离文档流,但是和 position:absolute;搭配使用会脱离文档流 阅读目录 基础知识 float的详细细节 float特殊情况 clear属性 ...

  9. CSS学习之浮动

    首先要知道,div是块级元素,在页面中独占一行,自上而下排列,也就是传说中的流.如下图: 可以看出,即使div1的宽度很小,页面中一行可以容下div1和div2,div2也不会排在div1后边,因为d ...

随机推荐

  1. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  2. 死磕 java集合之PriorityQueue源码分析

    问题 (1)什么是优先级队列? (2)怎么实现一个优先级队列? (3)PriorityQueue是线程安全的吗? (4)PriorityQueue就有序的吗? 简介 优先级队列,是0个或多个元素的集合 ...

  3. 强化学习(十七) 基于模型的强化学习与Dyna算法框架

    在前面我们讨论了基于价值的强化学习(Value Based RL)和基于策略的强化学习模型(Policy Based RL),本篇我们讨论最后一种强化学习流派,基于模型的强化学习(Model Base ...

  4. asp.net Core 中AuthorizationHandler 实现自定义授权

    前言 ASP.NET Core 中 继承的是AuthorizationHandler ,而ASP.NET Framework 中继承的是AuthorizeAttribute. 它们都是用过重写里面的方 ...

  5. Win10下搭建Git服务器

    一. 搭建Git服务器环境前的必要准备 1.Windows10 2.Java环境 3.GitBlit服务器 4.Git版本管理工具 二. 开始搭建 第一步.安装JAVA运行环境 https://www ...

  6. Java实现文本编辑时基于拼音输入的补全原型

    续前文Java实现"命令式"简易文本编辑器原型. 效果如下: 所在源码库同上文, 尚未和上文的编辑器右侧的命令区集成. 代码由How to show autocomplete as ...

  7. Docker 创建 Crowd3.3.2 以及打通 Jira Software7.12.3和Confluence6.12.2 SSO 单点登录

    目录 目录 1.介绍 1.1.什么是Crowd? 2.Crowd 的官网在哪里? 3.如何下载安装? 4.对 Crowd 进行配置 4.1.破解 Crowd 第一步 4.2.破解 Crowd 第二步, ...

  8. Leetcode 136.只出现一次的数字 By Python

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  9. for in 使用

    // JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写. var json = { "id": 1, "n ...

  10. Java相关面试题总结+答案(一)

    [Java基础] 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,即Java开发工具包,提供了Java 的开发环境和运行环境. JRE:Java Ru ...