目录
一、定位
a.文档流
文档流,是指盒子按照html标签编写的顺序依次从上到下,从左到右排列,块元素占一行,行内元素在一行之内从左到右排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置。即简单来说-->文档流:先写的先排序,后写的后排。如果向突破文档流则需要使用定位。
b.相关设置
我们可以使用css的position属性来设置元素的定位类型,postion的设置项如下:
relative 生成相对定位元素,元素所占据的文档流的位置保留,元素本身相对自身原位置进行偏移,偏移后的是以脱离文档流的形式出现的,而他后面的元素保留为其脱离文档流之前的位置,相当于脱离文档流的元素依然在其前面占了一个位置。
absolute 生成绝对定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相对于上一个设置了定位的父级元素来进行定位,如果找不到,则相对于body元素进行定位。
fixed 生成固定定位元素,元素脱离文档流,不占据文档流的位置,可以理解为漂浮在文档流的上方,相对于浏览器窗口进行定位。
static 默认值,没有定位,元素出现在正常的文档流中,相当于取消定位属性或者不设置定位属性。
inherit 从父元素继承 position 属性的值。
c.定位元素的偏移
定位的元素还需要用left、right、top或者bottom来设置相对于参照元素的偏移值。
d.定位元素层级
定位元素是浮动的正常的文档流之上的,可以用z-index属性来设置元素的层级。
e.定位元素特性
绝对定位和固定定位的块元素和行内元素会自动转化为行内块元素
案例1- 相对定位relative
相对定位:文档流位置保留 相对于本身的位置进行偏移
1>没有设置relative
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
}
/* 使用组选择器进行一样的样式整理 */
.box02,.box01{
width: 300px;
height: 100px;
margin:10px;
}
.box01{
background-color: green;
/* 相对定位:文档流位置保留 相对于本身的位置进行偏移 */
/* position: relative;
left:50px;/* 设置left指的是以左边为基准向右偏移 */ */
}
.box02{
background-color: gold;
}
</style>
<title>定位</title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
</div>
</body>
</html>
<!-- 文档流:先写的先排序,后写的后排 -->
<!-- 突破文档流:定位 -->
2>设置relative
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
}
/* 使用组选择器进行一样的样式整理 */
.box02,.box01{
width: 300px;
height: 100px;
margin:10px;
}
.box01{
background-color: green;
/* 相对定位:文档流位置保留 相对于本身的位置进行偏移 */
position: relative;
left:50px;/* 设置left指的是以左边为基准向右偏移 */
}
.box02{
background-color: gold;
}
</style>
<title>定位</title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
</div>
</body>
</html>
<!-- 文档流:先写的先排序,后写的后排 -->
<!-- 突破文档流:定位 -->
3>总结
以上两端代码的区别在于box01的第二段代码设置了position: relative;同时设置了left=50px;最后的结果是:相对于没有设置的位置进行了一个向右的偏移50px.
案例2-绝对定位absolute
绝对定位:元素脱离文档流(使其他元素忽视该元素的存在) 找父级的元素定位找不到则相对于body进行元素定位
1>父级设置相对定位作为子级的参照点
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
position: relative;/* 父级一般设置相对的作为子级的参照点 */
}
.box02,.box01{
width: 300px;
height: 100px;
margin:10px;
}
.box01{
background-color: green;
/* 绝对定位:元素脱离文档流(使其他元素忽视该元素的存在) 找父级的元素定位找不到则相对于body进行元素定位*/
position: absolute;/* 设置元素的定位属性 */
left:50px;
}
.box02{
background-color: gold;
}
</style>
<title>定位</title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
</div>
</body>
</html>
<!-- 文档流:先写的先排序,后写的后排 -->
<!-- 突破文档流:定位 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
}
.box02,.box01{
width: 300px;
height: 100px;
margin:10px;
}
.box01{
background-color: green;
/* 绝对定位:元素脱离文档流(使其他元素忽视该元素的存在) 找父级的元素定位找不到则相对于body进行元素定位*/
position: absolute;/* 设置元素的定位属性 */
/* left: 0; */
}
.box02{
background-color: gold;
}
</style>
<title>定位</title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
</div>
</body>
</html>
<!-- 文档流:先写的先排序,后写的后排 -->
<!-- 突破文档流:定位 -->
2>父级没有设置则层层向上找,如果没有最后以body为定位
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
}
.box02,.box01{
width: 300px;
height: 100px;
margin:10px;
}
.box01{
background-color: green;
/* 绝对定位:元素脱离文档流(使其他元素忽视该元素的存在) 找父级的元素定位找不到则相对于body进行元素定位*/
position: absolute;/* 设置元素的定位属性 */
/* left: 0; */
}
.box02{
background-color: gold;
}
</style>
<title>定位</title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
</div>
</body>
</html>
<!-- 文档流:先写的先排序,后写的后排 -->
<!-- 突破文档流:定位 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
}
.box02,.box01{
width: 300px;
height: 100px;
margin:10px;
}
.box01{
background-color: green;
/* 绝对定位:元素脱离文档流(使其他元素忽视该元素的存在) 找父级的元素定位找不到则相对于body进行元素定位*/
position: absolute;/* 设置元素的定位属性 */
left: 0;
top: 0;
}
.box02{
background-color: gold;
}
</style>
<title>定位</title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
</div>
</body>
</html>
<!-- 文档流:先写的先排序,后写的后排 -->
<!-- 突破文档流:定位 -->
3>总结
通过以上代码分析,绝对定位忽视其它元素(可能造成覆盖),
绝对定位的参照点先找各父级有无设置,
如果没有则以body为父级进行偏移。
当然如果没有设置left、top诸如此类的偏移它会依然向普通元素一样排列(以文档流方式只不过忽视其它元素可能覆盖),
只有设置了top它才在垂直上相对于定位了的父级或body进行偏移,
同理只有设置了left才在水平方向上进行偏移
案例3-固定定位fixed
固定定位:直接找浏览器窗口进行定位 完全破除文档流
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
position: relative;/* 父级一般设置相对的作为子级的参照点 */
}
.box02,.box01{
width: 300px;
height: 100px;
margin:10px;
}
.box01{
background-color: green;
/* 固定定位:直接找浏览器窗口进行定位 完全破除文档流*/
position: fixed;/* 设置元素的定位属性 */
left:0px;
top: 0px;
}
.box02{
background-color: gold;
}
</style>
<title>定位</title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
</div>
</body>
</html>
<!-- 文档流:先写的先排序,后写的后排 -->
<!-- 突破文档流:定位 -->
<!-- static相当于取消定位属性或者不设置定位属性 inherit继承父级定位属性-->
1>总结
可以这样理解直接以body为参照进行偏移
案例4-定位的层级z-index
默认层级:后写的排在前写的后面把其盖住了
人为干预层级:z-index,值越大越后面盖
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
position: relative;/* 相对定位,做为子级的参照物 */
}
.con div{
width: 200px;
height: 200px;
position: absolute;/* 全部设置绝对定位 */
}
.box01{
background-color: green;
left: 20px;
top: 20px;
/* z-index: 10;/* 层级越大相当于更后面盖 */ */
}
.box02{
background-color: gold;
left: 40px;
top: 40px;
}
.box03{
background-color: pink;
left: 60px;
top: 60px;
}
.box04{
background-color: yellowgreen;
left: 80px;
top: 80px;
}
</style>
<title></title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
<div class="box03">box03</div>
<div class="box04">box04</div>
<!-- 默认层级:后写的排在前写的后面把其盖住了 -->
<!-- 人为干预层级:z-index -->
</div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 400px;
height: 400px;
border: 1px solid #000;
margin: 50px auto 0px;
position: relative;/* 相对定位,做为子级的参照物 */
}
.con div{
width: 200px;
height: 200px;
position: absolute;/* 全部设置绝对定位 */
}
.box01{
background-color: green;
left: 20px;
top: 20px;
z-index: 10;/* 层级越大相当于更后面盖 */
}
.box02{
background-color: gold;
left: 40px;
top: 40px;
}
.box03{
background-color: pink;
left: 60px;
top: 60px;
}
.box04{
background-color: yellowgreen;
left: 80px;
top: 80px;
}
</style>
<title></title>
</head>
<body>
<div class="con">
<div class="box01">box01</div>
<div class="box02">box02</div>
<div class="box03">box03</div>
<div class="box04">box04</div>
<!-- 默认层级:后写的排在前写的后面把其盖住了 -->
<!-- 人为干预层级:z-index -->
</div>
</body>
</html>
二、综合案例
案例1
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.con{
width: 100px;
height: 100px;
background-color: gold;
margin: 50px auto 0px;
position: relative;/* 设置相对定位 */
border-radius: 14px;/* 有偏角 */
}
.box{
width: 28px;
height: 28px;
background-color: red;
color: aliceblue;
text-align: center;/* 文字水平居中 */
line-height: 28px;/* 文字垂直居中 */
position: absolute;/* 设置绝对定位 */
left: 86px;
top: -14px;
border-radius: 14px;/* 正圆 */
}
</style>
<title>案例</title>
</head>
<body>
<div class="con">
<div class="box">5</div>
</div>
</body>
</html>
<!--定位特性: 绝对定位和固定定位块元素和行内元素会自动装换为行内块元素 -->
a.讲解
案例2
fixed进行定位类似与参照物为body,事实上并非如此
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.menu{
height: 80px;
background-color: gold;
position: fixed;/* 具有悬浮效果:滑动依然一直停留在页面上方 */
width: 960px;
top: 0px;
/* margin: 0px auto; *//* 对于定位的元素使用margin用不了 */
left:50%;/*仅仅是最左边的在50%地方 */
margin-left:-480px;
}
p{
text-align: center;
}
</style>
<title></title>
</head>
<body>
<div class="menu">菜单文字</div>
<p>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
</p>
</body>
</html>
a.解析
案例3-系统弹框
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.menu{
height: 80px;
background-color: gold;
position: fixed;/* 具有悬浮效果:滑动依然一直停留在页面上方 */
width: 960px;
top: 0px;
/* margin: 0px auto; *//* 对于定位的元素使用margin用不了 */
left:50%;/*仅仅是最左边的在50%地方 */
margin-left:-480px;/* 在偏移一般即水平居中 */
}
p{
text-align: center;
}
.popup{
width: 500px;
height: 300px;
border: 1px solid #000;
background-color: #fff;
position: fixed;
/* 设置垂直和水平居中 */
left: 50%;
margin-left: -251px;
top: 50%;
margin:-151px;
z-index: 999;/* 设置层级最大 */
}
.popup h2{
background-color: gold;
margin: 10px;
height: 40px;
}
.mask{
position: fixed;
width: 100%;
height: 100%;
background-color: #000;
left: 0;
top: 0;
opacity: 0.5;/* 透明度 */
}
.pop-con{
display: ;/* 藏东西 */
}
</style>
<title></title>
</head>
<body>
<div class="menu">菜单文字</div>
<div class="pop-con">
<div class="popup">
<h2>
弹框的标题
</h2>
</div>
<div class="mask"></div>
</div>
<p>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
网页文字
<br><br><br><br><br><br><br><br>
</p>
</body>
</html>