什么是定位?(position)
css中的position属性,position有四个值:absolute/relative/fixed/static(绝对/相对/固定/静态(默认))通过定位属性可以设置一些不规则的布局,使用top、bottom、left、right来调整元素的位置。
值 | 描述 |
---|---|
absolute(绝对定位) | 脱离文档流,通过 top,bottom,left,right 定位。选取其最近一个最有定位设置的父级对象进行绝对定位,如果对象的父级没有设置定位属性,absolute元素将以body坐标原点进行定位。 |
fixed(固定定位) | 脱离文档流,这里所固定的参照对像是可视窗口而并非是body或是父级元素。使用了fixed的元素不会随着窗口的滚动而滚动。 |
relative(相对定位) | 不脱离文档流,生成相对定位的元素,如果没有定义偏移量,对元素本身没有任何影响,不影响其的布局 |
static(静态定位 默认值) | 不脱离文档流,默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。 |
依我来看定位其实很好理解,就是把你的元素可以定位到你想要的地方;css定位和浮动类似,都是设计网页布局的操作;相对于浮动来说我们的定位属性更为灵活一些,可以针对更多个性化的布局方案来使用,通过设置position的值就可以让你的元素想去哪就去哪,可以实现更精准的布局。见过每个界面右下角基本上都有的返回顶部的那个元素吗;不管的你的浏览到哪里,这个元素始终会在你的右下角显示,不会变换位置,这个效果就是运用到了我们的定位属性;在网页布局中,灵活的运用浮动和定位属性,可以让我们的界面更为完美。
我们先来看看relative(相对定位),来举个例子:
代码如下
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS定位</title>
<style>
.box1{
width: 200px;
height: 200px;
background: #000000;
}
.box2{
width: 200px;
height: 200px;
position: relative;/*相对定位,不设置偏移量,对元素没有任何影响,不影响其他布局*/
background: #ffff00;
}
.box3{
width: 200px;
height: 200px;
background: #ff00ff;
}
</style>
</head>
<body>
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
</body>
</html>
效果
没有设置偏移量,对元素没有任何影响,不影响其他布局;
如果加上偏移量的话他不会脱离文档流,从当前位置按照自身偏移量进行显示
代码如下
.box1{
width: 200px;
height: 200px;
background: #000000;
}
.box2{
width: 200px;
height: 200px;
position: relative; left: 200px; top: 200px;/*离左边200px,顶部200px*/
background: #ffff00;
}
.box3{
width: 200px;
height: 200px;
background: #ff00ff;
}
不影响其他元素布局,对自身进行偏移。
总结:可以看到相对定位不会脱离文档流,不会影响其他元素布局,是对自身进行偏移。
absolute(绝对定位)会脱离文档流,选取其最近一个最有定位设置的父级对象进行绝对定位,如果对象的父级没有设置定位属性,absolute元素将以body坐标原点进行定位。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS定位</title>
<style>
.box{
width: 400px;
height: 400px;
margin: 100px auto;
background: #666666;
}
.box1{
width: 100px;
height: 100px;
position: absolute; left: 50px; top: 50px;/*绝对定位,脱离文档流*/
background: #000000;
}
.box2{
width: 200px;
height: 200px;
background: #ffff00;
}
</style>
</head>
<body>
<div class="box">
<div class="box1"></div>
<div class="box2"></div>
</div>
</body>
</html>
效果
很明显它脱离了文档流,但是因为我们没有给他的父元素设置属性,所以它会以body为坐标原点来进行定位;
我们如果给它的父元素添加上定位属性,它便会以它的父元素来进行定位。
.box{
width: 400px;
height: 400px;
margin: 100px auto;
position: relative;/*给父元素添加定位属性*/
background: #666666;
}
.box1{
width: 100px;
height: 100px;
position: absolute; left: 50px; top: 50px;/*绝对定位,脱离文档流*/
background: #000000;
}
.box2{
width: 200px;
height: 200px;
background: #ffff00;
}
给他的父元素添加上定位属性后,他就会在父元素内,距左边, 顶部各50px。
总结:绝对定位会根据它的父级进行定位,如果父级没有定位属性,会继续找父级的父级,如果父级的父级也没有定位属性,就会一直找下去;如果都没有定位属性,那么它会以body来进行定位。
fixed(固定定位)
刚刚我上面说的那个返回顶部的效果就是通过固定定位把元素定位到界面的底部来实现的。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS定位</title>
<style>
body{
height:4000px;/*给body设置一个高度,让它显示出来滚动条*/
background: pink;/*设置个颜色更容易看清楚*/
}
div{
background:red;
position: fixed;
bottom: 50px;/*距底部50px*/
right: 0;
}
</style>
</head>
<body>
<div>返回顶部</div>
</body>
</html>
效果如下
这个不就是达到了我们想要它存在的位置了吗,但是要是想要实现点击返回顶部的效果,还需要配合其他属性来实现。
总结:固定定位所固定的参照对像是浏览器而并非是body或是父级元素。使用了fixed的元素不会随着窗口的滚动而滚动
同时absolute(绝对定位)和fixed(固定定位)属性都能让内联元素具备块的特性支持宽高,让块元素具备内联的特性使元素默认宽根据内容决定。
还有一个sticky(粘性定位)因为各大浏览器对于sticky的兼容问题,而且JS也可以实现这个功能,在这里就不进行深入了,了解一下就好。
‘盒位置根据正常流计算(这称为正常流动中的位置),然后相对于该元素在流中的 flow root(BFC)和 containing block(最近的块级祖先元素)定位。在所有情况下(即便被定位元素为 table时),该元素定位均不对后续元素造成影响。当元素 B 被粘性定位时,后续元素的位置仍按照 B 未定位时的位置来确定。position: sticky对 table元素的效果与 position: relative 相同’。