微信公众号开发vue单页路由踩坑记 - 滚动穿透

这次迭代我们做一个 “老带新” 的活动页,总共分为 活动主页、分享登记页、邀请记录页、分享海报页。
我本人就使用了当前流行的vue框架开发,并且加入了前端路由,个人觉得单页用起来特别爽,这也为后面踩坑埋下了伏笔[捂脸哭]。
1、滚动穿透。


image.png

如上图,我有一个弹窗,然后弹窗里边是可以滚动的,可是当我滑动我的弹窗内容的时候,发现遮罩下面的页面也跟着滑动了,这就是经典的滚动穿透,好在同事在做别的功能的时候做了这个坑的处理,代码如下:

export function setHtmlScroll(v, flag) {
    if(flag) {
        v.curPos = document.documentElement.scrollTop || document.body.scrollTop;
        document.querySelector('html').style.position = 'fixed';
        document.querySelector('html').style.top = -v.curPos + 'px';
    }
    if(!flag) {
        document.querySelector('html').style.position = 'static';
        document.querySelector('html').style.top = 'auto';
        window.scrollTo(0, v.curPos);
    }
}

我把这个方法作为公共方法放在utils.js中,调用的时候,先引入:

import { setHtmlScroll } from "../js/utils.js";
data() {
  return {
    curPos: 0
  } 
}

然后在打开弹窗的时候调用:

setHtmlScroll(this, true);

在关闭弹窗的时候调用:

setHtmlScroll(this, false);

这样就能完美解决这个滚动穿透的问题了。不过我一开始使用没有成功,就是设置

document.querySelector('html').style.position = 'fixed';

并没能使底部的页面固定下来,仍然可以滑动,然后在我仔细地查找了我的dom结构以及style的时候发现,原来我的html和body都给了:height: 100%; 这就很尴尬了,去掉了之后就OK了,虚惊一场。
然而接下来我又发现,因为是单页路由嘛,所以html节点共用。就会造成以下场景:

从主页进入邀请页,再返回主页,在主页打开弹窗,再前往邀请页,发现邀请页滑动不了了。

想必有经验的朋友都知道是怎么回事了,没错,html节点共用,在主页弹窗打开的时候我设置了html的position为fixed,所以邀请页也会被固定住啦。
解决的方法也简单:在主页destroyed的时候放开html节点。

destroyed() {
    setHtmlScroll(this, false);
}

2、页面缓存
如图,我需要做一个缓存,避免输入框的值被丢失:


image.png

页面缓存也很简单:


image.png

现在路由中加入keepAlive为true,然后主入口文件路由使用:
image.png

然而加了缓存之后,又遇到了类似上面的场景。因为这个页面也有一个【活动规则】的打开弹窗,还有【用户协议】和【隐私协议】两个路由。
image.png

所以也会遇到

从这个页面【记为分享登记页】访问【用户协议】,再返回【分享登记页】,然后打开【活动规则】弹窗,此时html固定,然后再前网【用户协议】,用户协议滑动不了。

所以我又用了

destroyed() {
      setHtmlScroll(this, false);
}

然而,解决了【用户协议】无法滑动的问题,却又产生了新的问题。由于【记为分享登记页】是做了缓存的,所以退回是不会刷新的,此时页面上的【活动规则】弹窗仍然打开,而html的position被改为了static,滚动穿透又出现了,解决方法就是利用缓存页面的一个钩子,激活缓存页面钩子:activated。

activated() {
     setHtmlScroll(this, true);
}

不过需要先判断是否打开了弹窗,打开弹窗了才设置setHtmlScroll(this, true);
到此为止,关于单页的滚动穿透所带来的一系列的问题才就完全解决了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352