iOS 10 Safari:防止在固定覆盖后滚动并保持滚动位置

当显示固定位置覆盖时,我无法阻止主体内容滚动。类似的问题已经被问过很多次了,但是以前有效的所有技术似乎都不适用于iOS 10中的Safari。这似乎是最近的问题

一些注意事项:

  • 如果我将htmlbody都设置为overflow:hidden,则可以禁用滚动,但是这会使body内容滚动到顶部
  • 如果覆盖中的内容足够长,可以滚动,则主页内容将正确禁用滚动。如果覆盖中的内容不够长,无法引起滚动,则可以滚动主页内容
  • 我包含了一个来自https://blog.christoffer.online/2015-06-10-six-things-i-learnt-about-ios-rubberband-overflow-scrolling/ 在显示覆盖时禁用touchmove。这以前是有效的,但现在不再有效

以下是完整的HTML源代码:

<!doctype html>
<html>
<头>
<meta charset=“UTF-8”大于;
<meta name=“viewport”content=“width=设备宽度,初始比例=1”>
<脚本src=”https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js“&gt&lt/脚本>
<style type=“text/css”>
html,正文{
宽度:100%;
身高:100%;
保证金:0;
填充:0;
}
身体{
字体系列:arial;
}
#覆盖层{
显示:无;
位置:固定;
z指数:9999;
左:0;
右:0;
排名:0;
底部:0;
溢出:滚动;
颜色:#fff;
背景:rgba(0,0,0,0.5);
}
#覆盖跨度{
位置:绝对位置;
显示:块;
右:10px;
顶部:10px;
字体大小:粗体;
字体大小:44px;
光标:指针;
}
#叠加p{
显示:块;
填充:100px;
字体大小:36px;
}
#页面{
宽度:100%;
身高:100%;
}
a{
字体大小:粗体;
颜色:蓝色;
}
&lt/风格>
<脚本>
$(函数(){
$('a')。单击(函数(e){
e、 预防默认值();
$('body').css('overflow','hidden');
$('#page').addClass('disable-scrolling');//用于下面的touchmove技术
$('#overlay').fadeIn();
});
$(“#覆盖范围”)。单击(函数(){
$('body').css('overflow','auto');
$(“#page”).removeClass('disable-scrolling');//用于下面的touchmove技术
$(“#覆盖”).fadeOut();
});
});
/*技术来自http://blog.christoffer.me/six-things-i-learnt-about-ios-safaris-rubber-band-scrolling/ */
document.ontouchmove=函数(事件){
var isTouchMoveAllowed=true,target=event.target;
while(目标!==null){
if(target.classList&target.classList.contains('disable scrolling')){
isTouchMoveAllowed=false;
打破
}
target=target.parentNode;
}
如果(!isTouchMoveAllowed){
event.preventDefault();
}
};
&lt/脚本>
&lt/头>
<车身>
<div id=“overlay”>
<span&gt&时代&lt/span>
<p>固定式popover&lt/p>
&lt/部门>
<div id=“page”>
<strong>这是顶部&lt/strong&gt&书信电报;br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
大量可滚动内容<br>
asdfasdf<br>
<br>
<部门&gt&书信电报;a href=“”>显示Popover&lt/a&gt&lt/部门>
<br>
<br>
&lt/部门>
&lt/车身>
&lt/html>

请添加-webkit溢出滚动:触摸#覆盖元素

请在body标记的末尾添加以下javascript代码:

(函数(){
var_overlay=document.getElementById('overlay');
var _clientY=null;//记住触摸启动时的Y位置
_overlay.addEventListener('touchstart',函数(事件){
if(event.targetTouches.length==1){
//检测单触
_clientY=event.targetTouches[0].clientY;
}
},假);
_overlay.addEventListener('touchmove',函数(事件){
if(event.targetTouches.length==1){
//检测单触
禁用橡胶带(事件);
}
},假);
功能禁用RubberBand(事件){
var clientY=event.targetTouches[0]。clientY-\u clientY;
if(_overlay.scrollTop==0&clientY>0){
//元素位于其滚动条的顶部
event.preventDefault();
}
如果(IsOverlayTotalyScrolled()&clientY<0){
//元素位于其滚动条的顶部
event.preventDefault();
}
}
函数isOverlayTotallyScrolled(){
// https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollHeight#Problems_and_solutions
返回overlay.scrollHeight-overlay.scrollTop<=overlay.clientHeight;
}
}())

我希望它能帮助你

发表评论