Запрет прокрутки
Здравствуйте.
Подскажите, как можно запретить прокрутку (не убирая сами полосы прокрутки, чтобы контент не скакал)? Идея такая: https://jsfiddle.net/Novitsky/77z57xfk/. Надо, чтобы при появлении меню прокрутка контента на заднем плане была заблокирована. overflow:hidden не подойдет, чтобы полоса прокрутки не убиралась. |
<div style="height:2000px;"></div> <script> window.onscroll = () => window.scrollTo(0, 0); </script> |
Спасибо.
Протестировал: https://jsfiddle.net/Novitsky/zf4qv89L/. Я вставил эту строчку в свой скрипт — работает, но наполовину. Как сделать, чтобы при удалении класса прокрутка снова начинала работать? |
Небольшой пример.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
</head>
<body>
<style>
div{
height : 2000px;
border : 1px solid black;
}
</style>
<script>
$(function () {
$('.nav-icon').click(function () {
$('body').toggleClass('nav-active');
});
$('body').on({
'mousewheel': function (e) {
if ($('body').hasClass('nav-active')){
e.preventDefault();
e.stopPropagation();
}
}
})
})
</script>
<div class="nav-icon"><span><span class="invisible">Меню</span></span></div>
</body>
</html>
|
Спасибо большое. Теперь работает, как надо.
|
Тут вот подумал. Ради интереса, раз пошла такая пьянка. А можно до кучи запретить стрелки, PgUp, PgDn, Home, End и пробел, и разрешить удаление класса nav-active по Esc'пу?
|
В инете нашел один скриптик:
// left: 37, up: 38, right: 39, down: 40,
// spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
var keys = {37: 1, 38: 1, 39: 1, 40: 1};
function preventDefault(e) {
e = e || window.event;
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
}
function preventDefaultForScrollKeys(e) {
if (keys[e.keyCode]) {
preventDefault(e);
return false;
}
}
function disableScroll() {
if (window.addEventListener) // older FF
window.addEventListener('DOMMouseScroll', preventDefault, false);
window.onwheel = preventDefault; // modern standard
window.onmousewheel = document.onmousewheel = preventDefault; // older browsers, IE
window.ontouchmove = preventDefault; // mobile
document.onkeydown = preventDefaultForScrollKeys;
}
function enableScroll() {
if (window.removeEventListener)
window.removeEventListener('DOMMouseScroll', preventDefault, false);
window.onmousewheel = document.onmousewheel = null;
window.onwheel = null;
window.ontouchmove = null;
document.onkeydown = null;
}
Запихнул в свой:
$('.nav-icon').click(function() {
$('body').toggleClass('nav-active');
});
$('body').on({
'mousewheel': function(e) {
if ($('body').hasClass('nav-active')) {
e.preventDefault();
e.stopPropagation();
}
}
// left: 37, up: 38, right: 39, down: 40,
// spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
var keys = {37: 1, 38: 1, 39: 1, 40: 1};
function preventDefault(e) {
e = e || window.event;
if (e.preventDefault)
e.preventDefault();
e.returnValue = false;
}
function preventDefaultForScrollKeys(e) {
if (keys[e.keyCode]) {
preventDefault(e);
return false;
}
}
function disableScroll() {
if (window.addEventListener) // older FF
window.addEventListener('DOMMouseScroll', preventDefault, false);
window.onwheel = preventDefault; // modern standard
window.onmousewheel = document.onmousewheel = preventDefault; // older browsers, IE
window.ontouchmove = preventDefault; // mobile
document.onkeydown = preventDefaultForScrollKeys;
}
function enableScroll() {
if (window.removeEventListener)
window.removeEventListener('DOMMouseScroll', preventDefault, false);
window.onmousewheel = document.onmousewheel = null;
window.onwheel = null;
window.ontouchmove = null;
document.onkeydown = null;
}
})
Не работает.Я понимаю, что сделал что-то не так, но у меня практически нулевые познания в JS. Да и громоздкое какое-то решение, и события по Esc'пу в нем нет. ( И всякие //older FF и //older browsers мне ни к чему. |
Szorstki,
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
</head>
<body>
<style>
div {
height: 2000px;
border: 1px solid black;
}
</style>
<script>
$(function () {
var keys = { 37: 1, 38: 1, 39: 1, 40: 1, 32: 1, 36 : 1, 35: 1 };
$('.nav-icon').click(function () {
$('body').toggleClass('nav-active');
});
$('body').on({
'mousewheel': function (e) {
if ($('body').hasClass('nav-active')){
e.preventDefault();
e.stopPropagation();
}
},
'keydown': function (e) {
var key = e.keyCode
if (keys[key] && $('body').hasClass('nav-active')) {
e.preventDefault();
e.stopPropagation();
}
if (key == 27) {
$('body').removeClass('nav-active')
}
}
})
})
</script>
<div class="nav-icon"><span><span class="invisible">Меню</span></span></div>
</body>
</html>
|
Вообще суперски. Все работает. Спасибо!
|
Только что проверил еще раз. Странно, почему-то в Firefox'е не блокирует прокрутку. С остальным все в порядке.
P. S. Вообще с последней версией FF какая-то фигня. И Flexbox стал некорректно работать. |
| Часовой пояс GMT +3, время: 05:59. |