前言
最近解决一个 wkwebview
的兼容性问题,需要JS
控制页面的滚动,踩了不少坑。
通常我们控制页面滚动用到下面几个api
。
window.scrollTo(x,y)
window.scrollX/window.scrollY
window.pageYOffset/window.pageXOffset
document.documentElement.scrollTop
document.body.scrollTop
window.scrollTo(x,y)
设置页面滚动。IE9+ 、firefox、chrome,opera
均支持该方式获取页面滚动高度值,忽略Doctype规则。
window.scrollX/Y
只读属性 firefox、chrome,opera
支持,IE
不支持,忽略Doctype规则
window.pageXOffset
只读属性 IE9+ 、firefox、chrome,opera
均支持,忽略Doctype规则
document.documentElement 和 document.body(划重点)
网上清一色:使用DTD定义文档时(<!DOCTYPE ...>
),使用document.documentElement
,否则 使用document.body
。除此之外,无其他兼容问题。
发现问题:公司ios移动端使用wkwebview,h5页面均定义DTD<!DOCTYPE html>
,所以使用了document.documentElement.scrollTop
。结果发现部分ios手机不兼容,比如:iphone xs 12.4.1
使用document.body
才可以。
至少得出结论:关于document.documentElement
和 document.body
,safari
内核不符合DTD规则,某些版本仅支持document.body
控制滚动
解决方案
document.scrollingElement.scrollTop = 200
// 等价于
document.documentElement.scrollTop = 200
document.body.scrollTop = 200
Document.scrollingElement
可以解决上述safari不兼容性问题, 而且更清爽。虽然这个APIIE
从ie12-Edge
才兼容,但是移动端使用不存在兼容性问题。
通用兼容性方案(支持桌面 移动端 IE等)
移动端建议使用Document.scrollingElement
即可,想全端兼容,大而全的写法如下:
//以获取scrolltop以及设置scrolltop为例
function getScrollTop() {
return window.pageYOffset
|| document.documentElement.scrollTop
|| document.body.scrollTop;
}
function setScrollTop(height) {
document.documentElement.scrollTop = height;
document.body.scrollTop = height;
window.pageYOffset = height;
}