可能我们经常做这样的弹窗对吧,兴许我们绝对很简单,两下搞定:

  弹窗的页面结构代码:

		<!-- 弹窗模块  引用时移除static_tip类-->
<div class="mask" ontouchstart = "return false" style="display:none"></div>
<div class="main_venue_tip" style="display:none">
<i class="close"></i>
<div class="h_tit">
<i>新用户首单送券活动规则</i>
</div>
<div class="main_v_tcon scroll" id="scroll" style="overflow-y:auto;-webkit-overflow-scrolling:touch;">
<p>(一)活动时间</p>
<p>2015年8月12日9:00:00-8月20日23:59:59</p>
<p>(二)活动限制:</p>
<p>1)参与活动用户须已有绑定微信账号的京东账号;</p>
<p>2)每个京东用户最多可获得2张不同面额的优惠券。不同微信号绑定同一京东账号多次参与活动的,则第一个参与本次活动的账号参与结果有效,其余账号参与结果均视为无效。</p>
<p>(三)参与方式:
用户进入活动页点击“用钱砸”,完成转发好友和分享朋友圈的操作,即可有机会获得面额不等的优惠券。</p>
<p>(四)活动奖券:</p>
<p>1)奖品内容:本次活动以7元到77元不等面额优惠券组成,奖品数量有限,先到先</p>
<p>1)奖品内容:本次活动以7元到77元不等面额优惠券组成,奖品数量有限,先到先</p>
<p>1)奖品内容:本次活动以7元到77元不等面额优惠券组成,奖品数量有限,先到先</p>
<p>1)奖品内容:本次活动以7元到77元不等面额优惠券组成,奖品数量有限,先到先</p>
<p>1)奖品内容:本次活动以7元到77元不等面额优惠券组成,奖品数量有限,先到先</p>
<p>1)奖品内容:本次活动以7元到77元不等面额优惠券组成,奖品数量有限,先到先</p>
<p>1)奖品内容:本次活动以7元到77元不等面额优惠券组成,奖品数量有限,先到先</p>
</div>
</div>

   但是产品妹子要求,不能穿透底部滑动,那就bug了

  其实做为码奴的我,感觉效果不是蛮好的吗,只是内部滑动,滑到顶部,或滑到底部的时候,会出现穿透底部的滚动条。

  为了让产品那边通过,鉴于这个问题,我思考了两种办法。

  第一种,简单粗暴,这个内容滑动过程都交由js事件来完成(类似用iscroll.js实现滚动),那我们的最后效果将是下图

  内容里面变的没有滚动条,弹窗模块touchmove的时候e.preventDefault(),通过脚本滑动,代码如下(其实就是自己写个与iscroll类似的单一功能插件,苦逼吧,做码奴就是这样折腾人),还是上干货,就是这样:

	~function(window,undefined){
prefix= function(){
var _elementStyle = document.createElement('div').style;
var vendors = ['msT','MozT', 'webkitT', 't'],
transform,
i = 0,
l = vendors.length;
for ( ; i < l; i++ ) {
transform = vendors[i] + 'ransform';
if ( transform in _elementStyle ) return vendors[i].substr(0, vendors[i].length-1);
}
return false;
} (); function Scroll(opts){
this.scrollElem = opts.scrollElem,
this.scrollCon = opts.scrollCon,
this.scrollwp = opts.scrollwp,
this.CH = opts.scrollCon.offsetHeight - opts.scrollwp.offsetHeight,
this.moveDis = 0,
this.touchbool = false;
this.init();
}
Scroll.prototype = {
constructor:"Scroll",
tweenmove:function(dis){
var self = this;
self.scrollCon.style.cssText = "-"+prefix+"-transform:translateY("+dis+"px) translateZ(0);-"+prefix+"-transition:-"+prefix+"-transform 0.2s linear";
},
move:function(dis){
var self = this;
self.scrollCon.style.cssText = "-"+prefix+"-transform:translateY("+dis+"px) translateZ(0)";
},
init:function(){
var _this = this,moveY,touchY;
_this.scrollElem.addEventListener("touchstart",function(e){
var e = e || window.event,
touch=e.touches[0];
e.preventDefault();
touchY = touch.pageY;
_this.touchbool = true;
if(e.target.className.replace(/^\s$/g,"") == "close"){
tip.style.display = "none";
mask.style.display = "none";
}
},false);
_this.scrollElem.addEventListener("touchmove",function(e){
var e = e || window.event;
e.preventDefault();
if(_this.touchbool){
var touch=e.touches[0];
moveY = touch.pageY;
if(moveY-touchY+_this.moveDis < 20 && moveY-touchY+_this.moveDis >(-_this.CH-20) ){
_this.move(moveY-touchY+_this.moveDis);
}
}
},false);
_this.scrollElem.addEventListener("touchend",function(e){
_this.moveDis = moveY-touchY+_this.moveDis;
if(_this.moveDis>=0){
_this.tweenmove(0);
_this.moveDis = 0;
}else if(_this.moveDis <= -_this.CH){
_this.tweenmove(-_this.CH);
_this.moveDis = -_this.CH;
}
_this.touchbool = false;
},false);
}
}
window.Scroll = Scroll;
var tipa = document.getElementById("tipa"),
close = document.querySelector(".close"),
tip = document.querySelector(".main_venue_tip"),
scrollwp = document.querySelector(".main_v_tcon"),
scrollCon = document.querySelector(".scroll_con"),
mask = document.querySelector(".mask"); var scroll = new Scroll({
scrollElem : tip,
scrollwp : scrollwp,
scrollCon : scrollCon
}) tipa.addEventListener("click",function(){
tip.style.display = "block";
mask.style.display = "block";
scroll.CH = scrollCon.offsetHeight - scrollwp.offsetHeight;
},false); }(window)

  第二种,优雅一点,当弹窗显示的时候,让根元素html的高度变成height:100%,overflow:hidden,这样确实解决了弹窗滑动底部不穿透的问题(不要给body height:100%)

  不多说,上干货

    ~function(window,undefined){
var tipa = document.getElementById("tipa"),
close = document.querySelector(".close"),
tip = document.querySelector(".main_venue_tip"),
scrollwp = document.querySelector(".main_v_tcon"),
scrollCon = document.querySelector(".scroll_con"),
mask = document.querySelector(".mask"),scrollTop;
tipa.addEventListener("click",function(){
tip.style.display = "block";
mask.style.display = "block";
//弹出的时候记录值
scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
document.documentElement.style.cssText="height:100%;overflow:hidden;position: relative;";
document.querySelector(".main_bg").style.cssText = "100%;overflow:hidden"
},false);
close.addEventListener("click",function(){
document.body.removeAttribute("style");
document.querySelector(".main_bg").removeAttribute("style");
//隐藏弹窗是,让滚动条滚动到记录的值
document.documentElement.scrollTop = document.body.scrollTop = scrollTop;
tip.style.display = "none";
mask.style.display = "none";
},false)
}(window)

  最后要注意的是,第二种方案在手q的项目表现很差,uc,微信效果ok(andriod2.3不支持内部滚动啊注意)。

  记录遇到的点滴问题,欢迎拍砖,讨论!

  

参考资料:

  移动页面滚动穿透如何解决

h5页面弹窗滚动穿透的思考的更多相关文章

  1. 完美解决移动端H5页面的滑动穿透问题

    同事的分享,记录下来. 代码如下: css: body.modal-open { position: fixed; width: 100%; } js: // 兼容低版本 document.scrol ...

  2. 3分钟学会sessionStorage用法(h5页面返回滚动到上次浏览器位置)

    前言: 因最近移动端开发过程中遇到一个运营提出的所谓技术难点需求,对于原生APP来说轻而易举,毕竟自己的APP用户操作指哪打哪,但是H5该怎么做?H5就实现不了么?对于一个爱研究攻克这些前端棘手问题的 ...

  3. h5页面列表滚动加载数据

    h5列表滚动加载数据很常见,以下分享下今天做的案例: 前言 这个效果实现需要知道三个参数 1. scrollTop -- 滚动条距离顶部的高度 2. scrollHeight -- 当前页面的总高度( ...

  4. h5页面弹窗时页面固定(弹窗下面的页面不滑动)

    页面出现弹窗时,底部页面不能随之滑动怎么解决? 只需将页面的body增加一个样式 overflow:hidden;就能解决 jq: //开启弹窗 $('body').attr('style','ove ...

  5. 跳出弹窗页面禁止滚动(PC端和手机端)

    pc端如何实现 1.当弹窗显示时,为body元素添加属性:overflow:hidden, 当关闭弹窗时移除该属性即可2.在弹窗的div上设置 @scroll.stop.prevent 3.前端页面弹 ...

  6. 移动端H5滚动穿透解决方案

    最近遇到一个很 巨恶心的问题  ios10下面 页面弹窗有滚动穿透问题 各种google 终于找到了答案,但是体验还不是很好,基本能忍受 废话不多说,上方法 最后终于想到一个处理方案,就是第一种方案的 ...

  7. vue-蒙层弹窗里的内容滚动。外层大页面禁止滚动

      此需求 有两种方法,第一种,这种方法适用于,底层 和弹窗是两个平行的没有关系的两部分.重叠(https://blog.csdn.net/yuhk231/article/details/741717 ...

  8. h5之scrollIntoView控制页面元素滚动

    如果滚动页面也是DOM没有解决的一个问题.为了解决这个问题,浏览器实现了一下方法,以方便开发人员如何更好的控制页面的滚动.在各种专有方法中,HTML5选择了scrollIntoView()作为标准方法 ...

  9. 微信小程序(6)--获取屏幕宽度及弹窗滚动与页面滚动冲突

    1.获取屏幕宽度,并赋值给view <view class="ships-img" style="height:{{windowWidth}}px;"&g ...

随机推荐

  1. pytest集成Allure Report

    https://blog.csdn.net/liuchunming033/article/details/79624474#commentBox https://blog.csdn.net/lihua ...

  2. go fmt格式化----“占位符”

    https://studygolang.com/articles/2644 https://studygolang.com/static/pkgdoc/pkg/fmt.htm

  3. swagger的说明、配置及使用

    一.What is swagger? 官方介绍:Swagger是一个规范且完整的框架,提供描述.生产.消费和可视化RESTful Web Service.专业角度:Swagger是由庞大工具集合支撑的 ...

  4. python __all__用法

    主要是用来限定暴露的api a.py文件里面的内容 __all__ = ['major_fun'] def major_fun(): pass def assist_fun(): pass b.py ...

  5. ASP.NET Web API 使用Swagger使用笔记

    https://www.cnblogs.com/lhbshg/p/8711604.html 最近换了工作,其中Webapi这块没有文档,之前有了解过Swagger借此机会好好整理下常用的地方分享给有需 ...

  6. js实现webSocket客户端

    var ws = new WebSocket("ws://localhost:8080/msg"); //readyState属性返回实例对象的当前状态,共有四种. //CONNE ...

  7. 8 -- 深入使用Spring -- 4...3 AOP的基本概念

    8.4.3 AOP的基本概念 AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中各个步骤,希望以更更好的方式来组合业务处理的各个步骤. AOP框架并不与特定的代码耦合 ...

  8. Axis2发布服务,支持Tomcat和Weblogic的SSHWeb项目部署

    先说下遇到的问题,在SSHWeb项目中使用JDK自带的jar发布WebService(Endpoint.publish),在tomcat下可以正常发布,但是在Weblogic报奇葩错误,如Struts ...

  9. zabbix中Templates的jmx相关key调试方法

    1.下载 cmdline jmxclient 如果你有一个完美的模版,你可能可以忽略此步.但是大多数情况下你没有.况且 zabbix 默认的 tomcat 模版也不能很好的工作.这时候有一个工具来调试 ...

  10. Ansible的Playbook的编写

    在Ansible中,将各个模块组合起来成为一个YAML格式的配置文件,这个配置文件叫做Playbook, Playbook和模块的关系类似于shell脚本和Linux命令之间的关系. Playbook ...