关于position:fixed的问题

position:fixed

生成绝对定位的元素,相对于浏览器窗口进行定位。
元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定。
在没有任何原因的影响下,position:fixed的定位不会出现问题,但是固定定位的父元素如果有transform:transalte(),固定定位的位置就会出现问题。

为什么会出现这种问题?

当元素祖先的 transform 属性非 none 时,定位容器由视口改为该祖先。

这与堆叠上下文有关。

堆叠上下文(Stacking Context):堆叠上下文是 HTML 元素的三维概念,这些 HTML 元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的 z 轴上延伸,HTML 元素依据其自身属性按照优先级顺序占用层叠上下文的空间。

MDN关于堆叠上下文的解释

文档中的层叠上下文由满足以下任意一个条件的元素形成:

文档根元素();
position 值为 absolute(绝对定位)或 relative(相对定位)且 z-index 值不为 auto 的元素;
position 值为 fixed(固定定位)或 sticky(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);
flex (flexbox) 容器的子元素,且 z-index 值不为 auto; grid (grid) 容器的子元素,且 z-index 值不为 auto; opacity 属性值小于 1 的元素(参见 the specification for opacity); mix-blend-mode 属性值不为 normal 的元素;
以下任意属性值不为 none 的元素: transform filter perspective clip-path mask / mask-image / mask-border isolation 属性值为 isolate 的元素;
-webkit-overflow-scrolling 属性值为 touch 的元素;
will-change 值设定了任一属性而该属性在 non-initial 值时会创建层叠上下文的元素;
contain 属性值为 layout、paint 或包含它们其中之一的合成值(比如 contain: strict、contain: content)的元素。
在层叠上下文中,子元素同样也按照上面解释的规则进行层叠。 重要的是,其子级层叠上下文的 z-index 值只在父级中才有意义。子级层叠上下文被自动视为父级层叠上下文的一个独立单元。

层叠上下文同z-index相似,使用z-index,添加不同的值造成层叠。

怎么解决呢

现今博主发现的解决方法就是将你需要固定定位的元素,使他的父元素不包含transform:translate()属性,或者使用margin调节新的位置。

(如有错误请指正!)

发布了28 篇原创文章 · 获赞 2 · 访问量 2881

猜你喜欢

转载自blog.csdn.net/weixin_45725020/article/details/103979805