一、前言
- 最近参加了公司的一个小程序的开发项目,虽然很简单,但是非常急三天就要交。本来就是实习生加上前端不熟练的我,最终在Css定位上吃了很大的亏。今天就来了解一下Css中的几个定位。
二、什么是定位
- 在Css中有一个position属性,代表定位,它有四个值,可以通过设置它的TLBR来调整元素位置
- absolute(绝对)(脱离文档流)
- relative(相对)(不脱离文档流)
- fixed(固定)(脱离文档流)
- sticky(粘性)(不脱离文档流)
三、文档流
- 想要清楚了解定位,就脱离不开文档流。
- 字面意思就是元素从上到下,从左到右,该在什么位置就在什么位置。
- 正常文档流是在我们没有刻意是控制它的时候,每个元素排放在文档都会按顺序排放
- 脱离文档流就是指它所显示的位置和文档代码就不一定一致了,刻意通过Css控制它来修改它的位置
四、不同定位的作用
1、absolute
- 首先第一点,它会脱离文档流,基本上可以理解为,它可以根据给予它的Css来调整自身的位置,而不会根据文档流的顺序来排放
- 即便它会脱离文档流,但absolute,定位依据是定位元素的父级,也就是如果它的父级有设置定位,那么它将根据它的父级元素来进行脱离文档流的位置调整
- 当它的所有父级元素都没有设置定位时,它将根据body进行定位
2、relative
- 不脱离文档流,在文档流本身排放自身元素的位置上,进行Css位置调整
3、fixed
- 脱离文档流,不再区分块元素、行内元素、行内块元素,固定定位不占有原来的位置
- 固定在浏览器页面上,不随浏览器的滚动而改变位置
- 以浏览器为参照物,和父元素没有任何关系
4、sticky
- 和fixed一样,以浏览器为参照物
- 元素不会脱离文档流,占有原来位置
- 粘滞定位可以在元素到达某个位置时,将其固定
- 没有达到top值之前正常显示,达到top值之后类似于固定定位,不会跟随滚动条滚动而滚动
五、举例
1、代码
Html页面
<!DOCTYPE html>
<html style="background-color: beige;">
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="./css/index.css">
</head>
<body>
<div style="background-color: black; width: 100px; height: 100px;" class="div1"></div>
<div style="background-color: aqua; width: 100px;height: 100px;" class="div2"></div>
<div style="background-color: red; width: 100px;height: 100px;" class="div3"></div>
</body>
</html>
Css页面
.div1{
position: relative;
left: 20px;
top: 20px;
}
.div2{
position: absolute;
top: 40px;
left: 100px;
}
.div3{
position: relative;
}
2、结果图
3、分析
- 黑色为div1,青蓝色为div2,红色为div3
- 这里可以看到青蓝色的div定位为absolute,是脱离文档流的,这里因为他的父级都没有,所以直接根据body进行定位
- 可以看出absolute和fixed的区别,他们同样脱离文档流,但以下是不同点
- absolute:根据它的父级元素的定位,但前提是它的父级元素有定位,如果所有父级元素都没有定位,那么将根据body进行定位
- fixed:以浏览器为参照物,和父元素没有任何关系
- relative就是一个很乖的定位,原原本本的按照属于它的位置进行排放,这里可以看出,黑色板块即便设置了设置了偏移量,但下面红色的板块却照常摆放,就是因为两者都为relative,黑色板块只是设置了偏移量,它的本身还是在它原先的位置,因此红色板块才会那样显示
4、补充
为了更好的理解absolute定位,这里增加了一个div,方便理解
<!DOCTYPE html>
<html style="background-color: beige;">
<head>
<meta charset="utf-8" />
<title></title>
<link rel="stylesheet" type="text/css" href="./css/index.css">
</head>
<body>
<div style="background-color: black; width: 100px; height: 100px;" class="div1"></div>
<div style="background-color: black; width: 500px; height: 500px;" class="div4">
<div style="background-color: aqua; width: 100px;height: 100px;" class="div2"></div>
</div>
<div style="background-color: red; width: 100px;height: 100px;" class="div3"></div>
</body>
</html>
.div1{
position: relative;
left: 20px;
top: 20px;
}
.div4{
position: absolute;
left: 500px;
top: 200px;
}
.div2{
position: absolute;
top: 40px;
left: 100px;
}
.div3{
position: relative;
}
说明:
- 可以看到大的黑色板块和青蓝色板块是脱离文档流的,所以根本不会影响另外两个
- 而青蓝色是被包含在黑色里的,这里的黑色同样设置了absolute,因此它会在黑色板块里进行原先设置的定位
- 不管大的黑色设置什么定位属性,青蓝色都会被影响到
- 如果大的黑色设置的是不脱离文档流的属性,则小的黑色和红色会被影响