Bootstrap:关于bootstrap单页面中多Modal的问题
2019独角兽企业重金招聘Python工程师标准>>>
在单页面中新建用户采用modal而判断添加成功后还采用modal提示成功后右边的滚动条会出来俩条,覆盖整个body的阴影瞬间变暗。真的是哔了dog,如今在公司又出现了阴影的问题所以我观察了源码后发现 ,bootstrap.js文件中modal的遮罩层函数如下:
Modal.prototype.backdrop = function (callback) {var that = thisvar animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {var doAnimate = $.support.transition && animate
this.$backdrop = $(document.createElement('div')).addClass('modal-backdrop ' + animate).appendTo(this.$body)......}
后面还有balabala一大串,但这些就足够分析了。在单击modal后会有一个叫modal-backdrop的div层apped到body之后,那言下之意是不管开几个modal都会不断的向body后append! ╮(╯_╰)╭ !怎么能这样。。。然后我简单对modal-backdrop进行处理,如下:
document.getElementById('ta').addEventListener('click' , function(){$('#myModal').modal('show');
});
document.getElementById('tt').addEventListener('click' , function(){$('#myModal1').modal('show');
/*$('#myModal').modal('hide');
*/
console.log($('.modal-backdrop').length)console.log($('.modal-backdrop'))var iLen = $('.modal-backdrop').length;for(var i = 0; i<iLen;i++){$('.modal-backdrop')[i].id = 'modal'+i;}if(iLen>1){for(var i =1;i<2;i++){$('#modal'+i).removeClass();}}
});
为每个modal-backdrop对应的div添加个id,然后找到这个div将.modal-backdrop这个removeClass()掉就行。在这里肯定会有小伙伴说不论是几个那只需要在显示当前modal的时候把剩下的hide不就可以了么?这个办法我也试了试如上代码前6行,这样做确实能达到阴影不加深的效果但是用户体验会差很多,因为hide的时候页面会刷新。其实有的时候我们也可以根据项目需要自行编写遮罩层(也就是模拟modal的效果,网上资料叫mask-div),在特定的情况下说不定有出其不意的效果!
网上有个解决思路是改变z-index,这个方法测试过,弹出modal框没问题,只是在弹出多次modal框之后,后面背景会加深,都看不到被遮盖的页面了:
$(document).ready(function() {// 通过该方法来为每次弹出的模态框设置最新的zIndex值,从而使最新的modal显示在最前面$(document).on('show.bs.modal', '.modal', function() {//貌似这里始终为0,获取不到$('.modal:visible')的jquery对象,因为这个时候modal遮盖层还没有显示出来var zIndex = 1040 + (10 * $('.modal:visible').length);$(this).css('z-index', zIndex);setTimeout(function() {//在遮盖层被赋予样式显示出来之后再执行该方法(这里$('.modal-backdrop').not('.modal-stack')可能有多个,弹出多次modal框之后,页面被多个遮盖层覆盖)$('.modal-backdrop').not('.modal-stack').css('z-index', zIndex - 1).addClass('modal-stack');//改进的方法,只保留一个,其余移除样式应该可以,没测试过.../*var iLen = $('.modal-backdrop').length;for(var i = 0; i<iLen;i++){$('.modal-backdrop')[i].id = 'modal'+i;}if(iLen>1){for(var i =1;i<2;i++){$('#modal'+i).removeClass();}}*/}, 0);});
});
多滚动条(即收缩感问题)
看源码发现在modal出现时对body进行了样式的修改,具体如下:
body{ overflow:auto;overflow-y:scroll; }
在网上查了下是因为让不同浏览器下的modal样式统一,╮(╯▽╰)╭还是自己太年轻没想到,下来的事就是阻止bootstrap调用modal的默认样式了,还是自己当时一头钻进了怎么改样式的死胡同而没有想到查看官方api找到对应的事件......
Modal.prototype.adjustBody_beforeShow = function(){var body_scrollHeight = $('body'[0].scrollHeight;var docHeight = document.documentElement.clientHeight;if(body_scrollHeight > docHeight){$('body').css({ 'overflow' : 'hidden', 'margin-right' : '15px' });$('.modal').css({'overflow-y':'scroll'})}else{$('body').css({ 'overflow' : 'auto', 'margin-right' : '0' });$('.modal').css({'overflow-y':'auto'})}
}
Modal.prototype.adjustBody_afterShow = function(){var body_scrollHeight = $('body')[0].scrollHeight;var docHeight = document.documentElement.clientHeight;if(body_scrollHeight > docHeight){$('body').css({ 'overflow' : 'auto', 'margin-right' : '0' });}else{$('body').css({ 'overflow' : 'auto', 'margin-right' : '0' });}
}
调用的时候:
Modal.prototype.show = function (_relatedTarget) {this.adjustBody_beforeShow();//...other code
}
Modal.prototype.hide = function (e) {this.adjustBody_afterShow();//...other code
}
实例:
删除框,在点击的时候,弹出"是否删除"对话框:
<div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="infoModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-content" ng-transclude=""><div bindonce="" class="ng-scope"><div class="modal-header"><button type="button" class="close" data-dismiss="modal" data-ng-click="close(false)" aria-hidden="true">×</button><h5 class="modal-title ng-binding">提示</h5></div><div class="modal-body"><div><span class="text-size-32 icon-warning-1 text-info" style="color: #09c !important"></span> <span style="display:inline;margin-bottom: 10px;margin-left: 10px;vertical-align:6px;font-size: 18px" bo-bind="'invoice.directive.addressListAction.sureCancelAddress'|translate">确定要删除这条发票信息吗?</span></div></div><div class="modal-footer"><button type="button" class="btn btn-primary" data-dismiss="modal" onclick="deleteFun();">确定</button><button type="button" class="btn btn-default" data-dismiss="modal">取消</button></div></div></div></div></div></div>
删除按钮:
<a class="btn-sm btn-primary" onclick="modifyBtnClickToInfo(this);return false;" uid="${ssoInvoice.id}">修改</a>
<a class="btn-sm btn-primary" onclick="deleteBtnClickToInfo(this);return false;" uid="${ssoInvoice.id}" >删除</a>
javascript:
/*设定被删除的元素的ID值*/
function deleteBtnClickToInfo(dom){deleteSsoInvoiceId = $(dom).attr('uid');$("#deleteModal").modal('show');removeModalBackdrop();
}/*保留一层遮盖层,移除其他遮盖层*/
function removeModalBackdrop(){var iLen = $('.modal-backdrop').length;for(var i = 0; i<iLen;i++){$('.modal-backdrop')[i].id = 'modal'+i;}if(iLen>1){for(var i =1;i<2;i++){$('#modal'+i).removeClass();}}
}
效果图:
一个页面两个modal:
转载于:https://my.oschina.net/u/2331760/blog/1523291
Bootstrap:关于bootstrap单页面中多Modal的问题相关推荐
- 怎样在vue单页面中引入其他组件
场景 在一个vue的单页面,假如是home.vue中要引入其他组件的内容. 页面结构如下: 实现 首先在components下新建组件Today_recommend.vue组件 <templat ...
- principle导出html5,让Principle成为生产力工具(二)单页面中的联动
Sketch49更新了link功能,但是中间帧补齐才是 Principle 相比于 Sketch新版功能的优势所在. 写在前面的话: Sketch49 正式发布了,在新的版本中加入了期待已久的 Li ...
- Vue单页面中进行业务数据的上报
为什么要在标题里加上一个业务数据的上报呢,因为在咱们前端项目中,可上报的数据维度太多,比如还有性能数据.页面错误数据.console捕获等.这里我们只讲解业务数据的埋点. 业务数据的上报主要分为: 各 ...
- 单页面应用微信分享跳坑指南
前言 最近在开发的时候遇到了一个微信分享的bug,就是无论你在哪个路径下的页面,发送给朋友后点开都只会跳到项目的首页.本来微信分享这个只算是一个小功能,也很好解决,但由于项目的特殊性,使得在这个bug ...
- html加上百度统计,vue单页面应用加入百度统计
版权声明:本文为CSDN博主「钟文辉」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/qq_39753974/ ...
- 单页面网站seo优化的基本要点
一个专业的网站建设者从来都不是与生俱来的,在苦练怎样建成一个好网站的过程中必定走过弯路,吃过苦头,对网站的架构.页面展示以及优化等各方面都需要精雕细琢,今天,我们就从seo的角度谈谈单页面网站建设的好 ...
- 单页面vue使用webwork
webwork的定义 webwork为单页面使用多线程,不影响页面的渲染,充分补全的js单线程阻塞页面渲染的缺点,项目中使用还是很受欢迎的 webwork的封装 webwork在单页面中使用会遇到打包 ...
- php登陆页面修改密码的功能,使用bootstrap创建登录注册页面并实现表单验证功能...
本篇文章给大家介绍一下使用bootstrap创建登录注册页面并实现单验证功能的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 用bootstrap做登入注册页面,使用valid ...
- bootstrap实现单页面跳转_SpringBoot拦截器,国际化,登录实现
首先将模板文件导入resources/templates,配置MyMvcConfig @Configurationpublic class MyMvcConfig implements WebMvcC ...
最新文章
- [转] React风格的企业前端技术
- 解决启动WebLogic输入用户名密码问题以及密码重置
- #浪潮之巅#苹果公司和乔布斯神话----有感
- 加密狗厂商及工作原理介绍
- 网站上点击自定义按钮发起QQ聊天的解决方案
- 通信原理几种调制方式
- 交警罚没系统数据一致性问题
- Windows窗口命令大全
- 凯联医疗完成逾亿元C轮融资 加速布局微量药物输注领域
- 远程主机强迫关闭了一个现有的连接
- 【毕业设计】基于大数据的销量数据预测 -python销量预测 大数据 可视化
- 好玩的免费GM游戏整理汇总
- 如何用数学课件制作工具绘制函数图像
- Python解决数学难题:囚徒存活的概率 ‘‘‘
- 配置网络拓扑图测试软件,某网络拓扑图如下所示,三台路由器上均运行RIPv1协议,路由协议配置完成后,测试 - 信管网...
- 中国化妆品用脂质体市场现状研究分析与发展前景预测报告
- 测试开发之Python核心笔记(19): 深入理解类的属性
- 程序员到高级架构师,必须经历的三个阶段
- 关于在ubuntu中修改Android源码的一些细节
- 保罗·格雷厄姆:如何获得创业点子?