absolute float 比较分析
同一:absolute-float 都脱离了文档流,也就是默认情况下,父盒子计算高度不包括 absolute/float 的元素
下例:
两个 parentDiv,背景色:深海蓝;边框:1px红色实线;父盒子里面各包含一个 sonDiv ;
第一个 sonDiv 绝对定位,第二个 sonDiv 浮动定位;
两个 parentDiv 都有 margin-bottom: 20px; 方便观察,避免互相干扰;
示例:

代码:
<div style="margin-bottom: 20px;">
<div style="position: absolute;">sonDiv1-absolute</div>
</div>
<div style="margin-bottom: 20px;">
<div style="float: left;">sonDiv2-float</div>
</div>
结论:absolute-float 元素都脱离了文档流,且默认情况下,父盒子计算高度不包括 absolute/float 的元素(如果父盒子里有非absolute-float元素的话,父盒子自然会计算非absolute-float元素的高度)
同二: absolute-float 使元素宽高自适应
示例:

代码:
<div style="position: absolute;border: 1px solid red;">sonDiv1-absolute</div>
<div style="float: left;margin-top:25px;border: 1px solid red;">sonDiv2-float</div>
<div style="margin-top:50px;border: 1px solid red;">sonDiv3-normal</div>
大家可以看到,三个盒子都没有设置宽度,前面两个 absolute/float 盒子 div 宽度自动等于内容宽度了,而第三个普通的 div 就是独占一行,典型的块级元素特征;
结论:absolute-float 使元素宽高自适应
异一:脱离文档流不同
脱离文档流的区别1: absolute 的元素好像没有办法让 parentDiv 计算他的高度,不过float可以,只要给 float 元素的 parentDiv 加上 overflow:hidden 就行;
给他们的 parentDiv 都加上 overflow:hidden
示例:

代码:
<div style="overflow: hidden;margin-bottom: 20px;">
<div style="position: absolute;">sonDiv1-absolute</div>
</div>
<div style="overflow: hidden;margin-bottom: 20px;">
<div style="float: left;">sonDiv2-float</div>
</div>
结论:通过给 float 元素的 parentDiv 设置 overflow:hidden ,可以让父元素把 sonDiv 的高度计算在内,但是 absolute 不行
脱离文档流的区别2:
(1) absolute 脱离了文档流,后面的普通盒子会忽视他,而且还会忽视他里面的内容(在这里就是后面的普通元素会忽略 absolute 的 div ,也会忽略 div 里面的文字)
方便示例,咱们把两个第一个 parentDiv 的 margin-bottom: 20px; 去掉,第二个 sonDiv 的 float 也去掉, parentDiv 的 overflow 也去掉;
示例:

代码:
<div style="overflow: hidden;">
<div style="position: absolute;">sonDiv1-absolute</div>
</div>
<div style="overflow: none;margin-bottom: 20px;">
<div style="float: none;">sonDiv2-float:none</div>
</div>
结论: absolute 脱离了文档流,后面的普通盒子会忽视他,而且还会忽视他里面的内容
补充: absolute 脱离了文档流,后面的浮动盒子也会忽视他,而且还会忽视他里面的内容;当然后面的盒子如果也是 absolute 的,当然就不会忽视了,这个很好理解,同级嘛,不解释
示例:给第二个盒子设置 float , parentDiv 加上 overflow ;后面再加一个盒子, sonDiv3 设置 absolute
示例:

代码:
<div style="overflow: hidden;">
<div style="position: absolute;">sonDiv1-absolute</div>
</div>
<div style="overflow: hidden;">
<div style="float: left;">sonDiv2-float:left</div>
</div>
<div style="overflow: hidden;margin-bottom: 20px;">
<div style="position: absolute;">sonDiv3-absolute</div>
</div>
结论: absolute 脱离了文档流,后面的普通、浮动盒子都会忽视他,而且还会忽视他里面的内容,只有同级的 absolute 元素不会忽略他
(2) float 元素脱离了文档流且他的父盒子没有设置 overflow: hidden; ,后面的普通盒子会忽视他,但不会忽视他里面的内容(在这里就是后面的普通元素会忽略 float 的 div ,但是不会忽略 div 里面的文字)
示例:

代码:
<div style="overflow: none;">
<div style="float: left;">sonDiv2-float:left</div>
</div>
<div style="margin-bottom: 20px;">
<div style="position: none;">sonDiv1-absolute-none</div>
</div>
你看,这里普通盒子 sonDiv1 就忽视了 float 的 sonDiv2 的盒子(因为他自身 float ,且他的父盒子没有设置 overflow: hidden; ),但是呢,很明显 sonDiv1 盒子里的文字看到了 float 的 sonDiv2 盒子里的内容,所以没有直接盖过去,反而让出了位置。。。
仔细分析的话,这里其实出现了4处变化!
- 1. sonDiv2 的 parentDiv 由于 sonDiv2 的 float:left 出现了坍缩,忽略了sonDiv2 的盒子和内容,所以 sonDiv2 的 parentDiv 只剩下了两根1px的红色边框,背景色自然也看不见了;
- 2.由于上面的盒子 sonDiv2 的 float:left ,导致后面的普通元素, sonDiv1 和他的 parentDiv 就忽略了这个盒子的存在,直接顶上去了,顶到 sonDiv2 的 parentDiv (也就是2px的红色边框),那么这里 sonDiv1 的 parentDiv 边框是1px红色,加上前面的 2px ,所以导致最上面有 3px 的红色边框啦;
- 3.同时 sonDiv1 和他的 parentDiv 的整体上移( sonDiv1 的 parentDiv 的背景色当然一起上移啦),给 sonDiv2 的 parentDiv 造成了有背景色的假象!其实这个背景色是 sonDiv1 的 parentDiv 的!
- 4.按道理呢, sonDiv1 的文字也是一起上移的,可是呢, sonDiv1 的文字也就是内容,看到了上面 float:left 盒子 sonDiv2 的内容!!!所以他就没有盖上去,而是自觉的让出了位置,跟在前面内容的后面了!!!
- 可能大家也注意到了, sonDiv2 的文字要比 sonDiv1 的高一点点,这就是 1px 的边框哦,因为 sonDiv2 顶着他 parentDiv 的 2px 边框,而 sonDiv1 顶着 3px 的边框哦(不明白,请看第2条)
那么如果给 float 元素的 parentDiv 加上 overflow: hidden; 呢?自然就变正常啦, parentDiv 被撑起来,后面的普通盒子也能正常看到, float 元素的 parentDiv 啦
示例:

代码:
<div style="overflow: hidden;">
<div style="float: left;">sonDiv2-float:left</div>
</div>
<div style="margin-bottom: 20px;">
<div style="position: none;">sonDiv1-absolute-none</div>
</div>
结论: float 元素脱离了文档流且父盒子没有设置 overflow: hidden; ,后面的普通盒子会忽视他,但不会忽视他里面的内容;如果他的父盒子设置 overflow: hidden;,那么后面的普通盒子就不会忽视他,注意此时设置了 overflow: hidden; 的父盒子也会变成高度自适应哦(宽度好像也是, float 元素有多宽高,父盒子就被撑多宽高)~
咱们继续引申下去,float 元素,如果他的父盒子没有设置 overflow: hidden; ,且后面跟着的不是普通盒子,而是 absolute 盒子,情况会怎么样呢?
示例:

代码:
<div style="overflow: none;">
<div style="float: left;">sonDiv2-float:left</div>
</div>
<div style="margin-bottom: 20px;">
<div style="position: absolute;">sonDiv1-absolute-none</div>
</div>
结论: float 元素脱离了文档流且父盒子没有设置 overflow: hidden; ,后面的 absolute 盒子会忽视他这个盒子,而且会忽视他里面的内容(在这里就是后面的 absolute 元素会忽略 float 元素的 div 和里面的文字,直接盖上去!!!)
那么如果 给 float 元素的 parentDiv 设置 overflow:hidden; 呢?咱们来试试!
示例:

代码:
<div style="overflow: hidden;">
<div style="float: left;">sonDiv2-float:left</div>
</div>
<div style="margin-bottom: 20px;">
<div style="position: absolute;">sonDiv1-absolute-none</div>
</div>
这下恢复正常啊,与后面跟着普通盒子无差,当然后面盒子的背景色没了,这个 absolute 盒子自身的问题;
结论:float 元素脱离了文档流且父盒子没有设置 overflow: hidden; 后面的普通盒子会忽视他,但不会忽视他里面的内容; absolute 盒子则会忽视盒子和内容; float 元素脱离了文档流且父盒子设置了 overflow: hidden; 则后面的普通盒子和 absolute 盒子都会看到 float 元素父盒子的存在
对了,这里还没说如果后面的元素是 float 元素呢,,,不过这个应该简单,同级的嘛,即使 float 元素脱离了文档流且父盒子没有设置 overflow: hidden;,后面的 float 元素也会看到的,且条件允许的话,会和前面的 float 元素共处一行哦
示例:

代码:
<div style="overflow: none;">
<div style="float: left;">sonDiv2-float:left</div>
</div>
<div style="margin-bottom: 20px;">
<div style="float: left;border:1px solid green">sonDiv1-absolute-none</div>
</div>
都是 float 元素,同级嘛,父元素都忽视了,所以就并排了(注意哦,后一个 float 元素看到了前一个 float 元素的盒子哦,不仅仅是只看见了内容哦,不信?我给后面一个 float 元素加了边框呐!你看后面一个 float 元素的边框并没有盖到第一个 float 元素去,而是顶在第一个 float 元素的边界),至于高度不一样,因为第一个盒子 sonDiv2 顶着父盒子坍缩导致的 2px 边框,而第二个盒子 sonDiv1 顶着2个父盒子坍缩导致的 4px 边框和自己的 1px 边框,所以高度自然不一样啦;那么我们再给第一个 float 元素的父盒子加上 overflow: hidden; 看看
示例:

代码:
<div style="overflow: hidden;">
<div style="float: left;">sonDiv2-float:left</div>
</div>
<div style="margin-bottom: 20px;">
<div style="float: left">sonDiv1-absolute-none</div>
</div>
又是挺正常的嘛,所以咱们来总结下:
结论:float 元素脱离了文档流且父盒子没有设置 overflow: hidden; 后面的普通盒子会忽视他,但不会忽视他里面的内容; absolute 盒子则会忽视盒子和内容; float 盒子则都不会忽视; float 元素脱离了文档流且父盒子设置了 overflow: hidden; 则后面的普通盒子、 absolute 盒子和 float 盒子都会看到 float 元素父盒子的存在
插播一句,position:fixed 跟 absolute 比较像,也脱离文档流,不过没细分析;但是 position:relative 好像并没有脱离文档流~~
最后把异同总结下: absolute/float 元素定位异同:
- 同1:absolute-float 都脱离了文档流,也就是默认情况下,父盒子计算高度不包括 absolute/float 的元素
- 同2:absolute-float 使元素宽高自适应
- 异1:脱离文档流的区别1: absolute 的元素好像没有办法让 parentDiv 计算他的高度,不过float可以,只要给 float 元素的 parentDiv 加上 overflow:hidden 就行;
- 异1:脱离文档流的区别2: absolute 脱离了文档流,后面的普通、浮动盒子都会忽视他,而且还会忽视他里面的内容,只有同级的 absolute 元素不会忽略他;float 元素脱离了文档流且父盒子没有设置 overflow: hidden; 后面的普通盒子会忽视他,但不会忽视他里面的内容; absolute 盒子则会忽视盒子和内容; float 盒子则都不会忽视; float 元素脱离了文档流且父盒子设置了 overflow: hidden; 则后面的普通盒子、 absolute 盒子和 float 盒子都会看到 float 元素父盒子的存在,且设置了 overflow: hidden; 的父盒子也会变成高度自适应(宽度好像也是, float 元素有多宽高,父盒子就被撑多宽高)~
行文仓促,如有错误,欢迎批评指正~~~
absolute float 比较分析的更多相关文章
- 【总结整理】行内标签span设置position:absolute/float属性可以设置宽度与高度
postion:absolute 跳出文本流,不是行内元素,设置宽高有效,我的理解. 引用下曹刘阳写的<编写高质量代码-web前端开发修炼之道>一书中看到的一句话:position:abs ...
- JDK源码之Double类&Float类分析
一 概述 Double 类是基本类型double的包装类,fainl修饰,在对象中包装了一个基本类型double的值.Double继承了Number抽象类,具有了转化为基本double类型的功能. 此 ...
- 【前段开发】10步掌握CSS定位: position static relative absolute float
希望能帮到须要的人,转自:http://www.see-design.com.tw/i/css_position.html 1. position:static 元素的 position 屬性默認值為 ...
- div定位relative和absolute和float测试3
position等于absolute的时候,不一定是相对于浏览器定位,当div存在包含关系时,父div设置成relative,其中包含的div设置成absolute就是相对于该父div的了.该文测试了 ...
- 那些年我们一起清除过的浮动float与clearfix
浮动(float),一个我们即爱又恨的属性.爱,因为通过浮动,我们能很方便地布局: 恨,浮动之后遗留下来太多的问题需要解决,特别是IE6-7(以下无特殊说明均指 windows 平台的 IE浏览器). ...
- html/css基础篇——DOM中关于脱离文档流的几种情况分析
所谓的文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素.脱离文档流即是元素打乱了这个排列,或是从排版中拿走. ...
- CSS学习笔记(float和盒子模型)
1.当元素或者是它的包裹层设置了绝对定位或者是浮动,那么margin:0 auto;自动居中的效果就不会实现. 2.盒子模型的三位立体结构图中从第一层到第五层依次为:border.content+pa ...
- position跟display、margin collapse、overflow、float这些特性相互叠加后会怎么样?
这是寒冬大神提出的一个题目,刚开始看到这题的时候完全不知道从什么地方回答起好,题目内容比较广泛,找不到针对点.后来我觉得这个题目应该能拆成几个点来回答:1.'display'.'position' 和 ...
- css清除浮动float
css清除浮动float 1.分析HTML代码 <div class="outer"> <div class="div1">1</ ...
随机推荐
- Spring IOC和AOP 基础
1 spring中注入资源是通过描述来实现的,在 spring 中是通过注解或者 XML 描述.spring 中IOC 注入方式有三种 1)构造方法注入 2)setter 注入 3)接口注入 1.1) ...
- 数据库中varchar类型数据转换为numeric类型
numeric有好几种选择,有整形.小数型等等.都是用cast来实现 前提:A表的ID字段是VARCHAR类型 .SELECT CAST(ID AS INTEGER) FROM A .SELECT C ...
- Redis(十三):Redis分布式锁的正确实现方式
前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...
- DDMS android 开发工具-----dump View Hierarchy for UI automator
今天又发现一个好工具 dump View Hierarchy 对学习UI布局非常有优点,操作也非常easy的.直接上图说话了 watermark/2/text/aHR0cDovL2Jsb2cuY3N ...
- 每日英语:How to find the career of your dreams
The fate described by Dostoyevsky is a nightmare we all hope to escape. But we're surrounded by nays ...
- Linux strace命令使用详解
strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息. 可谓是 linux 下的调试利器,不仅可以用来找程序错误,系统为什么挂死了,命令为什么报错 ...
- Activiti - 新一代的开源 BPM 引擎 (zhuan)
http://www.ibm.com/developerworks/cn/Java/j-lo-activiti1/ ****************************************** ...
- js 树菜单 ztree
http://www.ztree.me/v3/api.php 官网 api js /** <div id="menuContent" class="menuCont ...
- C++的历史与现状
在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup,该门语言则命名为——C with classes,四年后 ...
- VS中C#读取app.config数据库配置字符串的三种方法(转)
关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet, ...