解决bootstrap中模态框打开时页面发生一瞬间移动
2018-02-06 16:56
477 查看
相信很多人都在使用bootstrap中的modal时会出现一个诡异的现象,就是打开模态框时页面会出现一瞬间的移动,就好像页面发生了抖动,后来看了看bootstrap的文档
原来是当模态框弹出时,会为body添加.modal-open类,modal-open为body设置了overflow:hidden,因此原来页面的滚动条就消失了,页面会因此而右移,为了防止这一状况,bootstrap在打开模态框会为body设置padding-right: xx px; 这个数值为浏览器的滚动条宽度,所以会出现了页面一瞬间移动(滚动条消失->body添加了padding-right)
解决方法(这个算是Hack的吧)
css:
.myModal-open{
overflow-y:scroll; //保持滚动条的占位~
padding-right:0 !important;
}
js:
// 如果页面有滚动条则添加自定义类myModal-open
$('#userModal').on('show.bs.modal', function (e) { //监听模态框打开
if (isScroll()) {
$("body").addClass("myModal-open")
}
})
//监听模态框关闭,有hide.bs.modal和hidden.bs.modal,选择后者 因为要最后才能把我们自定义的样式去掉
$('#userModal').on('hidden.bs.modal', function (e) {
$("body").removeClass("myModal-open")
})
附上判断浏览器是否有滚动条的方法~
var isScroll = function (el) {
// test targets
var elems = el ? [el] : [document.documentElement, document.body];
var scrollX = false, scrollY = false;
for (var i = 0; i < elems.length; i++) { var o = elems[i];
// test horizontal
var sl = o.scrollLeft;
o.scrollLeft += (sl > 0) ? -1 : 1;
o.scrollLeft !== sl && (scrollX = scrollX || true);
o.scrollLeft = sl;
// test vertical
var st = o.scrollTop;
o.scrollTop += (st > 0) ? -1 : 1;
o.scrollTop !== st && (scrollY = scrollY || true);
o.scrollTop = st;
}
// ret
return scrollY;
};
原来是当模态框弹出时,会为body添加.modal-open类,modal-open为body设置了overflow:hidden,因此原来页面的滚动条就消失了,页面会因此而右移,为了防止这一状况,bootstrap在打开模态框会为body设置padding-right: xx px; 这个数值为浏览器的滚动条宽度,所以会出现了页面一瞬间移动(滚动条消失->body添加了padding-right)
解决方法(这个算是Hack的吧)
css:
.myModal-open{
overflow-y:scroll; //保持滚动条的占位~
padding-right:0 !important;
}
js:
// 如果页面有滚动条则添加自定义类myModal-open
$('#userModal').on('show.bs.modal', function (e) { //监听模态框打开
if (isScroll()) {
$("body").addClass("myModal-open")
}
})
//监听模态框关闭,有hide.bs.modal和hidden.bs.modal,选择后者 因为要最后才能把我们自定义的样式去掉
$('#userModal').on('hidden.bs.modal', function (e) {
$("body").removeClass("myModal-open")
})
附上判断浏览器是否有滚动条的方法~
var isScroll = function (el) {
// test targets
var elems = el ? [el] : [document.documentElement, document.body];
var scrollX = false, scrollY = false;
for (var i = 0; i < elems.length; i++) { var o = elems[i];
// test horizontal
var sl = o.scrollLeft;
o.scrollLeft += (sl > 0) ? -1 : 1;
o.scrollLeft !== sl && (scrollX = scrollX || true);
o.scrollLeft = sl;
// test vertical
var st = o.scrollTop;
o.scrollTop += (st > 0) ? -1 : 1;
o.scrollTop !== st && (scrollY = scrollY || true);
o.scrollTop = st;
}
// ret
return scrollY;
};
相关文章推荐
- bootstrap打开模态modal窗口引起页面抖动解决办法
- bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
- Bootstrap的模态框遮罩在iframe子页面弹出时不能覆盖父页面的解决方法
- 解决bootstrap中模态框显示后页面抖动的问题
- bootstrap模态框出现关闭后再打开滚动条不回顶的解决办法
- 解决打开bootstrap模态框抖动问题
- bootstrap打开模态modal窗口引起页面抖动闪黑
- 解决Bootstrap一个页面弹出的模态框嵌套多个模态框时,样式混乱,按钮不能点击。
- 解决IE打开页面后发生 HTTP 500 - Internal server error 错误
- bootstrap在iframe框架中实现由子页面在顶级页面打开模态框(modal)
- Bootstrap 模态框 + iframe > 打开子页面 > 数据传输/关闭模态框
- bootstrap时间控件显示在模态框下面的解决办法
- js自动生成的元素与页面原有元素发生堆叠的解决方法
- iPhone6用超链接打开Bootstrap模态框无效
- 使用《UrlHash/锚点》解决移动设备中的单页面应用的物理[返回键]带来的困扰
- 浏览器打开新页面 安全限制解决
- Bootstrap3-技巧之解决Bootstrap模态框切换时页面抖动 or页面滚动条
- 解决Visual studio"创建或打开C++浏览数据库文件***发生错误”的问题
- discuz页面打开为空白问题解决
- 打开页面就是全屏的解决办法