问题
I have more than 2000 pixels scrolling content on a page.
If the user clicks a div
a scrolling content pops up in a simplemodal window. Now my client wants to make the original page non-scrollable while the modal window is up. (Of course the modal should be still scrollable.)
Is it even possible?
Edit: I have tried your suggestions. Basically it works, but the problem is a little bit complicated:
$(".foReadMoreLink a").click(function(){
if ($('#modalBox').length == 0)
$('body').append('<div style="display:none" id="modalBox"></div>')
$('body').css({'overflow':'hidden'});
$.post('jquery/loadarticle.php',{id:$(this).attr('id')},function(data){
$('#modalBox').html(data).modal({overlayClose:'true'});
})
return false;
});
I use return false on the links so bots and users without JavaScript (yes, that's 2%) can open the articles. With the code above it works as expected, but after closing the modal I have to have back the scrollbar but this code won't work:
$(".foReadMoreLink a").click(function(){
if ($('#modalBox').length == 0)
$('body').append('<div style="display:none" id="modalBox"></div>')
$('body').css({'overflow':'hidden'});
$.post('jquery/loadarticle.php',{id:$(this).attr('id')},function(data){
$('#modalBox').html(data).modal({onClose:function(){$('body').css({'overflow':'auto'})},overlayClose:'true'});
})
return false;
});
回答1:
In your script to open your modal:
$("html,body").css("overflow","hidden");
And on close:
$("html,body").css("overflow","auto");
(HTML and body are required as the scroll bars are attached to different parts of the browser depending on which you are using)
回答2:
Turning the scrollbars on and off will cause the content to shift and the overlay will no longer cover the whole window. Here's how to fix it.
var oldBodyMarginRight = $("body").css("margin-right");
$.modal(iframe, {
onShow: function () {
// Turn off scroll bars to prevent the scroll wheel from affecting the main page. Make sure turning off the scrollbars doesn't shift the position of the content.
// This solution works Chrome 12, Firefox 4, IE 7/8/9, and Safari 5.
// It turns off the scroll bars, but doesn't prevent the scrolling, in Opera 11 and Safari 5.
var body = $("body");
var html = $("html");
var oldBodyOuterWidth = body.outerWidth(true);
var oldScrollTop = html.scrollTop();
var newBodyOuterWidth;
$("html").css("overflow-y", "hidden");
newBodyOuterWidth = $("body").outerWidth(true);
body.css("margin-right", (newBodyOuterWidth - oldBodyOuterWidth + parseInt(oldBodyMarginRight)) + "px");
html.scrollTop(oldScrollTop); // necessary for Firefox
$("#simplemodal-overlay").css("width", newBodyOuterWidth + "px")
},
onClose: function () {
var html = $("html");
var oldScrollTop = html.scrollTop(); // necessary for Firefox.
html.css("overflow-y", "").scrollTop(oldScrollTop);
$("body").css("margin-right", oldBodyMarginRight);
$.modal.close();
}
});
回答3:
Use
overflow:hidden
Apply it to the page when modal dialog is opened and remove it when the dialog is destroyed. This will hide your scrollbar.
回答4:
I found overflow:hidden
not so nice since it hides the content behind the semi-transparant overlay if the page is scrolled halfway.
I came up with the following, rather elaborate solution. It disables scrolling in all possible detectable ways I found. And puts the scrollposition straight back to the old position if the page was still scrolled somehow.
var popupOpened = false;
function openPopup()
{
popupOpened = true;
//catch middle mouse click scrolling
$(document).bind('mousedown',disableMiddleMouseButtonScrolling);
//catch other kinds of scrolling
$(document).bind('mousewheel DOMMouseScroll wheel',disableNormalScroll);
//catch any other kind of scroll (though the event wont be canceled, the scrolling will be undone)
//IE8 needs this to be 'window'!
$(window).bind('scroll',disableNormalScroll);
$("#layover").css({"opacity" : "0.7"}).fadeIn();
$("#popup").fadeIn(300,function()
{
//use document here for crossbrowser scrolltop!
oldScrollTop = $(document).scrollTop();
});
}
function closePopup()
{
popupOpened = false;
$("#layover").fadeOut();
$("#popup").fadeOut(300,function(){
$(document).unbind('mousedown',disableMiddleMouseButtonScrolling);
$(document).unbind('mousewheel DOMMouseScroll wheel',disableNormalScroll);
$(window).unbind('scroll',disableNormalScroll);
});
}
function disableMiddleMouseButtonScrolling(e)
{
if(e.which == 2)
{
e.preventDefault();
}
return false;
}
function disableNormalScroll(e)
{
e.preventDefault();
$('html, body').scrollTop(oldScrollTop);
return false;
}
回答5:
This option works like a charm:
document.documentElement.style.overflow = 'hidden';
回答6:
In my case in tag <a>
param href = "#"
.
So solution be:
href="javascript:void(0);"
来源:https://stackoverflow.com/questions/5485244/jquery-simplemodal-disable-scrolling