Отключить эластичную прокрутку в Safari
Я просто хотел сменить эффект упругой прокрутки/отскока в Safari (OSX Lion).
Я нашел решение установить overflow: hidden
для тела в css, но, как и ожидалось, только отключает полосу прокрутки, поэтому, если сайт "длиннее", чем экран, вы не сможете для прокрутки!
Любые решения или подсказки приветствуются!
Спасибо!
Ответы
Ответ 1
Вы можете добиться этого более универсально, применяя следующий CSS:
html,
body {
height: 100%;
width: 100%;
overflow: auto;
}
Это позволяет вашему контенту, независимо от его количества, прокручиваться в body
, но имейте в виду, что контекст прокрутки, где выполняется событие scroll
, теперь document.body
, а не window
.
Ответ 2
Если вы используете тэг overflow:hidden
в элементе <body>
, чтобы вернуться к нормальному прокручиванию, вы можете полностью позиционировать <div>
внутри элемента, чтобы получить прокрутку с помощью overflow:auto
. Я думаю, что это лучший вариант, и его довольно просто реализовать, используя только css!
Или вы можете попробовать с помощью jQuery:
$(document).bind(
'touchmove',
function(e) {
e.preventDefault();
}
);
То же самое в javasrcipt:
document.addEventListener(
'touchmove',
function(e) {
e.preventDefault();
},
false
);
Последний вариант, проверьте ipad safari: отключить прокрутку и эффект отскока?
Ответ 3
overflow:hidden;-webkit-overflow-scrolling:touch
не будет работать на сафари 8.1 для iOS, поскольку фиксированный заголовок окажется вне видимой области.
![gif]()
Как говорит @Yisela, css следует поместить на .container
(<div>
ниже <body>
). который, кажется, не проблема (в лизинг на сафари iOS 8.1)
![gif]()
Я разместил демо в своем блоге:
http://tech.colla.me/en/show/disable_elastic_scroll_on_iOS_safari
Ответ 4
Я сделал расширение, чтобы отключить его на всех сайтах. При этом я использовал три метода: чистый CSS, чистый JS и гибрид.
Версия CSS похожа на приведенные выше решения. JS выглядит примерно так:
var scroll = function(e) {
// compute state
if (stopScrollX || stopScrollY) {
e.preventDefault(); // this one is the key
e.stopPropagation();
window.scroll(scrollToX, scrollToY);
}
}
document.addEventListener('mousewheel', scroll, false);
CSS работает, когда вы используете позицию: фиксированные элементы и пусть браузер выполняет прокрутку. JS необходим, когда какой-либо другой JS зависит от окна (например, события), который блокируется предыдущим CSS (поскольку он заставляет тело прокручиваться вместо окна) и работает, останавливая распространение событий по краям, но нуждается в синтезировать прокрутку компонента без края; Недостатком является то, что он предотвращает некоторые типы прокрутки (они работают с одним CSS). Гибрид пытается использовать смешанный подход, выборочно отключая направленное переполнение (CSS), когда прокрутка достигает края (JS), и теоретически может работать в обоих случаях, но не совсем в настоящее время, поскольку она имеет некоторый запас на пределе.
Таким образом, в зависимости от реализаций одного веб-сайта нужно либо взять один подход, либо другой.
Смотрите здесь, если хотите получить более подробную информацию: https://github.com/lloeki/unelastic
Ответ 5
Ни один из "переполненных" решений не работал у меня. Я кодирую эффект параллакса с помощью JavaScript с помощью jQuery. В Chrome и Safari на OSX эффект эластичных/резиновых полос испортил мои номера прокрутки, поскольку он фактически прокручивается за высоту документа и обновляет переменные окна с номерами вне границ. Я должен был проверить, было ли прокручиваемое количество больше фактической высоты документа, например:
$(window).scroll(
function() {
if ($(window).scrollTop() + $(window).height() > $(document).height()) return;
updateScroll(); // my own function to do my parallaxing stuff
}
);
Ответ 6
Вы можете проверить, находятся ли смещения прокрутки в границах. Если они выйдут за пределы, верните их.
var scrollX = 0;
var scrollY = 0;
var scrollMinX = 0;
var scrollMinY = 0;
var scrollMaxX = document.body.scrollWidth - window.innerWidth;
var scrollMaxY = document.body.scrollHeight - window.innerHeight;
// make sure that we work with the correct dimensions
window.addEventListener('resize', function () {
scrollMaxX = document.body.scrollWidth - window.innerWidth;
scrollMaxY = document.body.scrollHeight - window.innerHeight;
}, false);
// where the magic happens
window.addEventListener('scroll', function () {
scrollX = window.scrollX;
scrollY = window.scrollY;
if (scrollX <= scrollMinX) scrollTo(scrollMinX, window.scrollY);
if (scrollX >= scrollMaxX) scrollTo(scrollMaxX, window.scrollY);
if (scrollY <= scrollMinY) scrollTo(window.scrollX, scrollMinY);
if (scrollY >= scrollMaxY) scrollTo(window.scrollX, scrollMaxY);
}, false);
http://jsfiddle.net/yckart/3YnUM/
Ответ 7
Ни один из вышеперечисленных решений не работал у меня, однако вместо этого я завернул свой контент в div (# external-wrap), а затем использовал следующий CSS:
body {
overflow: hidden;
}
#outer-wrap {
-webkit-overflow-scrolling: touch;
height: 100vh;
overflow: auto;
}
Очевидно, что он работает только в браузерах, которые поддерживают ширину/высоту видового экрана.
Ответ 8
Я решил это на iPad. Попробуйте, если он работает и на OSX.
body, html { position: fixed; }
Работает только в том случае, если у вас есть контент меньший, чем экран, или вы используете некоторую структуру макета (Angular Материал в моем случае).
В Angular Материал отлично, что вы отключите эффект прокрутки всей страницы, но внутренние разделы <md-content>
могут оставаться прокручиваемыми.
Ответ 9
Есть ситуации, когда вышеупомянутые решения CSS не работают. Например, прозрачный фиксированный заголовок и липкий нижний колонтитул на той же странице. Чтобы предотвратить скачок верхнего уровня в сафари, возиться с вещами и вызвать вспышки на ползунках полноэкранного режима, вы можете использовать это.
if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) {
$window.bind('mousewheel', function(e) {
if (e.originalEvent.wheelDelta / 120 > 0) {
if ($window.scrollTop() < 2) return false;
}
});
}