博客列表 >05 CSS布局原理

05 CSS布局原理

如水庵邸
如水庵邸原创
2019年09月07日 22:16:39848浏览

1、浮动原理

html页面中默认的元素排序被称为文档流,从上到下,从左到右依次排序。要实现网页的布局就要打破默认的文档流,重新给元素定位。让元素脱离html文档流的方法就是浮动和定位。

浮动(float)使元素脱离了html文档流,实现了左右方向的自由移动。可以把默认的文档流认为是一层,加了浮动(float)之后的元素是另外一层,这个浮动的一层“漂浮”在默认文档流的上面。

浮动对前面的元素没有影响,对后面的元素有影响,会覆盖后面的元素。所以为了使后面的元素能正常显示,需要浮动或者清除(clear)前面浮动元素的作用。

2、清除子元素浮动对父元素高度折叠的影响

对于嵌套的盒子,子元素的浮动会引起父元素高度折叠。如下实例:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>清除子元素浮动引起的塌陷</title>
		<link rel="stylesheet" href="css3.css"/>
	</head>
	
	<body>
	 <div class="box1">
		 <div class="box2">
			 box2
		 </div>
	 </div>
	</body>
</html>

两个盒子原始的样式是这么写的:

.box1{
	width: 400px;
	outline: 1px dashed red;
}

.box2{
	width: inherit;
	height: 400px;
	background-color: aqua;
}

此时页面显示如图

QQ图片20190907182330.png

给box2加一个浮动

.box1{
	width: 400px;
	outline: 1px dashed red;
}

.box2{
	width: inherit;
	height: 400px;
	background-color: aqua;
}

.box2{
	float: left;
}

这时候因为子元素box2浮动,所以父元素box1里面就没有内容了,整个边框就缩成了一条线,如图:

QQ图片20190907182651.png

这就是子元素浮动造成的父元素在高度上的折叠,清除的方法很简单,在父元素的样式里加上overflow:hidden即可

.box1{
	width: 400px;
	outline: 1px dashed red;
}

.box2{
	width: inherit;
	height: 400px;
	background-color: aqua;
}

.box2{
	float: left;
}

.box1{
	overflow: hidden;
}

这个时候页面又恢复正常了

QQ图片20190907182330.png

flow是流量的意思,over是超过,overflow本意就是超过流量了。通俗点说就是装不下了,流出来了,就好像家里的洗手盆都会有个溢出口,如果放水忘记关水龙头了,水会从这个溢出口流进下水管道,而不至于从面板上溢出来流的满地都是。

很显然,在上面这个例子中,因为子元素box2浮动了,脱离了默认的文档流,父元素box1里面就没东西了,框子缩成了一条线。反过来看,就是父元素装不下子元素了,子元素溢出了。hidden是隐藏的意思,把这种溢出的现象隐藏起来,也就消除掉了。此例中,父元素box1的高度是没有指定的,而子元素box2有高度,所以浏览器会理解box1的高度要足够大,才能够“不溢出”。此时,父元素box1又可以框住box2了。

3、定位

定位也是一种让元素布局的方法,定位有4种:

1、静态定位(static),也就是html页面的默认的定位,文档流;

2、相对定位(relative),元素仍在文档流,也就是说对后面的元素的位置没有影响,相对它原来的位置发生偏移;

3、绝对定位(absolute),元素脱离的文档流,对后面的元素的位置是有影响的,相对离它最近的一个有位置的元素进行定位;

4、固定定位(fixed),始终相对于浏览器窗口进行定位,也脱离了文档流。

写一个实例,有个5个盒子

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>定位</title>
		<link rel="stylesheet" href="css4.css"/>
	</head>
	<body>
		<div class="box1">1</div>
		<div class="box2">2</div>
		<div class="box3">3</div>
		<div class="box4">4</div>
		<div class="box5">5</div>
	</body>
</html>

QQ图片20190907191611.png

首先用相对定位,使5个盒子摆成一个十字架,5在中间,1/2/3/4呈顺时针排列,样式如下:

.box1{

width: 100px;

height: 100px;

background-color: red;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


.box2{

width: 100px;

height: 100px;

background-color: yellow;

border-radius: 20%;

font-size: 50px;

color: black;

text-align: center;

line-height: 100px;

}


.box3{

width: 100px;

height: 100px;

background-color: blue;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


.box4{

width: 100px;

height: 100px;

background-color: green;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


.box5{

width: 100px;

height: 100px;

background-color: purple;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


/* 相对定位 */

.box1{

position: relative;

left: 100px;

}


.box2{

position: relative;

left: 200px;

}


.box3{

position: relative;

left: 100px;

}


.box4{

position: relative;

top: -200px;

}


.box5{

position: relative;

left: 100px;

top: -300px;

}

浏览器里的效果如下图

QQ图片20190907192033.png

再用绝对定位实现一次

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>绝对定位</title>
		<link rel="stylesheet" href="css5.css"/>
	</head>
	<body>
		<div class="parent">
			<div class="box1">1</div>
			<div class="box2">2</div>
			<div class="box3">3</div>
			<div class="box4">4</div>
			<div class="box5">5</div>
		</div>
		
	</body>
</html>

给5个盒子加一个父级盒子“parent”,为了看得更清楚,给parent加一个框

QQ图片20190907203617.png

用绝对定位来摆一个十字架,首先要给父级盒子一个定位,其次要注意绝对定位是脱离了文档流的定位,会对后面的元素位置产生影响,css代码如下:

.parent{

    /* 设置定位父级的定位属性 */

position: relative;

width: 300px;

height: 300px;

outline: 2px dotted brown;

}


.box1{

width: 100px;

height: 100px;

background-color: red;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


.box2{

width: 100px;

height: 100px;

background-color: yellow;

border-radius: 20%;

font-size: 50px;

color: black;

text-align: center;

line-height: 100px;

}


.box3{

width: 100px;

height: 100px;

background-color: blue;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


.box4{

width: 100px;

height: 100px;

background-color: green;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


.box5{

width: 100px;

height: 100px;

background-color: purple;

border-radius: 20%;

font-size: 50px;

color: white;

text-align: center;

line-height: 100px;

}


/* 绝对定位 */

.box1{

position: absolute;

left: 100px;

}


.box2{

position: absolute;

left: 200px;

top: 100px;

}


.box3{

position: absolute;

left: 100px;

top: 200px;

}


.box4{

position: absolute;

top: 100px;

}


.box5{

position: absolute;

left: 100px;

top: 100px;

同样把十字架画成了。

QQ图片20190907204404.png

4、用绝对定位和浮动定位实现三列布局。

实例如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>绝对定位三列布局</title>
		<link rel="stylesheet" href="css6.css">
	</head>
	<body>
		<div class="container">
			<div class="header">头部</div>
			<div class="main">
			    <div class="left">左边</div>
				<div class="content">内容</div>
				<div class="right">右边</div>	
			</div>
			<div class="footer">底部</div>	
		</div>
	</body>
</html>

绝对定位要注意的是,元素脱离了文档流,对后面元素的位置产生影响,样式文件如下:

.container{
	width: 1000px;
	background-color: blue;
	margin: 0 auto;
}

.header{
	height: 80px;
	background-color: lightcoral;
}

.footer{
	height: 80px;
	width: inherit;
	background-color: lightgray;
}

.main{
	background-color: lightgreen;
	margin: 5px auto;
}

.left{
	background-color: lightpink;
	width: 200px;
	min-height: 800px;
}

.content{
	background-color: lightskyblue;
	width: 600px;
	min-height: 800px;
}

.right{
	background-color: lightsalmon;
	width: 200px;
	min-height: 800px;
}

/* 绝对定位 */
.main{
	/* 给定位父级元素设置定位属性 */
	position: relative;
}

.left{
	position: absolute;
	left: 0;
	top: 0;
}

.right{
	position: absolute;
	right: 0;
	top: 0;
}

.content{
	position: absolute;
	margin: 0 200px;
}

.footer{
	position: absolute;
	bottom: 0;
}

实现的效果如下:

QQ图片20190907213820.png此处代码不是完全按老师示例去写的,footer和header分开写的,遇到一个问题就是right定位完了之后,footer跑到了顶上,这时候给了footer一个绝对定位bottom 0,发现main的下margin 5px消失了,main跟footer之间没有空隙了。

用浮动定位,注意为了避免子元素浮动引起父元素高度方向塌陷,所以要用到 overflow:hidden,实例样式文件如下:

.container{
	width: 1000px;
	margin: 0 auto;
}

.header{
	height: 80px;
	background-color: lightcoral;
}

.footer{
	height: 80px;
	width: inherit;
	background-color: lightgray;
}

.main{
	background-color: lightgreen;
	margin: 5px auto;
	overflow: hidden;
}

.left{
	background-color: lightpink;
	width: 200px;
	min-height: 800px;
}

.content{
	background-color: lightskyblue;
	min-height: 800px;
}

.right{
	background-color: lightsalmon;
	width: 200px;
	min-height: 800px;
}

/* 浮动定位 */
.left{
	float: left;
}

.right{
	float: right;
}

.content{
	float: left;
	width: 600px;
}

运行效果如图

QQ图片20190907221352.png

总结:

相对定位不影响前后元素的定位,还在文档流当中,只是元素相对自己的位置发生了便宜。绝对定位和浮动都会让元素脱离文档流,影响后面元素的位置。overflow:hidden 语句在子元素发生浮动时,可以避免父级元素在高度方面的塌陷。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议