it-swarm.com.ru

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

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

Моя идея состоит в том, чтобы:

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

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


Обновление:

Пожалуйста, посмотрите мой пример и причину, по которой, на http://jsbin.com/ikuma4/2/edit

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

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

145
Hailwood

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

  1. Возьмите текущую позицию прокрутки (не забудьте горизонтальную ось!).
  2. Установите переполнение скрытым (вероятно, хотите сохранить предыдущее значение переполнения).
  3. Прокрутите документ до сохраненной позиции прокрутки с помощью 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])
125
tfe

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

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

Восстановить:

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

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

204
gitaarik

попробуй это

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

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

$("body").css("overflow", "hidden");
26
mr.soroush

Я просто привожу небольшую настройку решения с помощью tfe . В частности, я добавил некоторые дополнительные элементы управления, чтобы гарантировать, что нет смещения содержимого страницы (иначе page shift), когда полоса прокрутки установлена ​​на 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);
}

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

25
JeanValjean

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

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

сбросить:

$(window).off('scroll');
18
Patrick DaVader

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

var $window = $(window);

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

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

https://jsfiddle.net/22cLw9em/

5
dzimi

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

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

Там есть демо здесь.

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

$(window).disablescroll();

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

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

$(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 совместимость

4
Pawel

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

3
Adrian Schmidt

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

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

2
mhenry1384

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

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

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

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

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

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

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

2
Jeremy Warne
  • Чтобы скрыть свиток: $("body").css("overflow", "hidden");
  • Чтобы восстановить прокрутку: $("body").css("overflow", "initial");
2
Joan Alberto Aguilar Peña

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

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

Восстановить:

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

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

    $(function() { 
        // ...

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

        // ...
    });
1
Jopie

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

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

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

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

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

0
Brendan

Это то, что я в итоге сделал:

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");
});
0
Marz

Не уверен, что кто-нибудь попробовал мое решение. Этот работает для всего тела/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

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

0
FossilMFC

Вы можете закрыть окно прокручиваемым элементом 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();
}
0
Appex

Я думаю, что лучшее и чистое решение:

window.addEventListener('scroll',() => {
    var x = window.scrollX;
    var y = window.scrollY;
    window.scrollTo(x,y);
});

И с помощью jQuery:

$(window).on('scroll',() => {
    var x = window.scrollX;
    var y = window.scrollY;
    window.scrollTo(x,y)
})

Те, кто прослушивает события, должны блокировать прокрутку . Просто удалите их, чтобы снова включить прокрутку

0
Tiziano

Для людей, которые имеют центрированные макеты (через 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


Правка: обратите внимание, что я понятия не имею, насколько плохо это может работать (читай: взорвать) на сенсорном устройстве.

0
Matthematics