浮动
浮动,就是让块级元素可以“并排"在一行,让行内元素可以设置宽/高属性。(浮动就是让盒子漂浮在父盒子上方不在父盒子里面)
1、浮动的性质
- 1、浮动的元素脱标(脱离标准文档流)
- 2、浮动的元素互相贴靠(要浮动就都浮动)
- 3、浮动的元素有字围现象(浮动的元素可以挡住盒子(没有浮动的),但是不会挡住盒子里面的字,字后显示在浮动盒子之后,这个叫做字围效果)
- 4、浮动的元素,默认宽/高度为文字的宽/高度,没有文字则宽/高为0(非常像行内元素)
- 5、元素增加浮动后会影响父元素的显示效果,所以需要清除浮动
eg:
性质2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Title</title>
<style type="text/css">
.box {
background-color: pink;
}
.box2 {
width: 100px;
height: 100px;
float: left;
background-color: rebeccapurple;
}
</style>
</head>
<body>
<div class="box">
<div class="box2"></div>
</div>
</body>
</html>
效果
性质3
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Title</title>
<style type="text/css">
.box {
background-color: pink;
}
.box2 {
width: 100px;
height: 100px;
float: left;
background-color: rebeccapurple;
}
</style>
</head>
<body>
<div class="box">b
<div class="box2"></div>
</div>
</body>
</html>
效果
性质4
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
.box3{
float: left;
background-color: green;
}
</style>
</head>
<body>
<div class="box3">我是文字</div>
</body>
</html>
效果图
说明:没浮动的宽度应该是占满整个屏幕的,浮动后只占文字的宽度。
2、分类
左浮动
float: left;
右浮动
float:right; //向右靠
实现:给标签添加float属性:设置左浮动和右浮动,表示当前标签实现了浮动,可以并排展示。
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
css
<style type="text/css">
.box1{
width: 200px;
height: 200px;
border: 1px solid red;
background-color: pink;
}
.box2{
width: 300px;
height: 300px;
border: 1px solid green;
background-color: blue;
}
</style>
效果图:
box1和box2要分别占一行
给box1、box2添加float属性,设置为left,(两个标签都要添加,只添加一个没用)则这2个div就可以并列在一行
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
.box1{
<!--左浮动,向左靠-->
float: left;
width: 200px;
height: 200px;
border: 1px solid red;
background-color: pink;
}
.box2{
float: left;
width: 300px;
height: 300px;
border: 1px solid green;
background-color: blue;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
</body>
</html>
3、浮动的影响(弊端)
主要是对父元素的影响
- 1、背景无法显示
由于浮动的设置,如果对父级设置了CSS 背景 background、CSS背景颜色或CSS背景图片,则父级元素将不能被撑开,所以导致CSS背景不能显示。 - 2、边框无法撑开
如果父级设置了CSS边框 border 属性,由于子级里使用了float属性,产生浮动,父级不能被撑开,导致边框不能随内容而被撑开。 - 3、margin、padding 设置值无法正确显示
由于浮动的设置,导致父级子级之间设置了 margin 或 padding 属性的值不能正确表达。特别是上下边的padding和margin不能正确显示。
4、浮动的清除
子元素增加浮动后会影响父元素标准文档流特性,需要通过清除浮动去解决。原因:因为浮动的元素,不在包裹它的父盒子里面,导致父盒子高度为0
清除浮动就是让子元素的浮动不影响父元素的布局
eg:
现在有两个div,div标签没有任何属性,每个div里都有li,这些li都是浮动的
<<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
li{
float: left;
width: 150px;
height: 40px;
background-color: orange;
text-align: center;
}
</style>
</head>
<body>
<div>
<ul>
<li>html</li>
<li>css</li>
<li>javaScript</li>
<li>设计模式</li>
</ul>
</div>
<div>
<ul>
<li>英语水平</li>
<li>面试技巧</li>
<li>学习方法</li>
</ul>
</div>
</body>
</html>
我们本以为这些li,会分成2排,但是显示效果是只有一排。第二个div中的li去贴第一个div中最后一个li的边了
产生原因: div没有高度,高度为0,不能给自己浮动的孩子一个容器
1、给浮动元素的祖先元素加高度(高度要不能小于浮动的子元素)
如果一个元素要浮动,那么它的父亲元素一定要有高度
有高度的盒子,才能关住浮动。(哪个父盒子没有高度就给哪个添加)
网页制作中,高度很少出现,为什么?因为能被内容撑高。所以通过加高度清除浮动用的很少
2、给浮动元素的父标签加上 clear:both;属性
clear:left 在左侧不允许浮动元素。
clear:right 在右侧不允许浮动元素。
clear:both 在左右两侧均不允许浮动元素。
clear:none 默认值。允许浮动元素出现在两侧。
clear:inherit 规定应该从父元素继承 clear 属性的值。
给父盒子增加clear:both;表示自己的内部元素,不受其他盒子的影响(2个盒子时,给后边的父盒子加,单给前面的父盒子加没有效果)。
eg:
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
li{
float: left;
width: 150px;
height: 40px;
background-color: orange;
text-align: center;
}
.box2{
/*clear:清除浮动 left:清除左浮动,right:清除右浮动,both:清除全部*/
/*清除别人对我的影响*/
clear: both;
}
</style>
</head>
<body>
<div>
<ul>
<li>html</li>
<li>css</li>
<li>javaScript</li>
<li>设计模式</li>
</ul>
</div>
<div class="box2">
<ul>
<li>英语水平</li>
<li>面试技巧</li>
<li>学习方法</li>
</ul>
</div>
</body>
</html>
效果
弊端:加clear: both;属性的盒子设置margin属性失效
3、隔墙法(外墙法和内墙法)
1、外墙法
在两部分浮动元素中间,建一个墙,隔开两部分浮动,让后面的浮动元素,不去追前面的浮动元素(即实现分行显示)。墙用自己的身体当做了间隙。
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
*{
/*清除默认的外边距和内边距*/
margin: 0px;
padding: 0px;
}
li{
float: left;
width: 150px;
height: 40px;
background-color: orange;
text-align: center;
}
.cl{
/*清除浮动,在这里设置margin是没有效果的,只能通过另外一个类选择器设置*/
clear: both;
}
.h10{
/*设置height属性,代替失效的margin属性*/
height: 10px;
}
</style>
</head>
<body>
<div>
<ul>
<li>HTML</li>
<li>css</li>
<li>JavaScript</li>
<li>设计模式</li>
</ul>
</div>
<!--c1就是一堵墙-->
<div class="cl h10"></div>
<div class="box2">
<ul>
<li>学习方法</li>
<li>英语水平</li>
<li>面试技巧</li>
</ul>
</div>
</body>
</html>
效果图
- 用clear:both;属性修饰的元素之前的浮动元素的父元素没有高度,(该没高度的还是没高度)
- 弊端:位于新增的块元素(“墙”)前面的元素无法使用margin-bottom,而后面的元素却可使用margin-top。两个div之间,没有任何的间隙了。就需要设置height属性或者用"内墙法"去增加margin.
2、内墙法 就是将墙修在标签里面,而不是在2个标签中间
- 哪个盒子需要高,就在哪个盒子里面添加(加在最后)
- 内墙法比外墙法的优点是让被添加的盒子有高度(可以通过审核元素查看)
- 这个方法可以使位于新增的块元素(“墙”)前面的元素使用margin-bottom,后面的元素也可使用margin-top。
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
*{
/*清除默认的外边距和内边距*/
margin: 0px;
padding: 0px;
}
li{
float: left;
width: 150px;
height: 40px;
background-color: orange;
text-align: center;
}
.cl{
/*清除浮动,在这里设置margin是没有效果的,只能通过另外一个类选择器设置*/
clear: both;
}
.h10{
/*设置height属性,代替失效的margin属性*/
height: 10px;
}
</style>
</head>
<body>
<div>
<ul>
<li>HTML</li>
<li>css</li>
<li>JavaScript</li>
<li>设计模式</li>
</ul>
<!--c1就是一堵墙-->
<div class="cl h10"></div>
</div>
<div class="box2">
<ul>
<li>学习方法</li>
<li>英语水平</li>
<li>面试技巧</li>
</ul>
</div>
</body>
</html>
效果图
弊端:虽然内墙法可以很好的实现清除浮动,但也带来不好的一点:增加了额外多余的标签
一个父亲,是不能被浮动的儿子撑起高的 但是加一个墙可以撑起
4、overflow:hidden 清除浮动
overflow属性
- overflow:hidden;表示溢出隐藏,隐藏子盒子超出父盒子的边界的内容
- overflow就是溢出的意思,hidden就是隐藏的意思
- 溢出边框的内容都隐藏掉,(当前盒子添加overflow:hidden属性,其子盒子溢出的部分隐藏)
<!DOCTYPE html>
<html>
<head>
<title>清除浮动4</title>
<style type="text/css">
div{
width: 300px;
height: 300px;
border: 2px solid red;
}
/*img{
float: left;
}*/
</style>
</head>
<body>
<div>
有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。
有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。
有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。
</div>
</body>
</html>
效果图
加上overflow: hidden;属性
<!DOCTYPE html>
<html>
<head>
<title>清除浮动4</title>
<style type="text/css">
div{
width: 300px;
height: 300px;
border: 2px solid red;
overflow: hidden;
}
/*img{
float: left;
}*/
</style>
</head>
<body>
<div>
有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。
有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。
有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。有些标签又默认的padding,所以在做网站的时候为了便于控制,会把默认的padding清除。
</div>
</body>
</html>
效果图
本意就是清除溢出到盒子外面的文字,包括图片
一个父亲不能被自己浮动的儿子撑出高度,但是只要给父亲(是父亲不是祖先)加上overflow:hidden,那么,父亲就能被儿子撑出高了。
使用overflow:hidden清除浮动
- 给浮动元素的父盒子添加属性:overflow:hidden(所有的都要添加,而不是只给后面的添加);
给需要高度的盒子加
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
.box1{
width: 400px;
border: 10px solid black;
}
.p1{
float: left;
width: 100px;
height: 200px;
background-color: yellow;
}
.p2{
float: left;
width: 100px;
height: 250px;
background-color: blue;
}
.p3{
float: left;
width: 100px;
height: 150px;
background-color: red;
}
</style>
</head>
<body>
</body>
<div class="box1">
<p class="p1"></p>
<p class="p2"></p>
<p class="p3"></p>
</div>
</html>
效果图
子元素浮动,导致父元素不能被撑开
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
*{
margin: 0px;
padding: 0px;
}
.box1{
width: 400px;
border: 10px solid black;
overflow: hidden;
}
.p1{
float: left;
width: 100px;
height: 200px;
background-color: yellow;
}
.p2{
float: left;
width: 100px;
height: 250px;
background-color: blue;
}
.p3{
float: left;
width: 100px;
height: 150px;
background-color: red;
}
</style>
</head>
<body>
</body>
<div class="box1">
<p class="p1"></p>
<p class="p2"></p>
<p class="p3"></p>
</div>
</html>
效果图
5、伪元素:clearfix
- 浮动盒子的给父标签添加class属性值为:clearfix,清除对其他盒子的影响
.clearfix:after{
content:"."; /*内容设置为空!!!*/
display: block; /*显示为块级元素!!!*/
height: 0;
visibility: hidden;
clear: both; /*清除浮动!!!*/
}
说明:以上注释部分的代码为必须,一般情况下,通过3行代码 content: “”; display: block; clear: both; 便可实现。
需要注意的是,如果在IE6和IE7浏览器上使用,则需给clearfix添加一条属性以触发haslayout。
<style>
.clearfix:after{
...
zoom: 1;
}
</style>
所以完整版如下
.clearfix:atrer{
content:"."; /*内容设置为空!!!*/
display: block; /*显示为块级元素!!!*/
height: 0;
visibility: hidden;
clear: both; /*清除浮动!!!*/
}
<!--兼容IE6、IE7浏览器-->
.clearfix{
Zoom:1
}
属性说明
- :after 选择器向选定的元素之后插入内容(给clearfix盒子内部末尾添加一个盒子after)
- content:""; 生成内容为空
- display: block; 生成的元素以块级元素显示,
- clear:both; 清除前面元素浮动带来的影响
相对于空标签闭合浮动的方法
优势:不破坏文档结构,没有副作用,避免多余标签的使用,可以兼容大部分浏览器
弊端:代码量多
6、双伪元素
给父标签添加class属性值为:clearfix
css
<!--给尾部和头部各添加一个盒子-->
.clearfix:before,.clearfix:after { /*清除浮动*/
content:"";
display:table;/*此元素会作为块级表格来显示(类似 <table>)*/
}
<!--给尾部添加一个盒子-->
.clearfix:after{clear:both;}
<!--兼容ie6-->
.clearfix{
*zoom:1;/*IE/7/6*/
}
总结:
- 浮动的元素,只能被有高度的盒子关住,也就是说,如果盒子内部有浮动,这个盒子有高,那么浮动就不会相互影响,但是工作上,我们绝不会给盒子加高度,只是因为麻烦,并且不能适应页面的快速变化。所以我们就需要找到不给盒子加高度,但是也能够清除浮动的方法。
IE6,7兼容问题
1. ie6,7不支持小于12px的盒子,任何小于12px的盒子在ie6中显示效果都大,调不小。
解决方法:将盒子的字号设置小。
height:4px;
font-size;0px;
ie6的hack(下划线属性)
- 浏览器hack:hack就是“黑客",就是使用浏览器提供的后门,针对某一种浏览器做兼容。 下划线是ie6专门的hack
ie6留了一个后门:只有在css属性之前,加一个下划线"_",这个就是ie6认识的专属属性,其他浏览器不认识。
比如:
//这个带下划线的css属性只在ie6浏览器上面有效,其他浏览器无效
-background-color:green;
ie6解决微型盒子完整写法:
height:4px;
_font-size;0px;
2、 ie6不支持overflow:hidden;清除浮动
解决方法:加上zoom属性:放大当前页面倍数 2就是放大2倍,3就是放大3倍 1就是不放大
overflow:hidden;
//放大一倍,即不放大
_zoom:1;
_zoom:1;能够触发浏览器的HasLayout机制,这个机制只有ie6有。
注意:overflow:hidden;的本意溢出盒子的内容自动隐藏,这个功能ie6是兼容的,不兼容的overflow:hidden;清除浮动的功能