本文内容:
浮动:
1. 传统网页布局的三种方式
2. 为什么需要浮动
3. 什么是浮动
4. 浮动特性(重点)
5. 浮动布局注意点
6. 清除浮动
6.1 为什么要清除浮动
6.2 语法
6.3 清除浮动方法
6.3.1 额外标签法
6.3.2 给父级添加 overflow
6.3.3 :after 伪元素法
6.3.4 双伪元素清除浮动
6.4 清除浮动总结
网页布局的本质:用CSS来摆放盒子,把盒子摆到相应位置
CSS提供了三种传统布局方式,简单说,就是盒子如何进行排列顺序:
即标签按照默认好的顺序排列
块级元素会独占一行,从上到下顺序排列
常用标签如:div
hr
p
h1~h6
ul
ol
dl
form
table
行内块元素会按照顺序,从左到右顺序排列,碰到父元素边缘会自动换行
常用标签如:span
a
i
em
以上就是标准流布局,是最基本的布局方式。
在实际开发中,一个页面基本都包含了这三种布局方式(移动端会有新的布局方式)
结合前面的学习,思考一下用标准流的布局能够实现以下效果吗?
如果让多个块级盒子( div )水平排成一行?
这有点难,你可能会想到用行内块元素的方法转成一行显示,但是用这种方法弄在一行他们之间会有大的空白间隙,难以控制
如何实现在一行内一个盒子左对齐,一个盒子右对齐呢?
从上面的例子可以看出,很多效果单靠之前标准流的做法是无法实现的,因此就需要用到浮动了,因为它能改变元素的默认排列方式。
浮动最典型的应用就是,让多个块级元素在一行内排列显示。
网页布局第一准则:多个块级元素纵向排列找标准流,多个块级元素横向排列找浮动。
float
用于创建浮动框,将其移动到一边,直到左边缘或右边缘触及到包含块或另一个浮动框的边缘。
语法:
选择器 {
float: 属性值;
}
属性值 | 描述 |
---|---|
none |
元素不浮动(默认值) |
left |
元素向左浮动 |
right |
元素向右浮动 |
例如:
<style>
.left,
.right {
float: left;
width: 200px;
height: 200px;
background-color: red;
}
.right {
float: right;
}
style>
<body>
<div class="left">左青龙div>
<div class="right">右白虎div>
body>
以上代码可以实现,第一个盒子靠左显示,第二个盒子靠右显示。
加了浮动的元素,会具有许多特性,需要重点掌握
脱离标准流的控制移动到指定位置
浮动的盒子不再保留原先的位置,如果下面有盒子,那么下面的盒子就会顶上去。
看了下面的例子相信就可以明白了:
<style>
.box1 {
float: left;
width: 200px;
height: 200px;
background-color: red;
}
.box2 {
width: 300px;
height: 300px;
background-color: blue;
}
style>
head>
<body>
<div class="box1">浮动盒子div>
<div class="box2">标准流盒子div>
body>
上面代码的效果是,由于盒子1设置了浮动,所以原先的位置得让出来,下面的盒子2顶上去,由于盒子1设置的是左浮动,而且盒子2比盒子1大,所以显示的效果就是,红色的盒子1覆盖在蓝色的盒子2上。
但是要注意,如果是盒子2设置了浮动,盒子1没有设置浮动,那么盒子2会盖住盒子1吗?
答案是不会!因为盒子1还是标准流,独占一行。
如果多个盒子都设置了浮动,那么他们会按照属性值一行内显示并且顶端对齐排列
**注意:**浮动的元素是贴到一起的,不会有缝隙,如果父级盒子宽度不够装不下了,多出的盒子就会另起一行显示。
浮动元素具有行内块元素的特性,如果行内元素设置了浮动,就无需再将其转成行内块元素去设置宽度高度了。
浮动元素经常和标准流父级元素搭配使用
为了约束浮动元素位置,我们网页布局一般采用的策略是:先用标准流的父元素排列上下位置,之后内部子元素采用浮动排列左右位置。
一个元素浮动了,理论上其他兄弟元素也要跟着浮动,以防出现问题
注意:浮动的盒子只会影响浮动盒子后面的标准流,不会影响前面的标准流
由于父级盒子在很多情况下,不方便给高度,比如一些新闻页面,因为新闻的长短是不确定的。
但是呢,不给高度吧,如果子元素设置成浮动,由于浮动是不占位置的,那么父元素的高度就会变成 0 ,从而影响下面的标准流盒子。
所以这就是清除浮动要解决的问题
语法:
选择器 {
clear: 属性值;
}
属性值 | 描述 |
---|---|
left |
不允许左侧有浮动元素(清除左侧浮动的影响) |
right |
不允许右侧有浮动元素(清除右侧浮动的影响) |
both |
同时清除左右两侧浮动的影响 |
实际工作中,几乎只用clear: both;
overflow
属性after
属性做法是,在浮动元素末尾添加一个空标签(这个空标签必须是块级元素):
<style>
.box1,
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: red;
}
.footer {
height: 200px;
background: black;
}
.clear {
clear: both;
}
style>
<body>
<div class="box1">number1div>
<div class="box2">nubmer2div>
<div class="clear">div>
<div class="footer">底部div>
优点:通俗易懂,书写方便。
缺点:添加了无意义的标签,结构化比较差。
这种方法在实际工作中可能会碰到,但是不常用。
给父级元素添加overflowsh
属性,将其设置为 auto
hidden
或 scroll
<style>
.box1,
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: red;
}
.footer {
height: 200px;
background: black;
}
.clear {
overflow: hidden;
}
style>
head>
<body>
<div class="clear">
<div class="box1">number1div>
<div class="box2">nubmer2div>
div>
<div class="footer">底部div>
body>
优点:代码简洁
缺点:无法显示溢出的部分 (后面会讲到)
:after
伪元素法此方法是额外标签法的升级版,是给父元素添加
<style>
.box1,
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: red;
}
.footer {
height: 200px;
background: black;
}
/*实际上是在最后一个子元素的后面添加了一个空盒子,再设置清除浮动*/
.clearfix::after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
/* IE6、7专有*/
zoom: 1;
}
style>
head>
<body>
<div class="clearfix">
<div class="box1">number1div>
<div class="box2">nubmer2div>
div>
<div class="footer">底部div>
body>
此方法的优点:没有增加标签,结构更简单
缺点:需要照顾低版本浏览器
也是给父元素添加
<style>
.box1,
.box2 {
float: left;
width: 200px;
height: 200px;
background-color: red;
}
.footer {
height: 200px;
background: black;
}
.clearfix:before,
.clearfix:after {
content: "";
display: table;
}
.clearfix:after {
clear: both;
}
.clearfix {
/* IE6、7专有*/
zoom: 1;
}
style>
head>
<body>
<div class="clearfix">
<div class="box1">number1div>
<div class="box2">nubmer2div>
div>
<div class="footer">底部div>
body>
此方法的优点:没有增加标签,结构更简单
缺点:需要照顾低版本浏览器
方式 | 优点 | 缺点 |
---|---|---|
额外标签法(隔墙法) | 通俗易懂,书写方便 | 添加了无意义标签,结构化较差 |
父级 overflow:hidden; |
书写简单 | 溢出隐藏 |
父级:after 伪元素 |
结构语义化正确 | 兼容性问题,由于IE6、7不支持:after |
父级双伪元素 | 结构语义化正确 | 兼容性问题,由于IE6、7不支持:after |