Javascript 当模态视图打开时,禁用车身上的滚动
我找到了一个JQuery解决方案,可以在打开模式视图时禁用主体上的滚动,但我正在寻找一个Javascript解决方案,有人能告诉我如何转换为JS吗:Javascript 当模态视图打开时,禁用车身上的滚动,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我找到了一个JQuery解决方案,可以在打开模式视图时禁用主体上的滚动,但我正在寻找一个Javascript解决方案,有人能告诉我如何转换为JS吗: $(function () { var $body = $(window.document.body); function bodyFreezeScroll() { var bodyWidth = $body.innerWidth(); $body.css('overflow', 'hidden'); $body.css(
$(function () {
var $body = $(window.document.body);
function bodyFreezeScroll() {
var bodyWidth = $body.innerWidth();
$body.css('overflow', 'hidden');
$body.css('marginRight', ($body.css('marginRight') ? '+=' : '') + ($body.innerWidth() - bodyWidth))
}
function bodyUnfreezeScroll() {
var bodyWidth = $body.innerWidth();
$body.css('marginRight', '-=' + (bodyWidth - $body.innerWidth()))
$body.css('overflow', 'auto');
}
$('.modal').hide()
$('.longcontent.main button').click(function () {
$('.modal').show()
bodyFreezeScroll()
})
$('.modal button').click(function () {
$('.modal').hide()
bodyUnfreezeScroll()
})})
我能想到的最好的香草js是:
你想把哪一部分翻译成香草js?诀窍是有一个与当前视口一样大的“背景”容器(顶部:0;右侧:0;底部:0;左侧:0;)此容器具有css属性
溢出:自动(或滚动),因此可以滚动视口中较大的内容。然后,只要拨号处于打开状态,就可以将其应用于正文:document.body.style.overflow=“hidden”代码>是的,禁用滚动并使其返回效果很好,但是有一个隐藏和显示滚动条的动画,宽度会改变,我想得到这行的等价:`$body.css('marginRight'),($body.css('marginRight')?'+=':'')+($body.innerWidth()-bodyWidth))`我在你的JSFIDLE中没有看到动画。这只会给主体添加一个边距。我想在这里实现解决方案:问题是,当模态视图打开时,主体会向右移动,因为滚动条将被隐藏,当滚动条再次返回时,它会向左移动,所以我不想让此问题谢谢您的努力,但是我们可以防止两个滚动条一起显示在过渡动画中吗?我们找到了一种方法来获得当前滚动条的正确大小,并给出了fiddle+答案。见参考资料。
var $body = window.document.body;
var $modal = document.getElementsByClassName("modal")[0];
var aOpenButtons = document.getElementsByClassName("open-modal");
var aCloseButtons = document.getElementsByClassName("close-modal");
function bodyFreezeScroll($obj) {
$body.style.overflow = "hidden";
$body.style.marginRight = getScrollBarWidth()+"px";
}
function bodyUnfreezeScroll() {
$body.style.overflow = "auto";
$body.style.marginRight = "auto";
}
function showModal(){
$modal.classList.add("visible");
$modal.classList.remove("hide");
}
function hideModal(){
$modal.classList.add("hide");
$modal.classList.remove("visible");
}
for(var i = 0, a=aOpenButtons.length; i<a; i++){
aOpenButtons[i].addEventListener("click", function(){
showModal();
bodyFreezeScroll();
}, false);
}
for(var i = 0, a=aCloseButtons.length; i<a; i++){
aCloseButtons[i].addEventListener("click", function(){
hideModal();
bodyUnfreezeScroll();
}, false);
}
function getScrollBarWidth() {
/* found here: https://stackoverflow.com/questions/986937/how-can-i-get-the-browsers-scrollbar-sizes */
var inner = document.createElement('p');
inner.style.width = "100%";
inner.style.height = "200px";
var outer = document.createElement('div');
outer.style.position = "absolute";
outer.style.top = "0px";
outer.style.left = "0px";
outer.style.visibility = "hidden";
outer.style.width = "200px";
outer.style.height = "150px";
outer.style.overflow = "hidden";
outer.appendChild (inner);
document.body.appendChild (outer);
var w1 = inner.offsetWidth;
outer.style.overflow = 'scroll';
var w2 = inner.offsetWidth;
if (w1 == w2) w2 = outer.clientWidth;
document.body.removeChild (outer);
return (w1 - w2);
};
@keyframes show {
0% { top: -100%; }
100% { top: 0; }
}
@keyframes hide {
0% { top: 0%; }
100% { top: -100%; }
}