正常状况下,微信浏览器页面下拉后能够看到一个 『该网页由 xxxx 提供』,由于页面会提供给第三方使用,所以有一个需求是隐藏该网址。javascript
由于页面都是已经存在的,而且有不少个页面,所以想要的解决方案是一个通用的解决方案(至少也得90%页面通用),不去修改具体每一个页面的代码。css
时间:2019-09-11 16:43:48html
忽然想了下,以为须要 一个线上 DEMO,这样后面在看到这个问题,能够找到这个文章的解决方案是否能真的解决这个问题。前端
线上DEMO 地址,点下面链接。(若是打不开,多是由于使用 github pages 部署,被微信浏览器给屏蔽了)java
zhongxia245.github.io/demo/pages/…react
完整案例源码:点这里 Githubios
时间:2019-09-11 22:50:10
根据 @True不想说话 同窗的方法,亲测有效,简单粗暴。git
可使用 CSS 来实现这个需求github
body:before {
width: 100%;
height: 100%;
content: ' ';
position: fixed;
z-index: -1;
top: 0;
left: 0;
background: #fff;
}
复制代码
线上案例web
Iphone7 IOS12 微信浏览器下,亲测有效,其余设备没有测试过
解决这个问题,直接 google 一顿搜索,得出下面的结论。
首先须要查一下微信开发者的文档,看下是JS SDK 有方法能够用来控制这个网址的显示隐藏,遗憾的是,并无提供这类方法。
既然『该网页由 xxxx 提供』是页面已经滑到顶部了继续下拉才出现的,那么禁止页面下拉不就能够解决问题了嘛,小菜一碟。
// 禁止页面滚动
document.body.addEventListener('touchmove', function(e) {
e.preventDefault()
}, false)
复制代码
too young too simple , addEventListener
方法的第三个参数有兼容性问题。
function preventDefault(e) {
e.preventDefault();
}
// Chrome 5一、Firefox 49及以上
// 禁用触摸滚动页面
document.addEventListener('touchmove', preventDefault, {passive: false});
// 恢复触摸滚动页面
document.removeEventListener('touchmove', preventDefault, {passive: false});
// Chrome 5一、 Firefox 49如下
document.addEventListener('touchmove', preventDefault, false);
document.removeEventListener('touchmove', preventDefault, false);
复制代码
如今这个时间点,chrome 78 已经出来了, 所以禁止页面滚动就成了这样。
// 禁止页面滚动
document.body.addEventListener('touchmove', function(e) {
e.preventDefault()
}, {passive: false})
复制代码
这个时候,你会发现,页面的确不能下拉,那么 『该网页由 xxxx 提供』 不就看不到了吗,完美。
不过改出新问题了,页面不能滚动了,超过一屏的页面,只能看一半,这谁能忍。所以还须要解决 禁止 touchmove 后,页面滚动的问题。
解决这个问题能够用下面代码,指定的 DIV 容器能够内部滚动,这里就让 react 组件渲染的 DOM 节点 去支持滚动为例。
let overscroll = function(el) {
el.addEventListener('touchstart', function() {
let top = el.scrollTop
let totalScroll = el.scrollHeight
let currentScroll = top + el.offsetHeight
//If we're at the top or the bottom of the containers
//scroll, push up or down one pixel.
//
//this prevents the scroll from "passing through" to
//the body.
if (top === 0) {
el.scrollTop = 1
} else if (currentScroll === totalScroll) {
el.scrollTop = top - 1
}
})
el.addEventListener('touchmove', function(evt) {
//if the content is actually scrollable, i.e. the content is long enough
//that scrolling can occur
if (el.offsetHeight < el.scrollHeight) evt._isScroller = true
})
}
overscroll(document.querySelector('#app'))
document.body.addEventListener(
'touchmove',
function(evt) {
console.log(evt._isScroller)
//In this case, the default behavior is scrolling the body, which
//would result in an overflow. Since we don't want that, we preventDefault.
if (!evt._isScroller) {
evt.preventDefault()
}
},
{ passive: false }
)
复制代码
只有这个 js 仍是有问题的,须要设置一下 #app 的高度,而且超出长度则滚动。
由于div 容器内的滚动效果不太好,没有弹性滚动,就是手指中止滑动,页面就中止滑动了。由于增长了 -webkit-overflow-scrolling: touch;
来加一个弹性滚动效果。
这里在Iphone7 IOS12 下,和一加7 (应该是这个型号) 感受没有什么问题,体验还能够。可是网上看,使用 这个属性会引起 BUG。
#app {
height: 100vh;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
复制代码
解决这些问题,能够参考这个文章,文章写的仍是比较详细了的,给做者点个赞。 《深刻研究-webkit-overflow-scrolling:touch及ios滚动》。
Bug 的表现就是:偶尔卡住或不能滑动。
Iphone7, IOS12 下,一直没有复现出来,不知道是否是特定的手机和系统版本才会有这个问题。
解决方案:就是在webkit-overflow-scrolling:touch
属性的下一层子元素上,将height加1%或1px。从而主动触发scrollbar。
main:after {
min-height: calc(100% + 1px)
}
复制代码
固然偶尔卡住了只是其中一个问题, 除此以外,这个属性还有不少bug,包括且不限于如下几种:
一、滚动中 scrollTop 属性不会变化
二、手势可穿过其余元素触发元素滚动
三、滚动时暂停其余 transition
【引用文章做者的原话】
因此目前来看,若是不想那么费心,直接上
iScroll
或者better-scroll
吧,我以为 better-scroll 仍是挺好用的。若是你喜欢偷懒,那么接着用-webkit-overflow-scrolling:touch
也没什么问题。毕竟移动端的水太深了,你永远不知道下一个问题是发生在safari仍是x5内核浏览器上。
PC Web 的时候,开发最苦逼的是 IE 兼容性,如今 Mobile Web 开发,最苦逼的各个手机的兼容性问题。兼容性是前端开发避不开的深坑呀。
解决一个问题,又引起了更多的问题出来,生生不息,无穷尽也。
没有代码就没有 BUG。
这篇文章的内容,就大概下面这些了。
一、《微信浏览器禁止页面下拉查看网址(不影响页面内部scroll)》
二、《深刻研究-webkit-overflow-scrolling:touch及ios滚动》