Предотвратить «чрезмерную прокрутку» веб-страницы


105

В Chrome для Mac можно «пролистать» страницу (из-за отсутствия лучшего слова), как показано на скриншоте ниже, чтобы увидеть, «что позади», аналогично iPad или iPhone.

Я заметил, что на некоторых страницах он отключен, например, в Gmail и на странице «Новая вкладка».

Как отключить "перескроллинг"? Есть ли другие способы, которыми я могу управлять "чрезмерной прокруткой"?

введите описание изображения здесь


1
Я на самом деле пытаюсь включить его, например, на странице newtab. Пытаюсь понять суть проблемы.
Randomblue

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

Ответы:


164

Принятое решение не сработало для меня. Единственный способ заставить его работать, все еще имея возможность прокрутки, - это:

html {
    overflow: hidden;
    height: 100%;
}

body {
    height: 100%;
    overflow: auto;
}

2
Это решение проблематично как для устройств, которые не соблюдают htmlстиль, так и для мобильных веб-браузеров, которые смотрят на полное переполнение bodyбез учета установленной высоты html.
написано

5
Это решение не работает с Chrome 46 для Mac. Это предотвращает чрезмерную прокрутку, но ни один из дочерних элементов не прокручивается.
Дэниел Боннелл,

1
Тогда как вы можете получить значение scrollTop, которое вы обычно получаете $(window).scrollTop?
Guig

1
Ни одно решение не работает для меня в Chrome 49 для Mac или Firefox 44 для Mac. window.scrollYвсегда 0.
momo

3
Работает для Chrome, но не для Safari.
Бреттон Уэйд,

62

В Chrome 63+, Firefox 59+ и Opera 50+ вы можете сделать это в CSS:

body {
  overscroll-behavior-y: none;
}

Это отключает эффект резиновой ленты на iOS, показанный на снимке экрана с вопросом. Однако он также отключает оттягивание для обновления, эффекты свечения и цепочку прокрутки.

Однако вы можете реализовать свой собственный эффект или функциональность при чрезмерной прокрутке. Если вы, например, хотите размыть страницу и добавить аккуратную анимацию:

<style>
  body.refreshing #inbox {
    filter: blur(1px);
    touch-action: none; /* prevent scrolling */
  }
  body.refreshing .refresher {
    transform: translate3d(0,150%,0) scale(1);
    z-index: 1;
  }
  .refresher {
    --refresh-width: 55px;
    pointer-events: none;
    width: var(--refresh-width);
    height: var(--refresh-width);
    border-radius: 50%; 
    position: absolute;
    transition: all 300ms cubic-bezier(0,0,0.2,1);
    will-change: transform, opacity;
    ...
  }
</style>

<div class="refresher">
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
</div>

<section id="inbox"><!-- msgs --></section>

<script>
  let _startY;
  const inbox = document.querySelector('#inbox');

  inbox.addEventListener('touchstart', e => {
    _startY = e.touches[0].pageY;
  }, {passive: true});

  inbox.addEventListener('touchmove', e => {
    const y = e.touches[0].pageY;
    // Activate custom pull-to-refresh effects when at the top of the container
    // and user is scrolling up.
    if (document.scrollingElement.scrollTop === 0 && y > _startY &&
        !document.body.classList.contains('refreshing')) {
      // refresh inbox.
    }
  }, {passive: true});
</script>

Поддержка браузера

На момент написания этой статьи Chrome 63+, Firefox 59+ и Opera 50+ поддерживают его. Edge публично поддержал его, в то время как Safari неизвестен. Отслеживайте прогресс здесь и текущую совместимость браузеров в документации MDN.

Больше информации


3
На мой взгляд, это лучшее решение. И все просто. Тот, у кого есть все положительные голоса, может быть проблематичным.
TheTC

38

Один из способов предотвратить это - использовать следующий CSS:

html, body {
    width: 100%;
    height: 100%;
    overflow: hidden;
}

body > div {
    height: 100%;
    overflow: scroll;
    -webkit-overflow-scrolling: touch;
}

Таким образом, тело никогда не переполняется и не «подпрыгивает» при прокрутке вверху и внизу страницы. Контейнер будет отлично прокручивать свое содержимое внутри. Это работает в Safari и в Chrome.

редактировать

Почему дополнительный <div>-элемент в качестве оболочки может быть полезен:
решение Флориана Фельдхауса использует немного меньше кода и отлично работает. Однако он может иметь небольшую причуду, когда речь идет о содержимом, превышающем ширину области просмотра. В этом случае полоса прокрутки в нижней части окна перемещена из области просмотра на полпути, и ее трудно распознать / дотянуться. Этого можно избежать, body { margin: 0; }если применимо. В ситуации, когда вы не можете добавить этот CSS, полезен элемент-оболочка, поскольку полоса прокрутки всегда полностью видна.

Найдите скриншот ниже: введите описание изображения здесь


3
Если это сработало однажды, то больше не работает. В моем Chrome v37 поведение перескока будет происходить везде, где прокручивается элемент.
bbsimonbb

@ user1585345 Я протестировал это прямо сейчас в Chrome 38 снова на OS X, и он все еще работает (также в Safari). Вот файл, который я использую. Можете ли вы проверить это с помощью этого файла? Прямая ссылка на файл на sendpace.com .
insertusernamehere

1
Я тестировал с вышеуказанным файлом, и у меня все еще есть отказы. Я подозреваю, что мы не раскроем эту тайну. Chrome 37
bbsimonbb 03

Вам не понадобится дополнительный div-обертка. Проверьте ответ ниже, чтобы найти лучшее решение.
JayD3e

1
Это решение не работает с Chrome 46 для Mac. Это предотвращает чрезмерную прокрутку, но ни один из дочерних элементов не прокручивается.
Дэниел Боннелл,


2

Вы можете использовать этот код для удаления touchmoveпредопределенного действия:

document.body.addEventListener('touchmove', function(event) {
  console.log(event.source);
  //if (event.source == document.body)
    event.preventDefault();
}, false);

2
html,body {
    width: 100%;
    height: 100%;
}
body {
    position: fixed;
    overflow: hidden;
}

4
Хотя это может дать ответ на вопрос, лучше объяснить основные части ответа и, возможно, в чем была проблема с кодом OP.
pirho

Ваш ответ был помечен из-за его длины и содержания. Предлагаю доработать. Возможно добавление дополнительных деталей.
www139

1
position: fixedэто спаситель!
Низамил Путра

0

position: absoluteработает для меня. Я тестировал Chrome 50.0.2661.75 (64-bit)и OSX.

body {
  overflow: hidden;
}

// position is important
#element {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow: auto;
}

0

Эффект отскока нельзя отключить, за исключением того, что высота веб-страницы равна window.innerHeight, вы можете разрешить прокрутку подэлементов.

html {
    overflow: hidden;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.