对于咱们全部的web前端开发人员,float是或者曾经一度是你最熟悉的陌生人——你离不开它,却成天承受着它所带给你的各类痛苦,你觉得它很简单就那么一点知识,但却驾驭不了它各类奇怪的现象。css
这就是咱们又爱又恨的——float。因此,系统的学一学float是很是很是重要的。除了看书和看博客文章以外,我推荐你们去看一个奇葩(声音颇有磁性,你懂得)录制的教程《CSS深刻理解之float浮动》,讲的很好很透彻。html
既然提到“误用”,各位看官就此想一想,本身平日是怎么使用float的?另外,既然“误用”加了引号,就说明这样的使用并非真正的误用,而是误打误撞使用以后,带来了真正的效果。前端
这样一问你们,我想绝大多数用float都是为了——横向排版、或者多列布局。这样的使用是正确的,大部分人都这样使用,bootstrap的栅格系统也是使用了float来实现的,而且在css3被普及以前,多列布局的最佳解决方案也是使用float——要否则你就用table。css3
可是,这样使用确实是对float的一种误解和“误用”,由于float被设计出来的初衷是用于——文字环绕效果。即,一个图片一段文字,图片float:left以后,文字会环绕图片。git
可是,当时的多列布局和横向排版主要是依靠table实现,后来人们见见的发现,使用table将致使代码量大、混乱、不利于SEO,而后发现float+div是一个很不错的排版解决方案,因而乎——过去几年“css+div”页面排版一直是一个热门话题,也是各类高大上的面试题必考的一项。github
初学float的同窗,你若是没有从最基础的知识入手,而是从网络的零散以后或者同事同窗的零散代码学起的话,你可能只知道float是用来排版的,可是你殊不知道float的许多个特性,这就致使了你在使用float时的许多问题。不信请看下文。web
首先你们来看两个demo,以下图。第一个demo是一个简单不过的例子,显示效果也很正常。第二个demo,惟一的区别就在于<img>加了float:left,上层的<div>却出现了“坍塌”现象。面试
不过,这就是float的“破坏性”——float破坏了父标签的本来结构,使得父标签出现了坍塌现象。致使这一现象的最根本缘由在于:被设置了float的元素会脱离文档流。json
初次接触“脱离文档流”的朋友能够这样理解:div是父亲,img是它的儿子,本来好好的父子关系,本来爷俩能够体面的展现一个包含关系的效果。直到有一天,img被设置了float。老天爷(浏览器)规定,任何float元素都不容许再呆在本身的家族中,因而img被逐出家门,断绝和div父子关系。因而乎,div没有了img儿子,也就不能再展现这种父子的包含关系,因而二者就各过各的,互不相干。——这样一说,容易理解了吧?bootstrap
可是,永远都不要忘记float被设计的初衷——实现文字环绕效果。当div中有文字时,文字仍是会环绕在img周围的。以下图:
好了,你们如今已经知道了float具备破坏性,可能也有不少朋友以前就知道这一特性,可是你有没有思考一下:float为何会被设计成具备破坏性,为何会脱离文档流?这一点很是重要!其实缘由很是简单——为了要实现文字的环绕效果?
有人可能会问:啊?你刚才不是说了float的初衷就是实现文字环绕效果吗?和破坏性有啥关系?
这时我会反问你:若是float不让父元素坍塌,能实现文字环绕效果吗?给你两个图看看你就知道了。看不明白的能够给我留言讨论。
“包裹性”也是float的一个很是重要的特性,你们用float时必定要熟知这一特性。我们仍是先从一个小例子看起:
如上图,普通的div若是没有设置宽度,它会撑满整个屏幕,在以前的盒子模式那一节也讲到过。而若是给div增长float:left以后,它忽然变得紧凑了,宽度发生了变化,把内容“王福朋”三个字包裹了——这就是包裹性。div设置了float以后,其宽度会自动调整为包裹住内容宽度,而不是撑满整个父容器。
注意,此时div虽然体现了包裹性,可是它的display样式是没有变化的,仍是block。
说道这里我们回顾一下,在以前的博客中,也提到了“包裹性”,是哪些样式?你能够在此思考一下,我会在博客的评论中给出答案 。
知道了包裹性以后,咱们仍是继续思考:float为何要具备包裹性?其实答案还得从float的设计初衷来寻找,float是被设计用于实现文字环绕效果的。文字环绕图片比较好理解,可是若是想要让文字环绕一个div呢?此时div不被“包裹”起来,那么如何去实现环绕效果?
道理很简单,你也多是那种一点即通的聪明人,可是关键在于思考。
float还有一个你们可能不是很熟悉的特性——清空格。按照管理,咱仍是先举例子说明。
上图中。第一个例子,正常的img中间是会有空格的,由于多个<img>标签会有换行,而浏览器识别换行为空格,这也是很正常的。第二个例子中,img增长了float:left的样式,这就使得img之间没有了空格,四个img牢牢挨着。
若是你们以前没注意,如今想一想以前写过的程序,是否是有这个特性。为何float适合用于网页排版(俗称“砌砖头”)?就是由于float排版出来的网页严丝合缝,中间连个苍蝇都飞不进去。
“清空格”这一特性的根本缘由是因为float会致使节点脱离文档流结构。它都不属于文档流结构了,那么它身边的什么换行、空格就都和它不要紧的,它就尽可能的往一边去靠拢,能靠多近就靠多近,这就是清空格的本质。
(float内容比较多,我们分上、下两篇来介绍,这是上篇。下篇将立刻发出,敬请期待)
---------------------------------------------------------------
本系列的目录页面:http://www.cnblogs.com/wangfupeng1988/p/4325007.html
-------------------------------------------------------------------------------------------------------------
学习做者教程:《前端JS高级面试》《前端JS基础面试题》《React.js模拟大众点评webapp》《zepto设计与源码分析》《json2.js源码解读》
也欢迎关注个人开源项目——wangEditor,简洁易用的web富文本编辑器
-------------------------------------------------------------------------------------------------------------