css05_浮动

浮动

浮动,就是让块级元素可以“并排"在一行,让行内元素可以设置宽/高属性。(浮动就是让盒子漂浮在父盒子上方不在父盒子里面)

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>

效果
image
性质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>

效果
image

性质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>

效果图
image
说明:没浮动的宽度应该是占满整个屏幕的,浮动后只占文字的宽度。

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>

效果图:
image
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>

image

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>

image
我们本以为这些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>

效果
image
弊端:加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>

效果图
image

  • 用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>

效果图
image
弊端:虽然内墙法可以很好的实现清除浮动,但也带来不好的一点:增加了额外多余的标签
一个父亲,是不能被浮动的儿子撑起高的 但是加一个墙可以撑起

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>

效果图
image
加上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>

效果图
image
本意就是清除溢出到盒子外面的文字,包括图片
一个父亲不能被自己浮动的儿子撑出高度,但是只要给父亲(是父亲不是祖先)加上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>

效果图
image
子元素浮动,导致父元素不能被撑开

<!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>

效果图
image

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*/
}

总结:

  1. 浮动的元素,只能被有高度的盒子关住,也就是说,如果盒子内部有浮动,这个盒子有高,那么浮动就不会相互影响,但是工作上,我们绝不会给盒子加高度,只是因为麻烦,并且不能适应页面的快速变化。所以我们就需要找到不给盒子加高度,但是也能够清除浮动的方法。

IE6,7兼容问题

1. ie6,7不支持小于12px的盒子,任何小于12px的盒子在ie6中显示效果都大,调不小。

解决方法:将盒子的字号设置小。

height:4px;
font-size;0px;
ie6的hack(下划线属性)
  1. 浏览器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;清除浮动的功能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值