Javascript 在将“隐藏”属性更改为“自动溢出”属性时避免抖动
我有一个模态对话框要打开。当模式窗口打开时,我想禁用背景滚动。因此,当对话框打开时,我将Javascript 在将“隐藏”属性更改为“自动溢出”属性时避免抖动,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我有一个模态对话框要打开。当模式窗口打开时,我想禁用背景滚动。因此,当对话框打开时,我将overflow:hidden添加到body标记中。通过这样做,滚动条来了又去了body标记,这导致我的UI出现了一些抖动。我知道这种冲动会发生,因为滚动条使用了保留的空间。当对话框打开和关闭时,是否有任何方法可以避免急动并禁用背景滚动 请查找下面所附的代码 var launch=document.getElementById('btn'); var dialog=document.getElementBy
overflow:hidden
添加到body
标记中。通过这样做,滚动条来了又去了body
标记,这导致我的UI出现了一些抖动。我知道这种冲动会发生,因为滚动条使用了保留的空间。当对话框打开和关闭时,是否有任何方法可以避免急动并禁用背景滚动
请查找下面所附的代码
var launch=document.getElementById('btn');
var dialog=document.getElementById('dialog');
var close=document.getElementById('close');
var body=document.querySelector('body');
launch.onclick=openmodel;
close.onclick=closeModal;
函数openModal(){
dialog.style.display=“block”;
body.style.overflow=“隐藏”;
}
函数closeModal(){
dialog.style.display=“无”;
body.style.overflow=“自动”;
}
正文{
保证金:0;
}
.整体{
高度:1000px;
宽度:100%;
位置:相对位置;
文本对齐:右对齐;
填充:0;
光标:指针;
}
.莫代尔{
位置:绝对位置;
最高:50%;
左:50%;
转换:翻译(-50%,-50%);
背景:#aaa;
边框:1px实心#fdfdfd;
高度:200px;
宽度:400px;
}
跨度{
文本对齐:右对齐;
光标:指针;
宽度:100%;
显示:块;
文本对齐:右对齐;
}
单击以启动modal
关闭
添加一个overflow-y:scroll
到html
,默认情况下强制滚动条。当模态出现时,这将防止中心跳动
html {
overflow-y: scroll;
}
这个问题也依赖于浏览器,因为某些浏览器的滚动条不占用水平空间(如Chrome) 据我所知,只有一种方法可以解决您的问题:
1.保持溢出状态:
function openModal(){
dialog.style.display = "block";
}
您可以临时添加一个
右边距
,这是滚动条的宽度。如果你有大量的样式和背景色,这可能是不够的。但对于简单的布局,它可以很好地工作
var launch=document.getElementById('btn');
var dialog=document.getElementById('dialog');
var close=document.getElementById('close');
var body=document.querySelector('body');
launch.onclick=openmodel;
close.onclick=closeModal;
函数openModal(){
var widthBefore=body.offsetWidth;
dialog.style.display=“block”;
body.style.overflow=“隐藏”;
body.style.marginRight=body.offsetWidth-widthBefore+“px”;
}
函数closeModal(){
dialog.style.display=“无”;
body.style.overflow=“自动”;
body.style.marginRight=“”;
}
正文{
保证金:0;
}
.整体{
高度:1000px;
宽度:100%;
位置:相对位置;
文本对齐:右对齐;
填充:0;
光标:指针;
}
.莫代尔{
位置:绝对位置;
最高:50%;
左:50%;
转换:翻译(-50%,-50%);
背景:#aaa;
边框:1px实心#fdfdfd;
高度:200px;
宽度:400px;
}
跨度{
文本对齐:右对齐;
光标:指针;
宽度:100%;
显示:块;
文本对齐:右对齐;
}
单击以启动modal
关闭
作为解决方案-您可以在使用body margin类隐藏卷轴后保留此正文空间。所以,当您隐藏垂直滚动时-您正在增加正文的右边距,当您显示时-删除此保留
检查下面的示例。它有一些缺点(不同的浏览器,不同的操作系统主题,等等),但它是我的项目的快速修复
因此,可能需要额外的计算,如当前滚动宽度
var launch=document.getElementById('btn');
var dialog=document.getElementById('dialog');
var close=document.getElementById('close');
var body=document.querySelector('body');
launch.onclick=openmodel;
close.onclick=closeModal;
函数openModal(){
dialog.style.display=“block”;
body.style.overflow=“隐藏”;
body.style.marginRight=“17px”;
}
函数closeModal(){
dialog.style.display=“无”;
body.style.overflow=“自动”;
body.style.marginRight=“0”;
}
正文{
保证金:0;
}
.整体{
高度:1000px;
宽度:100%;
位置:相对位置;
文本对齐:右对齐;
填充:0;
光标:指针;
}
.莫代尔{
位置:绝对位置;
最高:50%;
左:50%;
转换:翻译(-50%,-50%);
背景:#aaa;
边框:1px实心#fdfdfd;
高度:200px;
宽度:400px;
}
跨度{
文本对齐:右对齐;
光标:指针;
宽度:100%;
显示:块;
文本对齐:右对齐;
}
单击以启动modal
关闭
为什么不使用bootstrap模式呢?它将帮助您编写大量css,您必须编写bootstrap UII中已经存在的控件。我通常不相信第三方。我喜欢写代码myself@degr如果你看一下代码,你会发现我动态计算了滚动条的大小。这不是一个固定的值。是的,我明白了,但仍然不是个好主意,因为边距已经可以用在一些自定义CSS样式中了。@degr我在回答的开头用免责声明说明了这一点。这是由OP来决定这是否适用于他们的网站,但我认为公平地说,它确实适用于问题中提供的示例。。。body.offsetWidth-之前的宽度。当我将宽度存储在widthBefore
中时,仍然有一个滚动条。然后,将溢出
设置为隐藏
,使滚动条消失,偏移宽度更改。此行计算这两种情况之间的差异,以便能够纠正由于删除滚动条而导致的宽度更改。滚动条宽度取决于浏览器。是的,它是。和操作系统主题相关。但这是我的特殊情况下的解决方案,所以我只是分享了非常快速的解决方案。我已经更新了我的答案。因为您的默认状态是scroll o