请使用chrome浏览器敲打例子代码!

长久以来,我和部分同学对css中position:fixed的理解是该元素相对屏幕视口的定位。然而并不是,以下摘要自[MDN](
https://developer.mozilla.org...:

position:fixed
不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed
属性会创建新的层叠上下文。当元素祖先的 <span style="color: #f00;">transform 属性非
none</span> 时,容器由视口改为该祖先。

什么意思呢?我们用例子来表示。

下面的例子是元素相对body的定位:

<div class="parent">
    <div class="son">
        我是fixed元素
    </div>
    <div class="other">
        我是其他元素
    </div>
</div>
body {
    height: 2000px;
}
.son {
    position: fixed;
    left: 100px;
    top: 100px;
    width: 100px;
    height: 100px;
    background: #f00;
}
.other {
    height: 1000px;
}

这个例子里,body的滚动条滚动后,son元素的位置都是相对屏幕视口的位置。根据MDN的说明,改下代码的css部分添加parent元素样式:

.parent {
    margin-top: 100px;
    height: 500px;
    overflow-y: auto;
    background: #ff0;
    transform: translate(0,0);
}

这个时候,会发现滚动body的滚动条的时候,son元素跟着parent一起走了。然而,滚动parent的滚动条,son元素并没有按照想象中那样固定在parent容器的一个位置上,而是表现为absolute的效果。(这样就不能做我们心爱的吸顶效果了)。

整个例子下来,就总结出一句:这不是蛋疼吗?既然fixed在transform里变成了absolute的行为,为毛transform还要去影响fixed呢?

引用:
https://developer.mozilla.org...
http://www.zhangxinxu.com/wor...


陶留军
166 声望1 粉丝

从业十年,略知前端