css乱象:fixed元素被margin牵着鼻子走?

本以为position:fixed元素脱离了文档流完全不会被底部文档流影响,但在做网页练手的时候发现完全不是这样。举个例子,网页底部有一个#test1 的空元素,设置它的margin-top: 30px。在网页顶部设置一个默认position:fixed元素。具体代码如下:

<style type='text/css'>
  #test2 {
    margin-top: 30px;
  }
  #test1 {
    position: fixed;
    width: 500px;
    height: 300px;
    background-color: blue;
  }
  </style>
  </head>
  <body>
    <div id="test2">
    </div>
    <div id="test1">
    </div>
  </body>

最后效果显示为:


1_1.png

显然,位于网页顶部的#test2受到了#test1margin-top的影响。
可以很明显地发现问题的最大原因是在于没有对position:fixed元素的offset properties(偏移特性):top, bottom, left and right进行设置。
但为什么最后显示效果会是这样呢?在SO上找到了详细的解答

  • test1的父元素是body,而body通常会有一个默认的margin:8px的设定。由于CSS的垂直margin塌陷原则( margin collapsing)(这里是top margin of a box and top margin of its first in-flow child),body#test1margin-top'塌陷'为统一的margin-top:90px
  • 同时,虽然通过设置#test2position:fixed,我们已经将#test2从文档流中脱离了出来,并且它的 containing block 已经不再是body,而是viewport
  • 但由于我们并没有设置#test2offset properties(偏移特性),所以#test2自动使用了CSS offset properties的默认值autoauto会将元素放置在其在正常文档流中本应有的位置

所以我们会得到如上图所示的效果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,686评论 1 92
  • CSS 是什么 css(Cascading Style Sheets),层叠样式表,选择器{属性:值;属性:值}h...
    崔敏嫣阅读 5,346评论 0 5
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 28,078评论 1 45
  • 1.场景内所有物体设为static,light map static 2.设置光源属性: indirect mul...
    于_鱼呱呱阅读 4,381评论 0 1
  • 小雨溅栏处,大雨湿罗幕。望天际入云处,不知晖路途。我欲入云寻觅,又恐滂沱似海。天际雨连珠,往返遥路漫,何似在...
    张张豆阅读 1,950评论 0 1