Как программно отключить прокрутку страницы с помощью jQuery

Используя jQuery, я хотел бы отключить прокрутку тела:

Моя идея:

  • Установить body{ overflow: hidden;}
  • Захват текущего scrollTop();/scrollLeft()
  • Привяжите к событию прокрутки тела, установите scrollTop/scrollLeft на захваченное значение.

Есть ли лучший способ?


Update:

См. мой пример и причину, по которой http://jsbin.com/ikuma4/2/edit

Я знаю, что кто-то подумает: "Почему он не просто использует position: fixed на панели?".

Пожалуйста, не предлагайте это, поскольку у меня есть другие причины.

Ответ 1

Единственный способ, которым я нашел это, похож на то, что вы описали:

  • Захватите текущую позицию прокрутки (не забудьте о горизонтальной оси!).
  • Установите переполнение в скрытое (возможно, нужно сохранить предыдущее значение переполнения).
  • Прокрутите документ до сохраненного положения прокрутки с помощью scrollTo().

Затем, когда вы будете готовы разрешить прокрутку снова, отмените все это.

Изменить: нет причин, по которым я не могу дать вам код, так как я пошел на труд, чтобы выкопать его...

// lock scroll position, but retain settings for later
var scrollPosition = [
  self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
  self.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
];
var html = jQuery('html'); // it would make more sense to apply this to body, but IE7 won't have that
html.data('scroll-position', scrollPosition);
html.data('previous-overflow', html.css('overflow'));
html.css('overflow', 'hidden');
window.scrollTo(scrollPosition[0], scrollPosition[1]);


// un-lock scroll position
var html = jQuery('html');
var scrollPosition = html.data('scroll-position');
html.css('overflow', html.data('previous-overflow'));
window.scrollTo(scrollPosition[0], scrollPosition[1])

Ответ 2

Это будет полностью отключить прокрутку:

$('html, body').css({
    overflow: 'hidden',
    height: '100%'
});

Для восстановления:

$('html, body').css({
    overflow: 'auto',
    height: 'auto'
});

Протестировано в Firefox и Chrome.

Ответ 3

попробуйте это

$('#element').on('scroll touchmove mousewheel', function(e){
  e.preventDefault();
  e.stopPropagation();
  return false;
})

Ответ 4

вы можете использовать этот код:

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

Ответ 5

Я просто немного настраиваю решение tfe. В частности, я добавил некоторый дополнительный элемент управления, чтобы убедиться, что нет смещения содержимого страницы (или сдвиг страницы), когда полоса прокрутки установлена ​​на hidden.

Две функции Javascript lockScroll() и unlockScroll() могут быть определены, соответственно, для блокировки и разблокировки прокрутки страницы.

function lockScroll(){
    $html = $('html'); 
    $body = $('body'); 
    var initWidth = $body.outerWidth();
    var initHeight = $body.outerHeight();

    var scrollPosition = [
        self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
        self.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
    ];
    $html.data('scroll-position', scrollPosition);
    $html.data('previous-overflow', $html.css('overflow'));
    $html.css('overflow', 'hidden');
    window.scrollTo(scrollPosition[0], scrollPosition[1]);   

    var marginR = $body.outerWidth()-initWidth;
    var marginB = $body.outerHeight()-initHeight; 
    $body.css({'margin-right': marginR,'margin-bottom': marginB});
} 

function unlockScroll(){
    $html = $('html');
    $body = $('body');
    $html.css('overflow', $html.data('previous-overflow'));
    var scrollPosition = $html.data('scroll-position');
    window.scrollTo(scrollPosition[0], scrollPosition[1]);    

    $body.css({'margin-right': 0, 'margin-bottom': 0});
}

где я предположил, что <body> не имеет начального поля.

Обратите внимание, что, хотя вышеупомянутое решение работает в большинстве практических случаев, оно не является окончательным, поскольку для дальнейшей работы с страницами, которые включают, например, заголовок с position:fixed, требуется дополнительная настройка. Перейдем к этому частному случаю с примером. Предположим, что

<body>
<div id="header">My fixedheader</div>
<!--- OTHER CONTENT -->
</body>

с

#header{position:fixed; padding:0; margin:0; width:100%}

Тогда в функциях lockScroll() и unlockScroll() следует добавить следующее:

function lockScroll(){
    //Omissis   


    $('#header').css('margin-right', marginR);
} 

function unlockScroll(){
    //Omissis   

    $('#header').css('margin-right', 0);
}

Наконец, позаботьтесь о каком-то возможном начальном значении для полей или paddings.

Ответ 6

Чтобы отключить прокрутку, попробуйте следующее:

var current = $(window).scrollTop();
$(window).scroll(function() {
    $(window).scrollTop(current);
});

до reset:

$(window).off('scroll');

Ответ 7

Я написал плагин jQuery для этого: $. disablescroll.

Он предотвращает прокрутку с колесика мыши, нажатия и нажатия клавиш, например Page Down.

Здесь есть демонстрация.

Использование:

$(window).disablescroll();

// To re-enable scrolling:
$(window).disablescroll("undo");

Ответ 8

Вы можете присоединить функцию для прокрутки событий и предотвращения ее поведения по умолчанию.

var $window = $(window);

$window.on("mousewheel DOMMouseScroll", onMouseWheel);

function onMouseWheel(e) {
    e.preventDefault();
}

https://jsfiddle.net/22cLw9em/

Ответ 9

Один лайнер для отключения прокрутки, включая среднюю кнопку мыши.

$(document).scroll(function () { $(document).scrollTop(0); });

edit. В любом случае, нет необходимости в jQuery, ниже того же, что указано выше в vanilla JS (это означает отсутствие фреймворков, просто JavaScript):

document.addEventListener('scroll', function () { this.documentElement.scrollTop = 0; this.body.scrollTop = 0; })

this.documentElement.scrollTop - стандартный

this.body.scrollTop - совместимость с IE

Ответ 10

Разве вы не можете установить высоту тела на 100% и переполнение? См. http://jsbin.com/ikuma4/13/edit

Ответ 11

Это может работать или не работать в ваших целях, но вы можете расширить jScrollPane, чтобы запустить другие функции, прежде чем прокручивать их. Я только что проверил это немного, но я могу подтвердить, что вы можете прыгать и полностью предотвращать прокрутку. Все, что я сделал, это:

  • Загрузите демо-версию zip: http://github.com/vitch/jScrollPane/archives/master
  • Откройте демонстрацию "Events" (events.html)
  • Отредактируйте его, чтобы использовать недопустимый script источник: <script type="text/javascript" src="script/jquery.jscrollpane.js"></script>
  • Внутри jquery.jscrollpane.js введите "return;" на строке 666 (благоприятный номер строки!, но если ваша версия немного отличается, это первая строка функции positionDragY(destY, animate)

Запустите event.html, и вы увидите окно с обычной прокруткой, которое из-за вашего вмешательства кодирования не будет прокручиваться.

Вы можете управлять всеми полосами прокрутки браузера таким образом (см. fullpage_scroll.html).

Итак, предположим, следующим шагом является добавление вызова какой-либо другой функции, которая отключается, и делает вашу привязанную магию, а затем решает, продолжать ли прокрутку или нет. У вас также есть вызовы API для установки scrollTop и scrollLeft.

Если вам нужна дополнительная помощь, напишите, где вы встаете!

Надеюсь, это помогло.

Ответ 12

Я поставил ответ, который может помочь здесь: jQuery упрощающая прокрутка прокрутки

Показывает, как отключить полосы прокрутки, не перемещая текст вокруг. Вы можете игнорировать части, касающиеся простой модели.

Ответ 13

Кто-то отправил этот код, который имеет проблему не сохранять позицию прокрутки при восстановлении. Причина в том, что люди склонны применять его к html и телу или только к телу, но его следует применять только к html. Таким образом, при восстановлении положение прокрутки будет сохранено:

$('html').css({
    'overflow': 'hidden',
    'height': '100%'
});

Для восстановления:

$('html').css({
    'overflow': 'auto',
    'height': 'auto'
});

Ответ 14

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

$(document).on('keydown', function(e){
    e.preventDefault();
    e.stopPropagation();
});

Ответ 15

Попробуйте этот код:

    $(function() { 
        // ...

        var $body = $(document);
        $body.bind('scroll', function() {
            if ($body.scrollLeft() !== 0) {
                $body.scrollLeft(0);
            }
        });

        // ...
    });

Ответ 16

Вы можете скрывать окно с помощью прокручиваемого div для предотвращения прокрутки содержимого на странице. И, скрывая и показывая, вы можете заблокировать/разблокировать свой свиток.

Сделайте что-то вроде этого:

#scrollLock {
    width: 100%;
    height: 100%;
    position: fixed;
    overflow: scroll;
    opacity: 0;
    display:none
}

#scrollLock > div {
    height: 99999px;
}

function scrollLock(){
    $('#scrollLock').scrollTop('10000').show();
}

function scrollUnlock(){
    $('#scrollLock').hide();
}

Ответ 17

Для людей, которые имеют центрированные макеты (через margin:0 auto;), здесь создается размытие решения position:fixed и предлагаемое решение @tfe.

Используйте это решение, если вы испытываете перехват страниц (из-за того, что полоса прокрутки отображается/скрывается).

// lock scroll position, but retain settings for later
var scrollPosition = [
    window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
    window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
];
var $html = $('html'); // bow to the demon known as MSIE(v7)
$html.addClass('modal-noscroll');
$html.data('scroll-position', scrollPosition);
$html.data('margin-top', $html.css('margin-top'));
$html.css('margin-top', -1 * scrollPosition[1]);

... в сочетании с...

// un-lock scroll position
var $html = $('html').removeClass('modal-noscroll');
var scrollPosition = $html.data('scroll-position');
var marginTop = $html.data('margin-top');
$html.css('margin-top', marginTop);
window.scrollTo(scrollPosition[0], scrollPosition[1])

... и, наконец, CSS для .modal-noscroll...

.modal-noscroll
{
    position: fixed;
    overflow-y: scroll;
    width: 100%;
}

Я бы рискнул сказать, что это скорее правильное решение, чем любое другое решение, но я еще не тестировал его еще...: P


Изменить: обратите внимание, что я не знаю, как это могло бы сильно (читать: взорвать) на сенсорном устройстве.

Ответ 18

Вы также можете использовать DOM для этого. Скажем, у вас есть функция, которую вы вызываете так:

function disable_scroll() {
document.body.style.overflow="hidden";
}

И это все! Надеюсь, это поможет в дополнение ко всем остальным ответам!

Ответ 19

Вот что я сделал:

CoffeeScript:

    $("input").focus ->
        $("html, body").css "overflow-y","hidden"
        $(document).on "scroll.stopped touchmove.stopped mousewheel.stopped", (event) ->
            event.preventDefault()

    $("input").blur ->
        $("html, body").css "overflow-y","auto"
        $(document).off "scroll.stopped touchmove.stopped mousewheel.stopped"

JavaScript:

$("input").focus(function() {
 $("html, body").css("overflow-y", "hidden");
 $(document).on("scroll.stopped touchmove.stopped mousewheel.stopped", function(event) {
   return event.preventDefault();
 });
});

$("input").blur(function() {
 $("html, body").css("overflow-y", "auto");
 $(document).off("scroll.stopped touchmove.stopped mousewheel.stopped");
});

Ответ 20

Не уверен, что кто-то опробовал мое решение. Это работает на всем теле /​​html, но, без сомнения, его можно применить к любому элементу, который запускает событие прокрутки.

Просто установите и отключите scrollLock по мере необходимости.

var scrollLock = false;
var scrollMem = {left: 0, top: 0};

$(window).scroll(function(){
    if (scrollLock) {
        window.scrollTo(scrollMem.left, scrollMem.top);
    } else {
        scrollMem = {
            left: self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
            top: self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
        };
    }
});

Вот пример JSFiddle

Надеюсь, это поможет кому-то.

Ответ 21

  • Скрыть свиток: $("body").css("overflow", "hidden");
  • Чтобы восстановить прокрутку: $("body").css("overflow", "initial");