问题排查:切换页面时position_fixed会抖动

大家看这个浮动的容器哈

我在切换页面的一瞬间注意看

是不是抖一下

回来也是

那我们把动画放慢看一下

我先去到别的页面

好注意看

好暂停

我们来检查一下这元素

在这里

那他现在呢

是一个 position 等于 fixed

然后 top 等于 100px

我们都知道

fixed 是基于浏览器窗口来定位的

也就是说他这个100(px)

应该是基于浏览器顶端为100

那我们先把它改成0看一下

大家看现在这个0

他明显就不是浏览器的顶端

而是这个主区域的顶端

为什么会这样呢

我们来看一下 position fixed

他最后有一句话说

当元素祖先的这几个属性非空时

容器由适口改为该祖先

也就是说这个 fixed 元素

他的父极元素有任意一个

那几个属性不为空

他就会基于这个容器而定位

而不是浏览器窗口了

这回我们就不难理解

为什么他切换的时候会抖

因为在切换的过程中

他是有一个动画效果的

大家看

这个动画就是采用了 transform 来实现的

我们来验证一下

我们先把这个动画去掉

刷新

大家看

这回就不会抖了

那如果我们既想保留动画

还不想让他抖怎么办呢

我们可以这样想办法

让这个浮动的元素

从dom结构上

不要放在这个有动画的这个容器里

比如说我们放在body里

看一下代码

就这个我们想办法把它放在body里

那这种需求呢我们就可以考虑

封装一个公用的组件

比如我们希望这里这样写:in-body

然后呢in-body的里面的所有的元素

都会自动被放到body里边

好我们来写一下这个组件

首先呢我们在 components (目录)里创建一个文件

在这里我们就叫

InBody.vue

这里边很简单我们这样写

这些都不要

就保留一个

mountain 的

destroy 的

其他都不要了

然后 month 的里这样写

我们可以通过这个方法拿到

这个组件的dom节点

我们把它放到一个变量里

好然后呢我们把它放到body里

document.body.appendChild

把这个node传进来

然后呢 destroyed 的就很简单

我们就直接把它移除掉

no

点 remove

这就完事了

然后这块呢我们就定一个插槽就行了

很简单

这样这个组件就写完了

我们再把它注册到全局

因为他比较公用嘛

比如说我们在这写

import

InBody.vue

然后这也叫 InBody

然后把它 vue.component 注册到组件里

就叫 in body

好这样的话呢应该就能用了

我们来试一下刷新

切换回来

没有问题

浮动也没问题

以后呢这个项目里

如果再有其他内容需要放在body里

就直接用这个组件就可以了

最后更新于