CSS的定位机制
1.普通流(标准流)
默认状态,元素自动从左往右,从上往下排列
块元素的特征:
- 独占一行
- 可以设置宽高
- 如果不设置宽度,宽度默认为容器的100%
- 常见的块元素:div p h1-h6 ul ol li dl dt d
行内元素的特征:
- 与其他元素同行显示
- 不可以设置宽和高
- 宽和高就是文字或图片的宽高
- 常见的行内元素:span a b i u em
2.浮动
浮动基础
- 会使元素向左或向右移动,只能左右,不能上下
- 浮动元素碰到包含框或另一个浮动框,浮动停止
- 浮动元素之后的元素将围绕它,之前的不受影响
- 浮动元素会脱离标准流
基本语法: float:left|right|none
例:下列代码
<!DOCTYPE HTML> <html> <head> <title>测试页面</title> <style> .container{ width:200px; height:600px; border:2px solid #333; } .box1{ background-color: red; width:50px; height:40px; } .box2{ background-color: lightblue; width:50px; height:40px; } .box3{ background-color: pink; width:50px; height:40px; } </style> </head> <body> <div class="container"> <div class="box1">box1</div> <div class="box2">box2</div> <div class="box3">box3</div> </div> </body> </html>
给box1添加浮动
float:left;
可见,box2不见了,这是因为,给box1加了左浮动,它就脱离了文档流,致使box2跑到原来box1的位置,被box1挡住
将box1的float改为右浮动,效果如下图
现在,同时给3个Box设置左浮动
.box1{ background-color: red; width:50px; height:40px; float:left; } .box2{ background-color: lightblue; width:50px; height:40px; float:left; } .box3{ background-color: pink; width:50px; height:40px; float:left; }
效果如下
实现了横向展示的效果,原理是:设置了浮动的box会去找其父级元素的边,而后面两个也设置了浮动,但是遇到前面浮动的盒子而停止浮动
同时设置右浮动
使用浮动后产生的问题:高度塌陷
例如:设置父容器container为高度自适应,并且让Box1左浮动
.container{ width:200px; /*height:600px;*/ border:2px solid #333; } .box1{ background-color: red; width:50px; height:40px; float:left; } .box2{ background-color: lightblue; width:50px; height:40px; /*float:right;*/ } .box3{ background-color: pink; width:50px; height:40px; /*float:right;*/ }
可见,因为Box1脱离了容器,因此容器高度只有两个Box撑起来,所以父容器只有两个盒子的高度
现在,给三个盒子都设置左浮动:
可见,container高度已经没有了,出现了高度塌陷,浮动溢出的问题
在container外面下部再添加一个盒子
<!DOCTYPE HTML> <html> <head> <title>测试页面</title> <style> .container{ width:200px; /*height:600px;*/ border:2px solid #333; } .box1{ background-color: red; width:50px; height:40px; float:left; } .box2{ background-color: lightblue; width:50px; height:40px; float:left; } .box3{ background-color: pink; width:50px; height:40px; float:left; } .box4{ background-color: green; width:200px; height:400px; } </style> </head> <body> <div class="container"> <div class="box1">box1</div> <div class="box2">box2</div> <div class="box3">box3</div> </div> <div class="box4">box4</div> </body> </html>
可见,新添加的盒子挤到上面去了,和上面的内容产生重叠
如何清除浮动?
语法: clear:none|left|right|both;
设置了float的元素会影响其他相邻元素,需要使用clear清除浮动,clear只会影响自身,不会对其他相邻元素造成影响
例:
原效果
给box1添加清除左浮动,没有任何变化,这是因为clear只对自己产生效果,box1左边本身就没有其他元素
給box1清除左浮动
可以看到,box2和box3掉下来了,给Box2清除浮动对Box3没有影响,只是因为box3的左边元素时Box2,所以box3才跟着Box2一起掉下来
清除浮动的常用方法
A.在浮动元素后使用一个空元素
<div class="clear"></div>
.clear{ clear:both; }
原效果:
清除浮动
<!DOCTYPE HTML> <html> <head> <title>测试页面</title> <style> .container{ width:200px; border:2px solid #333; } .box1{ background-color: red; width:50px; height:40px; float:left; } .box2{ background-color: lightblue; width:50px; height:40px; float:left; } .box3{ background-color: pink; width:50px; height:40px; float:left; } .box4{ background-color: green; width:200px; height:400px; } .clearfix:after{ content:"."; display: block; height:0; visibility: hidden; } .clear{*zoom:1;/*触发hasLayout兼容IE6、7*/} .clear{ clear:both; } </style> </head> <body> <div class="container"> <div class="box1">box1</div> <div class="box2">box2</div> <div class="box3">box3</div> <div class="clear"></div> </div> <div class="box4">box4</div> </body> </html>
B.给浮动元素的容器添加 overflow:hidden
*zoom:1;/*触发hasLayout兼容IE6、7*/
例如:
.container{ width:200px; border:2px solid #333; overflow: hidden }
C:使用CSS3的:after伪元素
.clearfix:after{ content:"."; display: block; height:0; visibility: hidden; clear:both; } .clearfix{*zoom:1;/*触发hasLayout兼容IE6、7*/}
例如:
.container:after{ content:"."; display: block; height:0; visibility: hidden; clear:both; } .cintainer{*zoom:1;/*触发hasLayout兼容IE6、7*/}
清除浮动的其他方法
A.父级元素定义height,只适合高度固定的布局
B.父级元素也一起浮动,不推荐,会产生其他浮动问题
3.绝对定位
参见下一篇文章