Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как запретить скролл документа (https://javascript.ru/forum/misc/32243-kak-zapretit-skroll-dokumenta.html)

dmitry111 08.10.2012 22:33

как запретить скролл документа
 
Как запретить скролл всего документа если прокручивать конкретный элемент?

Чтобы была возможность скроллить внутри элемента и это не всплывало на весь документ....

Почему не работает функция запрета всплытия, но ведь скролл всплывает наверх:

stopPropagation = function (event) {
    if (event.stopPropagation) {
        event.stopPropagation();
    } else {
        event.cancelBubble = true;
    }
}

dmitriymar 10.10.2012 14:31

какой ещё может быть способ кроме отмены действия стандартного?

dmitry111 07.12.2012 23:33

Все таки не нашел решения..
Скролл документа пропадает если задать боди overflow: hidden
element.onmousewheel = function () {
    document.body.style.overflow = 'hidden';
};

Может возможно как то запретить скролл во всем документе, кроме конкретного элемента по-другому (без использования стилей)?

schmetterling 08.12.2012 02:00

Цитата:

Сообщение от dmitry111
Может возможно как то запретить скролл во всем документе, кроме конкретного элемента по-другому (без использования стилей)?

<html>
<body>
<div style="height: 1000px;">bla</div>
<script>
document.addEventListener(
    "scroll",
    function(e){
      alert("Событие возможно отменить? " + e.cancelable);
    },
    true)
</script>
</body>
</html>


Спецификация(

dmitry111 08.12.2012 08:32

schmetterling,

а если mousewheel то тру. Я имею в виду только события мыши, а не полный скролл
<html>
<body>
<div style="height: 1000px;">bla</div>
<script>
document.addEventListener(
    "mousewheel",
    function(e){
      alert("Событие возможно отменить? " + e.cancelable);
    },
    true)
</script>
</body>
</html>

dmitry111 08.12.2012 08:40

Сейчас посмотрел во вконтактике прокрутка запрещается с помощью
document.body.style.overflow = 'hidden';

так и сделаю

dmitry111 08.12.2012 10:06

Вот сделал на скорую руку. Когда мышь над дивом - скролл у боди отсутствует
Интересует мнение, как это будет работать если в этих дивах буду дочерние элементы и боди будет заполнен

<!DOCTYPE HTML>
<html>
  <head>
    <style>
      div {
        width: 60px;
        height: 60px;
        margin: 100px;
      }
    </style>
  </head>
  <body style="height:1000px">
    <div id="a" style="background:#f00"></div>
    <div id="b" style="background:#ff0"></div>
    <div id="c" style="background:#f0f"></div>
    <div id="d" style="background:#0ff"></div>
    <div id="e" style="background:#00f"></div>

    <script>
      function offScroll () {
      	document.body.style.overflow = "hidden";
		this.onmouseout = function () {
			document.body.style.overflow = "auto";
		};	
      }
      
	document.getElementById("a").onmouseover = function () {
		offScroll();
	};
	document.getElementById("b").onmouseover = function () {
		offScroll();
	};
	document.getElementById("c").onmouseover = function () {
		offScroll();
	};

	document.getElementById("d").onmouseover = function () {
		offScroll();
	};

	document.getElementById("e").onmouseover = function () {
		offScroll();
	};
    </script>

  </body>
</html>

этот же пример в ссылке http://learn.javascript.ru/play/oOxmqb









По идее onmouseout должен срабатывать при попадании на дочерний элемент элемент у div1 (линк), но этого не происходит, почему?

<!DOCTYPE HTML>
<html>
<head>
	<style>
		#div1 {
			width: 200px;
			height: 200px;
			margin: 50px auto;
			background: #000;
			position: relative;
		}
		#div2 {
			width: 180px;
			height: 180px;
			background: #f00;
			position: absolute;
			left: 0;
			right: 0;
			top: 0;
			bottom: 0;
			margin: auto;
		}
		#div3 {
			width: 160px;
			height: 160px;
			background: #0f0;
			position: absolute;
			left: 0;
			right: 0;
			top: 0;
			bottom: 0;
			margin: auto;
		}
		#div4 {
			width: 140px;
			height: 140px;
			background: #00f;
			position: absolute;
			left: 0;
			right: 0;
			top: 0;
			bottom: 0;
			margin: auto;
		}
	</style>
</head>
<body style="height:1000px;">
<div id="div1">
	<div id="div2">
		<div id="div3">
			<div id="div4"></div>
		</div>
	</div>
</div>

<script>
	function offScroll () {
		document.body.style.overflow = "hidden";
		this.onmouseout = function () {
			document.body.style.overflow = "auto";
		};
	}

	document.getElementById("div1").onmouseover = function () {
		offScroll();
	};
</script>

</body>
</html>

этот же пример в ссылке http://learn.javascript.ru/play/Yt9EMb

schmetterling 08.12.2012 12:38

Цитата:

Сообщение от dmitry111
а если mousewheel то тру. Я имею в виду только события мыши, а не полный скролл

Тогда его можно отменить с помощью event.preventDefault(); Правда, как я помню, не очень-то mousewheel поддерживается(

Цитата:

Сообщение от dmitry111
По идее onmouseout должен срабатывать при попадании на дочерний элемент элемент у div1

Нет, почему, ведь эти элементы -- тоже часть div1.

А с overflow: hidden может быть такой косяк, что будет прыгать страница влево-вправо, т.к. скроллбар исчезать будет.

dmitry111 08.12.2012 13:59

Цитата:

Сообщение от schmetterling
Тогда его можно отменить с помощью event.preventDefault();

оно отменит событие в самом окне, а не в документе

Цитата:

Сообщение от schmetterling
Правда, как я помню, не очень-то mousewheel поддерживается(

не поддерживается в firefox. Там есть DOMMouseScroll, MozMousePixelScroll

Цитата:

Сообщение от schmetterling
Нет, почему, ведь эти элементы -- тоже часть div1.

но это уже не div1, поэтому должен сработать mouseout, но он не срабатывает. Тут так написано

Цитата:

Сообщение от schmetterling
А с overflow: hidden может быть такой косяк, что будет прыгать страница влево-вправо, т.к. скроллбар исчезать будет.

можно делать только по y - overflow-y: hidden


Часовой пояс GMT +3, время: 20:32.