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
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();
}
});
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;
}
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.
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)
In my case in tag <a>
param href = "#"
.
So solution be:
href="javascript:void(0);"
This option works like a charm:
document.documentElement.style.overflow = 'hidden';