jQuery simplemodal отключить прокрутку - PullRequest
13 голосов
/ 30 марта 2011

У меня более 2000 пикселей прокрутки контента на странице.

Если пользователь нажимает div, в простомодальном окне появляется прокручиваемый контент. Теперь мой клиент хочет, чтобы исходная страница не прокручивалась, пока модальное окно открыто. (Конечно, модал все еще должен быть прокручиваемым.)

Это вообще возможно?

Редактировать: я попробовал ваши предложения. В основном это работает, но проблема немного сложнее:

$(".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;
});

Я использую return false для ссылок, чтобы боты и пользователи без JavaScript (да, это 2%) могли открывать статьи. С кодом выше он работает как положено, но после закрытия модального режима мне нужно вернуть полосу прокрутки, но этот код не будет работать:

$(".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;
});

Ответы [ 6 ]

23 голосов
/ 30 марта 2011

В вашем скрипте чтобы открыть ваш модал:

$("html,body").css("overflow","hidden");

И при закрытии:

$("html,body").css("overflow","auto");

(HTML и тело требуются, поскольку полосы прокрутки прикреплены к различным частям браузера в зависимости от того, что вы используете)

18 голосов
/ 19 июня 2011

Включение и выключение полос прокрутки приведет к смещению содержимого, и наложение больше не будет охватывать все окно. Вот как это исправить.

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 голосов
/ 30 марта 2011

Использовать

overflow:hidden

Применить его к странице, когда модальное диалоговое окно открыто, и удалить его, когда диалоговое окно уничтожено.Это скроет вашу полосу прокрутки.

0 голосов
/ 25 февраля 2015

В моем случае в теге <a> param href = "#". Так что решение будет:

href="javascript:void(0);"
0 голосов
/ 16 ноября 2013

Эта опция работает как шарм:

document.documentElement.style.overflow = 'hidden';
0 голосов
/ 14 мая 2013

Я нашел overflow:hidden не очень хорошо, поскольку он скрывает содержимое за полупрозрачным наложением, если страница прокручивается наполовину.

Я нашел следующее, довольно сложное решение.Он отключает прокрутку всеми возможными обнаруживаемыми способами, которые я нашел.И помещает положение прокрутки обратно в старое положение, если страница все равно была прокручена.

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;
}
...