分享

CSS进阶(14)——position:absolute relative

 一本正经地胡闹 2019-08-16

  上章我们聊了和absolute的流体特性以及和absolute搭配使用的CSS属性,本章我们就来聊一聊position家族的另外两大成员——relative和fixed。

 

1.relative的定位(不推荐使用)

  理论上relative/absolute/fixed都能对absolute的"包裹性"以及"定位"产生限制,但只有relative能使得元素保持在正常的文档流中,因此我们往往使用absoluted搭配relative使用。之前讲到,left/right/top/bottom是定位家族的特有属性,因此relative也支持定位,且relative定位有两大特性:一是相对自身定位,二是“无侵入”。为了更好的展示relative的特性,我们引入absolute元素进行对比。

  测试一:left:0,top:0;

  1. <!-- relative定位测试 -->
  2. <div class="container">
  3. <div class="relative">relative</div>
  4. <div class="absolute">absolute</div>
  5. </div>
  6. <style>
  7. .container{
  8. width: 200px;
  9. height: 200px;
  10. background: #999999;
  11. padding:100px;
  12. border:5px solid red;
  13. position: relative;
  14. }
  15. .relative{
  16. width: 100px;
  17. height: 100px;
  18. background: green;
  19. position: relative;
  20. left: 0;
  21. top: 0;
  22. }
  23. .absolute{
  24. width: 100px;
  25. height: 100px;
  26. background: yellow;
  27. position: absolute;
  28. left: 0;
  29. top: 0;
  30. }
  31. </style>

  第一个测试,absolute元素的包含块是父元素的padding-box,因此absolute移到包含块左上角,而relative元素纹丝不动。

  测试二:left:100px;top:100px;

 测试二的结果表明relative元素是相对于自身发生偏移的,也就是说relative的偏移位置跟他原来所处的位置有关,也就是第一个特性——相对自身定位。

  测试三:加入吃瓜群众。

  relative定位前:

  1. <!-- relative定位测试 -->
  2. <div class="container">
  3. <div class="">我是一个吃瓜群众</div>
  4. <div class="relative">relative</div>
  5. <!-- <div class="absolute">absolute</div> -->
  6. <div class="">我是一个吃瓜群众</div>
  7. </div>
  8. <style>
  9. .container{
  10. width: 200px;
  11. height: 200px;
  12. background: #999999;
  13. padding:100px;
  14. border:5px solid red;
  15. position: relative;
  16. }
  17. .relative{
  18. width: 100px;
  19. height: 100px;
  20. background: green;
  21. position: relative;
  22. /*left: 100px;
  23. top: 100px;*/
  24. }
  25. .absolute{
  26. width: 100px;
  27. height: 100px;
  28. background: yellow;
  29. position: absolute;
  30. left: 100px;
  31. top: 100px;
  32. }
  33. </style>

  

  relative定位后

  1. <!-- relative定位测试 -->
  2. <div class="container">
  3. <div class="">我是一个吃瓜群众</div>
  4. <div class="relative">relative</div>
  5. <!-- <div class="absolute">absolute</div> -->
  6. <div class="">我是一个吃瓜群众</div>
  7. </div>
  8. <style>
  9. .container{
  10. width: 200px;
  11. height: 200px;
  12. background: #999999;
  13. padding:100px;
  14. border:5px solid red;
  15. position: relative;
  16. }
  17. .relative{
  18. width: 100px;
  19. height: 100px;
  20. background: green;
  21. position: relative;
  22. left: 100px;
  23. top: 100px;
  24. }
  25. .absolute{
  26. width: 100px;
  27. height: 100px;
  28. background: yellow;
  29. position: absolute;
  30. left: 100px;
  31. top: 100px;
  32. }
  33. </style>

  

  可以发现:relative元素相对于自身定位前后,吃瓜群众的位置保持不变,只有relative相对于自身发生了偏移,因此relative是一种无侵入的定位,不会影响其他元素原来的布局行为。

  除此之外,relative定位还有两个点值得一提,首先是相对定位元素的left/right/top/bottom的百分比值是相对于包含块进行计算的,还有一点是当relative元素同时出现相同方向上的定位时(如left:0,right:0)不会保持absolute的拉伸特性,而是取文档流方向的一边作为唯一值,也就是只保留left和top。

  在测试三中,我们看到了一个层叠现象,由于relative元素的层叠顺序是"鬼畜"级别的(我也不懂这是什么意思),因此作者不建议使用relative进行定位。因此relative几乎可以看作是absolute的附属css了。

2.无依赖固定定位(fixed)

  position:fixed的固定定位元素的"包含块"是根元素(近似<html>),也就是除了根元素没人能限制fixed元素不知你是否还记得无依赖绝对定位的特性,下面我们来测试一下,是否有无依赖固定定位。

  1. <!-- 无依赖固定定位 -->
  2. <div class="container">
  3. <span>随便说两句</span>
  4. <div class="fixed"></div>
  5. </div>
  6. <style type="text/css">
  7. .container{
  8. width: 200px;
  9. height: 200px;
  10. background: #999999;
  11. padding:100px;
  12. border:5px solid red;
  13. }
  14. .fixed{
  15. width: 100px;
  16. height: 100px;
  17. background: green;
  18. position: fixed;
  19. }
  20. </style>

  经过测试,确实存在无依赖固定定位,且表现和无依赖绝对定位“相同”。那么知道了这个特性有什么用呢?个人认为,没什么软用,既然用了固定定位,就是要利用其依赖跟元素进行定位,所以无依赖固定定位也就没什么软用了。

3.利用fixed固定定位生成滚动条锁定的弹窗

  通常情况下,弹窗功能需要依托浏览器进行定位,而不是某个元素,因为我们希望弹窗总能出现在屏幕的“居中”位置,要实现这个功能非常简单,只需要用到固定定位即可。

  1. <!-- 固定定位生成弹窗 -->
  2. <div class="fixed">
  3. <div>我是弹窗</div>
  4. </div>
  5. <style>
  6. html,body{
  7. margin: 0;
  8. height: 200%;
  9. background-image: url('../小和尚.jpg');
  10. }
  11. .fixed{
  12. position: fixed;
  13. top: 0;
  14. bottom: 0;
  15. right: 0;
  16. left: 0;
  17. background: rgba(0,0,0,0.5);
  18. margin: auto;
  19. }
  20. .fixed div{
  21. position: absolute;
  22. right: 0;
  23. top: 0;
  24. left: 0;
  25. bottom: 0;
  26. width: 40%;
  27. height: 30%;
  28. background: #fff;
  29. margin: auto;
  30. overflow: auto;
  31. }
  32. </style>

  

 我们实现了居中效果,但还有一个麻烦就是fixed元素的包含块是html,因此html的内容有滚动条的时候,在弹窗页面我们依旧可以控制html滚动条的滚动,这样的用户体验并不好。

  因此如果我们需要一个滚动条固定的弹窗效果,必须让滚动条不在html上,我们可以在html下面生成一个父级容器,让父级容器来生成滚动条,这样就不会影响fixed固定定位了。如下所示

  1. <!-- 固定定位生成不能滚动的弹窗 -->
  2. <div class="father">
  3. <div style="height: 200%;background: url('../小和尚.jpg');">我来生成滚动条</div>
  4. <div class="fixed">
  5. <div>我是弹窗</div>
  6. </div>
  7. </div>
  8. <style>
  9. html,body{
  10. margin: 0;
  11. height: 100%;
  12. overflow: hidden;
  13. }
  14. .father{
  15. height: 100%;
  16. overflow: auto;
  17. }
  18. .fixed{
  19. position: fixed;
  20. top: 0;
  21. bottom: 0;
  22. right: 0;
  23. left: 0;
  24. background: rgba(0,0,0,0.5);
  25. margin: auto;
  26. }
  27. .fixed div{
  28. position: absolute;
  29. right: 0;
  30. top: 0;
  31. left: 0;
  32. bottom: 0;
  33. width: 40%;
  34. height: 30%;
  35. background: #fff;
  36. margin: auto;
  37. overflow: auto;
  38. }
  39. </style>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多