스크롤 막대가있는 div가 있고 끝에 도달하면 페이지가 스크롤되기 시작합니다. 어쨌든이 동작을 멈출 수 있습니까?
답변
다음과 같이 수행하여 전체 페이지의 스크롤을 비활성화 할 수 있습니다.
<div onmouseover="document.body.style.overflow='hidden';" onmouseout="document.body.style.overflow='auto';"></div>
답변
해결책을 찾았습니다.
이것이 내가 필요한 것입니다.
그리고 이것이 코드입니다.
http://jsbin.com/itajok/edit#javascript,html
jQuery 플러그인을 사용합니다.
지원 중단 알림으로 인한 업데이트
에서 JQuery와 – 마우스 휠 :
이벤트 핸들러에 세 개의 인수 (
delta
,deltaX
및deltaY
)를 추가하는 이전 동작 은 이제 더 이상 사용되지 않으며 이후 릴리스에서 제거됩니다.
event.deltaY
이제 다음을 사용해야합니다.
var toolbox = $('#toolbox'),
height = toolbox.height(),
scrollHeight = toolbox.get(0).scrollHeight;
toolbox.off("mousewheel").on("mousewheel", function (event) {
var blockScrolling = this.scrollTop === scrollHeight - height && event.deltaY < 0 || this.scrollTop === 0 && event.deltaY > 0;
return !blockScrolling;
});
답변
선택한 솔루션은 예술 작품입니다. 플러그인의 가치가 있다고 생각했습니다 ….
$.fn.scrollGuard = function() {
return this
.on( 'wheel', function ( e ) {
var event = e.originalEvent;
var d = event.wheelDelta || -event.detail;
this.scrollTop += ( d < 0 ? 1 : -1 ) * 30;
e.preventDefault();
});
};
이것은 나에게 지속적인 불편 함이었고이 솔루션은 내가 본 다른 해킹에 비해 너무 깨끗합니다. 그것이 어떻게 작동하고 얼마나 널리 지원되는지에 대해 더 궁금해하지만 Jeevan과 처음에 이것을 생각해 낸 누구에게나 환호합니다. BTW-stackoverflow 답변 편집기가 필요합니다!
최신 정보
DOM을 전혀 조작하지 않고 조건부로만 버블 링을 방지한다는 점에서 이것이 더 낫다고 생각합니다.
$.fn.scrollGuard2 = function() {
return this
.on( 'wheel', function ( e ) {
var $this = $(this);
if (e.originalEvent.deltaY < 0) {
/* scrolling up */
return ($this.scrollTop() > 0);
} else {
/* scrolling down */
return ($this.scrollTop() + $this.innerHeight() < $this[0].scrollHeight);
}
})
;
};
크롬에서 훌륭하게 작동하고 다른 솔루션보다 훨씬 간단합니다 … 다른 곳에서 어떻게 작동하는지 알려주세요 …
답변
div에서 mouseover 이벤트를 사용하여 본문 스크롤바를 비활성화 한 다음 mouseout 이벤트를 사용하여 다시 활성화 할 수 있습니까?
예 : HTML
<div onmouseover="disableBodyScroll();" onmouseout="enableBodyScroll();">
content
</div>
그런 다음 자바 스크립트는 다음과 같습니다.
var body = document.getElementsByTagName('body')[0];
function disableBodyScroll() {
body.style.overflowY = 'hidden';
}
function enableBodyScroll() {
body.style.overflowY = 'auto';
}
답변
Y 축에서이 작업을 수행하는 브라우저 간 방법은 데스크톱 및 모바일에서 작동합니다. OSX 및 iOS에서 테스트되었습니다.
var scrollArea = this.querySelector(".scroll-area");
scrollArea.addEventListener("wheel", function() {
var scrollTop = this.scrollTop;
var maxScroll = this.scrollHeight - this.offsetHeight;
var deltaY = event.deltaY;
if ( (scrollTop >= maxScroll && deltaY > 0) || (scrollTop === 0 && deltaY < 0) ) {
event.preventDefault();
}
}, {passive:false});
scrollArea.addEventListener("touchstart", function(event) {
this.previousClientY = event.touches[0].clientY;
}, {passive:false});
scrollArea.addEventListener("touchmove", function(event) {
var scrollTop = this.scrollTop;
var maxScroll = this.scrollHeight - this.offsetHeight;
var currentClientY = event.touches[0].clientY;
var deltaY = this.previousClientY - currentClientY;
if ( (scrollTop >= maxScroll && deltaY > 0) || (scrollTop === 0 && deltaY < 0) ) {
event.preventDefault();
}
this.previousClientY = currentClientY;
}, {passive:false});
답변
이 문제에 대한 해결책을 썼습니다.
var div;
div = document.getElementsByClassName('selector')[0];
div.addEventListener('mousewheel', function(e) {
if (div.clientHeight + div.scrollTop + e.deltaY >= div.scrollHeight) {
e.preventDefault();
div.scrollTop = div.scrollHeight;
} else if (div.scrollTop + e.deltaY <= 0) {
e.preventDefault();
div.scrollTop = 0;
}
}, false);
답변
귀하의 질문을 올바르게 이해했다면 마우스가 div 위에있을 때 주요 콘텐츠 스크롤을 방지하고 싶습니다 (사이드 바라고 가정 해 보겠습니다). 이를 위해 사이드 바는 스크롤 이벤트가 부모에게 버블 링되는 것을 방지하기 위해 기본 콘텐츠 (브라우저 창)의 스크롤 컨테이너의 자식이 아닐 수 있습니다.
다음과 같은 방식으로 일부 마크 업 변경이 필요할 수 있습니다.
<div id="wrapper">
<div id="content">
</div>
</div>
<div id="sidebar">
</div>
그것에서 일하고 참조하십시오 이 샘플 바이올린 과 비교하여 해당 이 샘플 바이올린 사이드 바의 약간 다른 마우스 휴가 동작이 있습니다.
브라우저의 기본 스크롤바로 특정 div 하나만 스크롤하는 것도 참조하십시오 .