programing

jQuery로 페이지 스크롤을 프로그래밍 방식으로 비활성화하는 방법

skycolor 2023. 9. 9. 09:14
반응형

jQuery로 페이지 스크롤을 프로그래밍 방식으로 비활성화하는 방법

jQuery를 사용하여 본문 스크롤을 비활성화합니다.

제 생각은 다음과 같습니다.

  1. 세트 body{ overflow: hidden;}
  2. 캡처 scrollTop();/scrollLeft()
  3. 본문 스크롤 이벤트에 바인딩하고 scrollTop/scrollLeft를 캡처된 값으로 설정합니다.

더 좋은 방법이 있습니까?


업데이트:

http://jsbin.com/ikuma4/2/edit 에서 제 사례와 그 이유를 확인해 주시기 바랍니다.

누군가가 "왜 그는 그냥 사용하지 않는가"라고 생각할 것이라는 것을 알고 있습니다.position: fixed패널에?"

다른 이유가 있으니 제안하지 말아주세요.

이렇게 하면 스크롤이 완전히 비활성화됩니다.

$('html, body').css({
    overflow: 'hidden',
    height: '100%'
});

복원 방법:

$('html, body').css({
    overflow: 'auto',
    height: 'auto'
});

파이어폭스와 크롬에서 테스트해 봤습니다.

이렇게 할 수 있는 유일한 방법은 당신이 설명한 것과 비슷합니다.

  1. 현재 스크롤 위치를 잡습니다(가로축 잊지 마십시오!).
  2. 오버플로를 숨김(hidden)으로 설정합니다(이전 오버플로 값을 유지하려고 할 수 있습니다).
  3. 스크롤 To()로 문서를 저장된 스크롤 위치로 스크롤합니다.

그런 다음 스크롤을 다시 허용할 준비가 되면 모든 작업을 취소합니다.

편집: 코드를 못 드릴 이유는 없습니다. 제가 그걸 캐내느라 고생했었기 때문에...

// lock scroll position, but retain settings for later
var scrollPosition = [
  self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
  self.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
];
var html = jQuery('html'); // it would make more sense to apply this to body, but IE7 won't have that
html.data('scroll-position', scrollPosition);
html.data('previous-overflow', html.css('overflow'));
html.css('overflow', 'hidden');
window.scrollTo(scrollPosition[0], scrollPosition[1]);


// un-lock scroll position
var html = jQuery('html');
var scrollPosition = html.data('scroll-position');
html.css('overflow', html.data('previous-overflow'));
window.scrollTo(scrollPosition[0], scrollPosition[1])

이거 먹어봐요.

$('#element').on('scroll touchmove mousewheel', function(e){
  e.preventDefault();
  e.stopPropagation();
  return false;
})

저는 솔루션에 대해 tfe로 약간의 튜닝을 제공할 뿐입니다.특히 스크롤 바가 다음으로 설정되었을 때 페이지 내용의 이동(페이지 이동이라고 함)이 없도록 몇 가지 추가 컨트롤을 추가했습니다.hidden.

함수 2개 2lockScroll()그리고.unlockScroll()페이지 스크롤을 잠그고 잠금을 해제하도록 각각 정의할 수 있습니다.

function lockScroll(){
    $html = $('html'); 
    $body = $('body'); 
    var initWidth = $body.outerWidth();
    var initHeight = $body.outerHeight();

    var scrollPosition = [
        self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
        self.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
    ];
    $html.data('scroll-position', scrollPosition);
    $html.data('previous-overflow', $html.css('overflow'));
    $html.css('overflow', 'hidden');
    window.scrollTo(scrollPosition[0], scrollPosition[1]);   

    var marginR = $body.outerWidth()-initWidth;
    var marginB = $body.outerHeight()-initHeight; 
    $body.css({'margin-right': marginR,'margin-bottom': marginB});
} 

function unlockScroll(){
    $html = $('html');
    $body = $('body');
    $html.css('overflow', $html.data('previous-overflow'));
    var scrollPosition = $html.data('scroll-position');
    window.scrollTo(scrollPosition[0], scrollPosition[1]);    

    $body.css({'margin-right': 0, 'margin-bottom': 0});
}

내가 가정한 곳에서<body>초기 마진이 없습니다.

의 실제를 들어 의 에서 하지만 은 를 하는 과 에 이 하기 이지는 에 를 이지는 에 하기 이 은 의 를 하지만 에 에서 position:fixed 이 특별한 경우를 예로 들어보겠습니다.가 있다고 가정합니다.

<body>
<div id="header">My fixedheader</div>
<!--- OTHER CONTENT -->
</body>

와 함께

#header{position:fixed; padding:0; margin:0; width:100%}

, 과 을 해야 해야 에 을 추가해야 .lockScroll()그리고.unlockScroll():

function lockScroll(){
    //Omissis   


    $('#header').css('margin-right', marginR);
} 

function unlockScroll(){
    //Omissis   

    $('#header').css('margin-right', 0);
}

마지막으로 여백이나 패딩에 대한 가능한 초기값을 고려합니다.

다음 코드를 사용할 수 있습니다.

$("body").css("overflow", "hidden");

스크롤을 끄려면 다음을 시도합니다.

var current = $(window).scrollTop();
$(window).scroll(function() {
    $(window).scrollTop(current);
});

재설정하려면:

$(window).off('scroll');

이 문제를 처리하기 위해 jQuery 플러그인을 작성했습니다. $.disablescroll.

마우스 휠, 터치 이동, 키 누르기 이벤트 등에서 스크롤을 방지합니다.

여기 데모가 있어요.

용도:

$(window).disablescroll();

// To re-enable scrolling:
$(window).disablescroll("undo");

이벤트 스크롤에 함수를 연결하고 기본 동작을 방지할 수 있습니다.

var $window = $(window);

$window.on("mousewheel DOMMouseScroll", onMouseWheel);

function onMouseWheel(e) {
    e.preventDefault();
}

https://jsfiddle.net/22cLw9em/

마우스 가운데 버튼을 포함하여 스크롤을 비활성화하는 라이너 하나.

$(document).scroll(function () { $(document).scrollTop(0); });

edit: banilla JS에서는 위와 같이 아래와 같이 jQuery가 필요하지 않습니다. (프레임워크가 없음, 자바스크립트만 있음을 의미합니다.

document.addEventListener('scroll', function () { this.documentElement.scrollTop = 0; this.body.scrollTop = 0; })

this.documentElement.scrollTop - 표준

this.body.scrollTop - IE 호환성

  • : :$("body").css("overflow", "hidden");
  • 하기: 을 하려면 하려면:$("body").css("overflow", "initial");

몸 높이를 100%로 설정하고 오버플로를 숨겨주시면 안 되나요?http://jsbin.com/ikuma4/13/edit 참조

누군가가 이 코드를 올렸는데 복원할 때 스크롤 위치를 유지하지 못하는 문제가 있습니다.그 이유는 html과 body에 적용하거나 body에만 적용하는 경향이 있지만 html에만 적용해야 하기 때문입니다.복원할 때 스크롤 위치는 다음과 같이 유지되는 방법:

$('html').css({
    'overflow': 'hidden',
    'height': '100%'
});

복원 방법:

$('html').css({
    'overflow': 'auto',
    'height': 'auto'
});

이것은 사용자의 목적에 맞게 작동할 수도 있고 작동하지 않을 수도 있지만 스크롤을 수행하기 전에 jScrollPane을 확장하여 다른 기능을 실행할 수 있습니다.이것을 조금만 테스트해봤지만, 당신이 뛰어들어서 스크롤을 완전히 막을 수 있다는 것을 확인할 수 있습니다.내가 한 일은

  • 데모 zip 다운로드: http://github.com/vitch/jScrollPane/archives/master
  • "Events" 데모(events.html)를 엽니다.
  • 소스를 합니다: 되지 를 하도록 합니다 합니다 하도록 를 .<script type="text/javascript" src="script/jquery.jscrollpane.js"></script>
  • jquery.jscrollpane.js 내에 666행(유망한 행 번호!)에 "return;"을 삽입합니다. 그러나 버전이 약간 다를 경우, 이것은 의 첫번째 행입니다.positionDragY(destY, animate)

events.html을 실행하면 코딩 작업으로 인해 스크롤되지 않는 일반 스크롤 상자가 나타납니다.

브라우저의 스크롤 바 전체를 이렇게 제어할 수 있습니다(fullpage_scroll.html 참조).

그래서 아마도 다음 단계는 다른 기능에 호출을 추가하는 것입니다. 호출이 꺼지고 닻을 내리는 마법을 수행한 다음 스크롤을 계속할지 여부를 결정하는 것입니다.top 및 left 스크롤을 설정할 수 있는 API 호출도 있습니다.

더 많은 도움을 원한다면, 어디로 이동하는지 게시하세요!

도움이 됐기를 바랍니다.

여기에 도움이 될 만한 답변을 올렸습니다: jQuery simplemodal 스크롤 비활성화

텍스트를 이동하지 않고 스크롤 바를 끄는 방법을 보여줍니다.단순한 모달에 대한 부분은 무시해도 됩니다.

키보드 탐색만으로 스크롤을 비활성화하려면 키다운 이벤트를 재정의할 수 있습니다.

$(document).on('keydown', function(e){
    e.preventDefault();
    e.stopPropagation();
});

다음 코드를 사용해 보십시오.

    $(function() { 
        // ...

        var $body = $(document);
        $body.bind('scroll', function() {
            if ($body.scrollLeft() !== 0) {
                $body.scrollLeft(0);
            }
        });

        // ...
    });

스크롤을 비활성화하기 위해 다음 코드를 사용하고 있으며 잘 작동합니다.

    $('html').css({
      'overflow': 'hidden',
      'height': '100%'
    });

안드로이드 태블릿에서 url address bar와 top window tag가 계속 보이고, 사용자가 위아래로 스크롤할 때 window도 40분 정도 상하로 스크롤하고 url bar와 tags를 보여줍니다.이를 방지하고 스크롤을 완전히 비활성화할 수 있는 방법이 있습니까?

페이지에 내용이 스크롤되는 것을 방지하기 위해 스크롤 가능한 디브로 창을 덮을 수 있습니다.숨김과 표시를 통해 스크롤을 잠그거나 풀 수 있습니다.

다음과 같은 작업을 수행합니다.

#scrollLock {
    width: 100%;
    height: 100%;
    position: fixed;
    overflow: scroll;
    opacity: 0;
    display:none
}

#scrollLock > div {
    height: 99999px;
}

function scrollLock(){
    $('#scrollLock').scrollTop('10000').show();
}

function scrollUnlock(){
    $('#scrollLock').hide();
}

중앙 배치를 사용하는 사용자의 경우( 경유)margin:0 auto;), 여기에 매시업이 있습니다.position:fixed솔루션과 @tfe의 제안 솔루션을 함께 제공합니다.

스크롤 막대가 표시/숨기기 때문에 페이지가 삭제되는 경우 이 솔루션을 사용합니다.

// lock scroll position, but retain settings for later
var scrollPosition = [
    window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
    window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop
];
var $html = $('html'); // bow to the demon known as MSIE(v7)
$html.addClass('modal-noscroll');
$html.data('scroll-position', scrollPosition);
$html.data('margin-top', $html.css('margin-top'));
$html.css('margin-top', -1 * scrollPosition[1]);

…에 대응합니다.

// un-lock scroll position
var $html = $('html').removeClass('modal-noscroll');
var scrollPosition = $html.data('scroll-position');
var marginTop = $html.data('margin-top');
$html.css('margin-top', marginTop);
window.scrollTo(scrollPosition[0], scrollPosition[1])

…그리고 마지막으로 CSS는.modal-noscroll

.modal-noscroll
{
    position: fixed;
    overflow-y: scroll;
    width: 100%;
}

이것이 다른 어떤 솔루션보다 더 적절한 해결책이라고 감히 말하고 싶지만, 아직 완벽하게 테스트해 본 적은 없습니다. :P


편집: 터치 장치에서 이것이 얼마나 나쁜 성능(읽기: 폭파)을 발휘할 수 있는지 알 수 없습니다.

DOM을 사용하여 이를 수행할 수도 있습니다.다음과 같이 호출하는 기능이 있다고 가정해 보겠습니다.

function disable_scroll() {
document.body.style.overflow="hidden";
}

그리고 그것이 전부입니다!이것이 다른 모든 답변에 더 도움이 되기를 바랍니다!

이게 제가 한 일입니다.

커피스크립트:

    $("input").focus ->
        $("html, body").css "overflow-y","hidden"
        $(document).on "scroll.stopped touchmove.stopped mousewheel.stopped", (event) ->
            event.preventDefault()

    $("input").blur ->
        $("html, body").css "overflow-y","auto"
        $(document).off "scroll.stopped touchmove.stopped mousewheel.stopped"

자바스크립트:

$("input").focus(function() {
 $("html, body").css("overflow-y", "hidden");
 $(document).on("scroll.stopped touchmove.stopped mousewheel.stopped", function(event) {
   return event.preventDefault();
 });
});

$("input").blur(function() {
 $("html, body").css("overflow-y", "auto");
 $(document).off("scroll.stopped touchmove.stopped mousewheel.stopped");
});

누가 내 해결책을 시도해 보았는지 확실하지 않습니다.이는 전신/html에서 작동하지만 스크롤 이벤트가 발생하는 모든 요소에 적용할 수 있습니다.

필요에 따라 스크롤 잠금을 설정했다가 해제하기만 하면 됩니다.

var scrollLock = false;
var scrollMem = {left: 0, top: 0};

$(window).scroll(function(){
    if (scrollLock) {
        window.scrollTo(scrollMem.left, scrollMem.top);
    } else {
        scrollMem = {
            left: self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
            top: self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
        };
    }
});

JSFiddle의 예는 다음과 같습니다.

누군가에게 도움이 되길 바랍니다.

가장 좋고 깨끗한 해결책은 다음과 같습니다.

window.addEventListener('scroll',() => {
    var x = window.scrollX;
    var y = window.scrollY;
    window.scrollTo(x,y);
});

그리고 jQuery와 함께:

$(window).on('scroll',() => {
    var x = window.scrollX;
    var y = window.scrollY;
    window.scrollTo(x,y)
})

이벤트 수신자는 스크롤을 차단해야 합니다.스크롤을 다시 활성화하려면 제거하기만 하면 됩니다.

스크롤을 프로그래밍 방식으로 비활성화하려면 다음을 사용할 수 있습니다.

overflow: clip;

사용자의 스크롤을 비활성화하려면 다음을 사용할 수 있습니다.

overflow: hidden;

https://developer.mozilla.org/en-US/docs/Web/CSS/overflow

오버플로 속성에 대한 브라우저 지원은 다양합니다.

https://caniuse.com/ ?search=http://overflow

언급URL : https://stackoverflow.com/questions/3656592/how-to-programmatically-disable-page-scrolling-with-jquery

반응형