CSS

定位的类型

在最新的 CSS 规范中,定位的元素一共分为四种类型:

  • relative:相对定位元素
  • absolute:绝对定位元素
  • fixed:固定定位元素
  • sticky:粘性定位元素

如果元素没有设置 position 属性,默认为 static ,其所有定位相关的属性(top/bottom/left/right/z-index)就会失效。
2021-07-31-19-40-11-262273.png
在不修改 position 属性的情况下,冒然给它设置 topleft等属性,会发现它岿然不动。
2021-07-31-19-40-11-404588.png

relative:相对定位

相对定位是指元素在原来的位置上,进行一定的偏移,具体偏移到哪里,还是得看 top/bottom/left/right 这四个属性的值。
下面给一个元素设置为相对定位(position: relative;),然后让元素距离顶部和左边都为 30px。

  1. <style>
  2. div {
  3. width: 200px;
  4. height: 200px;
  5. background: steelblue;
  6. }
  7. .relative {
  8. position: relative;
  9. top: 30px;
  10. left: 30px;
  11. }
  12. </style>
  13. <body>
  14. <div class="relative"></div>
  15. <body/>

下面的图片就是元素没有加上 .releative和加上 .releative 的区别。
2021-07-31-19-40-11-517589.png
元素在相对定位的时候,其初始位置会被保留下来,也就是原来的位置上会留白。

  1. div {
  2. display: inline-block;
  3. width: 200px;
  4. height: 200px;
  5. }
  6. .box1 {
  7. background: red;
  8. }
  9. .box2 {
  10. background: yellow;
  11. }
  12. .box3 {
  13. background: blue;
  14. }
  15. .relative {
  16. position: relative;
  17. top: 30px;
  18. left: 30px;
  19. }

先为元素定义好样式,在三个元素都没有进行偏移时,如下所示:

  1. <body>
  2. <div class="box1"></div>
  3. <div class="box2"></div>
  4. <div class="box3"></div>
  5. <body/>

2021-07-31-19-40-11-639588.png
如果给第二个元素加上相对定位,第二个元素就会向右边和下边进行偏移,同时在原始的位置会空出来一块。

  1. <body>
  2. <div class="box1"></div>
  3. <div class="box2 relative"></div>
  4. <div class="box3"></div>
  5. <body/>

2021-07-31-19-40-11-786587.png

absolute:绝对定位

绝对定位不会相对于原来的位置定位,而是会向上查找,找到一个非 static 的祖先元素进行定位,如果一直到 body 都没有非 static 的元素,则会相对于 body 来进行定位。

  1. <style>
  2. body { /* 清理body默认样式 */
  3. margin: 0;
  4. padding: 0;
  5. }
  6. .box {
  7. margin: 30px;
  8. display: inline-block;
  9. width: 300px;
  10. height: 300px;
  11. }
  12. .box1 {
  13. position: relative;
  14. border: 3px solid red;
  15. }
  16. .box2 {
  17. border: 3px solid yellow;
  18. }
  19. .box3 {
  20. border: 3px solid blue;
  21. }
  22. .absolute {
  23. /*
  24. position: absolute;
  25. top: 30px;
  26. left: 30px;
  27. */
  28. width: 100px;
  29. height: 100px;
  30. background-color: aquamarine;
  31. }
  32. </style>
  33. <body>
  34. <div class="box box1">
  35. <div class="box box2">
  36. <div class="box box3">
  37. <div class="absolute"></div>
  38. </div>
  39. </div>
  40. </div>
  41. </body>

2021-07-31-19-40-11-896583.png
在未给最内部的 div 设置 position 属性时,它是紧挨着 div.box3 的边框的。下面给内部的 div 加上 position: absolute; ,让其进行绝对定位。

  1. .absolute {
  2. position: absolute;
  3. top: 30px;
  4. left: 30px;
  5. width: 100px;
  6. height: 100px;
  7. background-color: aquamarine;
  8. }

2021-07-31-19-40-12-006889.png
由于外面三层的 div.box 都是默认的 static 状态,所以绝对定位的元素会相对于 body 进行定位,距离 body 的顶部和左边 30px。
现在,给 div.box2 加上一个相对定位,此时的绝对定位元素就会相对于 div.box2 来进行定位。

  1. .box2 {
  2. position: relative;
  3. border: 3px solid yellow;
  4. }

2021-07-31-19-40-12-122872.png
绝对定位除了定位的元素不同,它的初始位置也不会被保留,相当于脱离了文档流。这里可以用之前相对定位的案例,布局三个 div,让中间的 div 进行绝对定位。

  1. <style>
  2. div {
  3. display: inline-block;
  4. width: 200px;
  5. height: 200px;
  6. }
  7. .box1 {
  8. background: red;
  9. }
  10. .box2 {
  11. background: yellow;
  12. }
  13. .box3 {
  14. background: blue;
  15. }
  16. .absolute {
  17. position: absolute;
  18. top: 30px;
  19. left: 30px;
  20. }
  21. </style>
  22. <body>
  23. <div class="box1"></div>
  24. <div class="box2 absolute"></div>
  25. <div class="box3"></div>
  26. </body>

2021-07-31-19-40-12-237878.png
可以看到,中间的 div 会相对于 body 进行定位,同时,它原来的位置也不会被保留。

fixed:固定定位

理解了相对定位和绝对定位,固定定位就比较好理解了。固定定位会相对于视窗进行定位,而且和绝对定位一样也会脱离文档流。这里写一个简单的例子:

  1. <style>
  2. .box {
  3. width: 200px;
  4. height: 200px;
  5. border: 1px solid red;
  6. margin: 100px;
  7. }
  8. .fixed {
  9. position: fixed;
  10. top: 30px;
  11. left: 30px;
  12. width: 100px;
  13. height: 100px;
  14. background-color: cadetblue;
  15. }
  16. </style>
  17. <body>
  18. <div class="box">
  19. <div class="fixed"></div>
  20. </div>
  21. </body>

2021-07-31-19-40-12-374870.png

sticky:粘性定位

粘性定位可以理解为相对定位和固定定位的缝合,会出现这个属性主要是现在很多 H5 页面都会有这种在顶部固定的导航栏。

  1. .sticky {
  2. position: sticky;
  3. top: 0;
  4. margin-top: 50px;
  5. }

当给一个元素设置为粘性定位时,如果设置了 top: 0;,粘性定位的元素在它距离视窗顶部大于 0 的时候,会按照默认布局来,也就是和相对定位表现一致。一旦其距离顶部的距离等于 0,这元素会固定在窗口的这个地方,此时的表现和固定布局表现一致。
具体的效果如下:
2021-07-31-19-40-13-080935.gif
有了这个属性就可以少些很多 JavaScript 代码了,通过几行 CSS 就能实现一起需要引入一个插件才能实现的功能。