真实面经题目 · 原创解析
CSS position 属性说说,分别都是相对于谁
这题考察 position 各取值的文档流影响和 containing block 规则。回答要特别纠正 absolute 不一定相对父元素、fixed 也可能受特殊祖先影响。
真实面经题目 · 原创解析
这题考察 position 各取值的文档流影响和 containing block 规则。回答要特别纠正 absolute 不一定相对父元素、fixed 也可能受特殊祖先影响。
position 常见值有 static、relative、absolute、fixed、sticky。static 是默认文档流,top、left 等偏移无效;relative 仍占据原位置,相对自身原位置偏移;absolute 脱离文档流,通常相对最近 position 非 static 的祖先定位,没有则相对初始包含块;fixed 通常相对视口,但遇到 transform、filter、perspective 等祖先时可能改用该祖先作为参照;sticky 先按正常文档流布局,滚动到阈值后在最近滚动容器内吸附。
static 是默认值,元素按正常文档流排列。relative 不脱离文档流,偏移后原来的占位仍保留,所以它常用于给子元素 absolute 提供定位上下文。
absolute 会脱离文档流,不再占据普通流空间。它的偏移参照不是必然父元素,而是最近的定位祖先,也就是 position 不是 static 的祖先;找不到时相对初始包含块。
fixed 通常固定在视口上,不随页面滚动。但如果祖先有 transform、filter、perspective、contain 等会创建特殊包含块的属性,fixed 可能相对该祖先定位。
sticky 是 relative 和 fixed 的混合。它需要设置 top、bottom、left 或 right 阈值,并且受最近滚动容器和父容器边界限制;父容器太矮或 overflow 设置不当会导致不生效。
定位问题不要只背属性名,要先判断元素是否脱离文档流,再找 containing block,最后看偏移属性和层叠上下文。这样才能解释弹层、吸顶和遮挡问题。
不一定。它相对最近的定位祖先,父元素只有在 position 不是 static 时才会成为参照。
它仍保留原占位,其他元素按它原本位置排布。视觉上偏移可能覆盖别人,但普通流布局不会重新为偏移后的位置让位。
常见原因是没有设置 top 等阈值,父容器高度不够,最近滚动祖先不是预期元素,或 overflow 设置导致吸附范围受限。
某些属性会让祖先创建 fixed 的包含块,例如 transform。此时 fixed 不再单纯相对视口,而可能相对该祖先。