웹 페이지의 "오버 스크롤"방지


104

Mac 용 Chrome에서는 아래 스크린 샷에 표시된 것처럼 페이지를 "오버 스크롤"하여 (더 나은 단어가없는 경우) iPad 또는 iPhone과 유사한 "뒤에있는 항목"을 볼 수 있습니다.

Gmail 및 "새 탭"페이지와 같은 일부 페이지에서 비활성화 된 것으로 나타났습니다.

"오버 스크롤"을 비활성화하려면 어떻게합니까? "오버 스크롤"을 제어 할 수있는 다른 방법이 있습니까?

여기에 이미지 설명 입력


1
예를 들어 실제로 newtab 페이지에서 활성화 하려고합니다 . 여기에 관련된 문제를 이해하려고합니다.
Randomblue

그렇게하는 방법이 없다고 생각합니다. 스크롤러가 시작될 수 있도록 페이지를 충분히 길게 만드는 것은 간단합니다. 또한 게시물 제목을 반대로 변경하는 대신 원하는 내용으로 변경하는 것이 좋습니다.
Jon Egeland 2012 년

답변:


164

허용 된 솔루션이 저에게 효과가 없었습니다. 스크롤 할 수있는 동안 작동하는 유일한 방법은 다음과 같습니다.

html {
    overflow: hidden;
    height: 100%;
}

body {
    height: 100%;
    overflow: auto;
}

2
이 솔루션은 html스타일링 해킹을 존중하지 않는 장치 와 설정된 body높이를 무시하는 전체 오버플로를 확인하는 모바일 웹 브라우저 모두에서 문제 html가됩니다.
runspired

5
이 솔루션은 Mac 용 Chrome 46에서 작동하지 않습니다. 오버 스크롤을 방지하지만 스크롤 할 수있는 자식 요소는 없습니다.
Daniel Bonnell

1
그런 다음 일반적으로 사용하는 scrollTop 값을 어떻게 얻을 수 $(window).scrollTop있습니까?
Guig

1
Mac 용 Chrome 49 또는 Mac 용 Firefox 44에서는 어느 솔루션도 작동하지 않습니다. window.scrollY항상 0입니다.
momo

3
Chrome에서는 작동하지만 Safari에서는 작동하지 않습니다.
Bretton Wade

60

Chrome 63+, Firefox 59+ 및 Opera 50+에서는 CSS로 다음을 수행 할 수 있습니다.

body {
  overscroll-behavior-y: none;
}

이렇게하면 질문의 스크린 샷에 표시된 iOS에서 러버 밴딩 효과가 비활성화됩니다. 그러나 당겨서 새로 고침, 글로우 효과 및 스크롤 체인도 비활성화됩니다.

그러나 오버 스크롤시 고유 한 효과 또는 기능을 구현하도록 선택할 수 있습니다. 예를 들어 페이지를 흐리게하고 깔끔한 애니메이션을 추가하려는 경우 :

<style>
  body.refreshing #inbox {
    filter: blur(1px);
    touch-action: none; /* prevent scrolling */
  }
  body.refreshing .refresher {
    transform: translate3d(0,150%,0) scale(1);
    z-index: 1;
  }
  .refresher {
    --refresh-width: 55px;
    pointer-events: none;
    width: var(--refresh-width);
    height: var(--refresh-width);
    border-radius: 50%; 
    position: absolute;
    transition: all 300ms cubic-bezier(0,0,0.2,1);
    will-change: transform, opacity;
    ...
  }
</style>

<div class="refresher">
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
  <div class="loading-bar"></div>
</div>

<section id="inbox"><!-- msgs --></section>

<script>
  let _startY;
  const inbox = document.querySelector('#inbox');

  inbox.addEventListener('touchstart', e => {
    _startY = e.touches[0].pageY;
  }, {passive: true});

  inbox.addEventListener('touchmove', e => {
    const y = e.touches[0].pageY;
    // Activate custom pull-to-refresh effects when at the top of the container
    // and user is scrolling up.
    if (document.scrollingElement.scrollTop === 0 && y > _startY &&
        !document.body.classList.contains('refreshing')) {
      // refresh inbox.
    }
  }, {passive: true});
</script>

브라우저 지원

이 글을 쓰는 시점에서 Chrome 63+, Firefox 59+ 및 Opera 50+가 지원합니다. Edge는 공개적으로 지원했지만 Safari는 알려지지 않았습니다. 여기에서 진행 상황을 추적 하고 MDN 문서 에서 현재 브라우저 호환성을 확인 하세요.

추가 정보


3
제 생각에는 이것이 최선의 해결책입니다. 그리고 간단합니다. 모든 찬성 투표가있는 사람은 문제가 될 수 있습니다.
TheTC

1
이것은 나를 위해 잘 작동했습니다.
Rajilesh Panoli

38

이를 방지 할 수있는 한 가지 방법은 다음 CSS를 사용하는 것입니다.

html, body {
    width: 100%;
    height: 100%;
    overflow: hidden;
}

body > div {
    height: 100%;
    overflow: scroll;
    -webkit-overflow-scrolling: touch;
}

이렇게하면 본문이 오버플로되지 않으며 페이지의 상단과 하단에서 스크롤 할 때 "바운스"되지 않습니다. 컨테이너는 내용을 완벽하게 스크롤합니다. 이것은 Safari와 Chrome에서 작동합니다.

편집하다

<div>래퍼로 추가 요소가 유용 할 수있는 이유 :
Florian Feldhaus의 솔루션 은 코드를 약간 적게 사용하고 잘 작동합니다. 그러나 뷰포트 너비를 초과하는 콘텐츠의 경우 약간의 기이함이있을 수 있습니다. 이 경우 창 하단의 스크롤바가 뷰포트에서 절반 정도 떨어져서 인식 / 접근하기 어렵습니다. body { margin: 0; }적절한 경우 사용을 피할 수 있습니다 . 이 CSS를 추가 할 수없는 상황에서는 스크롤바가 항상 완전히 표시되므로 래퍼 요소가 유용합니다.

아래에서 스크린 샷을 찾으십시오. 여기에 이미지 설명 입력


3
이것이 한 번 작동하면 더 이상 작동하지 않습니다. 내 Chrome v37에서는 요소가 스크롤 될 때마다 오버 스콜 동작이 발생합니다.
bbsimonbb 2014 년

@ user1585345 OS X의 Chrome 38에서 지금 다시 테스트했으며 여전히 작동합니다 (Safari에서도). 여기 내가 사용중인 파일이 있습니다. 이 파일로 테스트 할 수 있습니까? sendspace.com의 파일에 대한 직접 링크 .
insertusernamehere

1
위의 파일로 테스트했지만 여전히 바운스가 있습니다. 나는 우리가이 수수께끼의 밑바닥에 도달하지 않을 것이라고 생각합니다. Chrome 37
bbsimonbb 2014

추가 래퍼 div가 필요하지 않습니다. 더 나은 솔루션을 보려면 아래 답변을 확인하십시오.
JayD3e 2015 년

1
이 솔루션은 Mac 용 Chrome 46에서 작동하지 않습니다. 오버 스크롤을 방지하지만 스크롤 할 수있는 자식 요소는 없습니다.
Daniel Bonnell

2

이 코드를 사용하여 touchmove미리 정의 된 작업 을 제거 할 수 있습니다 .

document.body.addEventListener('touchmove', function(event) {
  console.log(event.source);
  //if (event.source == document.body)
    event.preventDefault();
}, false);

2
html,body {
    width: 100%;
    height: 100%;
}
body {
    position: fixed;
    overflow: hidden;
}

4
이것이 질문에 답할 수는 있지만 대답의 필수 부분과 OP 코드의 문제점을 설명하는 것이 좋습니다.
pirho

귀하의 답변은 길이와 내용으로 인해 신고되었습니다. 수정하는 것이 좋습니다. 추가 세부 정보를 추가 할 수 있습니다.
www139 dec.

1
position: fixed구세주입니다!
Nizamil Putra


0

position: absolute나를 위해 작동합니다. 나는 Chrome 50.0.2661.75 (64-bit)OSX에서 테스트했습니다 .

body {
  overflow: hidden;
}

// position is important
#element {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow: auto;
}

0

바운스 효과는 웹 페이지 높이가와 같을 때를 제외하고는 비활성화 할 수 없으며 window.innerHeight하위 요소를 스크롤 할 수 있습니다.

html {
    overflow: hidden;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.