Ngăn chặn "quá tải" của trang web


104

Trong Chrome dành cho Mac, người ta có thể "cuộn qua" một trang (thiếu từ hay hơn), như được hiển thị trong ảnh chụp màn hình bên dưới, để xem "những gì đằng sau", tương tự như iPad hoặc iPhone.

Tôi nhận thấy rằng một số trang đã tắt tính năng này, như gmail và trang "tab mới".

Làm cách nào tôi có thể tắt "thanh toán quá mức"? Có những cách nào khác để tôi có thể kiểm soát việc "cuộn quá mức" không?

nhập mô tả hình ảnh ở đây


1
Tôi thực sự đang cố gắng kích hoạt nó trên trang newtab chẳng hạn. Cố gắng hiểu các vấn đề liên quan ở đây.
Randomblue

Tôi không nghĩ rằng có một cách để làm điều đó. Vấn đề đơn giản là phải có trang đủ dài để cho phép con lăn bắt đầu. Ngoài ra, hãy cân nhắc thay đổi tiêu đề bài đăng của bạn thành những gì bạn muốn đạt được thay vì ngược lại.
Jon Egeland

Câu trả lời:


164

Giải pháp được chấp nhận không hoạt động đối với tôi. Cách duy nhất tôi làm cho nó hoạt động trong khi vẫn có thể cuộn là:

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

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

2
Giải pháp này có vấn đề đối với cả các thiết bị không tôn trọng htmlhack kiểu dáng và đối với các trình duyệt web trên thiết bị di động, những trình duyệt này nhìn vào toàn bộ việc bodybỏ qua chiều cao htmlđã được đặt.
hết hạn vào

5
Giải pháp này không hoạt động với Chrome 46 dành cho Mac. Nó ngăn chặn việc cuộn quá mức nhưng không phần tử con nào có thể cuộn được.
Daniel Bonnell

1
Sau đó, làm thế nào bạn có thể nhận được giá trị scrollTop mà bạn thường nhận được $(window).scrollTop?
Guig

1
Không giải pháp nào phù hợp với tôi trên Chrome 49 dành cho mac hoặc Firefox 44 dành cho mac. window.scrollYluôn luôn 0.
momo

3
Hoạt động cho Chrome, nhưng không hoạt động cho Safari.
Bretton Wade

60

Trong Chrome 63+, Firefox 59+ và Opera 50+, bạn có thể thực hiện việc này trong CSS:

body {
  overscroll-behavior-y: none;
}

Điều này vô hiệu hóa hiệu ứng đai cao su trên iOS được hiển thị trong ảnh chụp màn hình của câu hỏi. Tuy nhiên, nó cũng vô hiệu hóa các hiệu ứng kéo để làm mới, phát sáng và chuỗi cuộn.

Tuy nhiên, bạn có thể chọn triển khai hiệu ứng hoặc chức năng của riêng mình khi cuộn quá mức. Ví dụ: nếu bạn muốn làm mờ trang và thêm hoạt ảnh gọn gàng:

<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>

Hỗ trợ trình duyệt

Kể từ khi viết bản này, Chrome 63+, Firefox 59+ và Opera 50+ hỗ trợ nó. Edge công khai hỗ trợ nó trong khi Safari là một ẩn số. Theo dõi tiến trình tại đây và khả năng tương thích của trình duyệt hiện tại tại tài liệu MDN

Thêm thông tin


3
Đây là giải pháp tốt nhất, theo ý kiến ​​của tôi. Và đơn giản. Người có tất cả số phiếu ủng hộ có thể có vấn đề.
TheTC

1
Điều này làm việc tốt cho tôi.
Rajilesh Panoli

38

Một cách bạn có thể ngăn chặn điều này là sử dụng CSS sau:

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

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

Bằng cách này, phần nội dung không bao giờ bị tràn và không bị "trả lại" khi cuộn ở đầu và cuối trang. Vùng chứa sẽ cuộn nội dung của nó một cách hoàn hảo. Điều này hoạt động trong Safari và trong Chrome.

Biên tập

Tại sao phần bổ sung <div>như một trình bao bọc có thể hữu ích:
Giải pháp của Florian Feldhaus sử dụng ít mã hơn một chút và hoạt động tốt. Tuy nhiên, nó có thể có một chút khó hiểu, khi nói đến nội dung vượt quá chiều rộng khung nhìn. Trong trường hợp này, thanh cuộn ở cuối cửa sổ bị di chuyển ra khỏi khung nhìn một nửa và khó nhận ra / tiếp cận. Điều này có thể được tránh sử dụng body { margin: 0; }nếu phù hợp. Trong trường hợp bạn không thể thêm CSS này, phần tử trình bao bọc rất hữu ích vì thanh cuộn luôn hiển thị đầy đủ.

Tìm ảnh chụp màn hình bên dưới: nhập mô tả hình ảnh ở đây


3
Nếu điều này hoạt động một lần, nó không còn hoạt động nữa. Trong Chrome v37 của tôi, hành vi cuộn quá mức sẽ xảy ra ở bất cứ nơi nào một phần tử cuộn.
bbsimonbb

@ user1585345 Tôi đã kiểm tra lại tính năng này trong Chrome 38 trên OS X và nó vẫn hoạt động (cũng trong Safari). Đây là tệp tôi đang sử dụng. Bạn có thể kiểm tra nó với tệp này không? Liên kết trực tiếp đến tệp trên sendspace.com .
insertusernamehere

1
Tôi đã thử nghiệm với tệp ở trên và tôi vẫn bị trả lại. Tôi nghi ngờ chúng ta sẽ không đi đến tận cùng của bí ẩn này. Chrome 37
bbsimonbb

Bạn không cần thêm div wrapper. Kiểm tra câu trả lời dưới đây để có giải pháp tốt hơn.
JayD3e

1
Giải pháp này không hoạt động với Chrome 46 dành cho Mac. Nó ngăn chặn việc cuộn quá mức nhưng không phần tử con nào có thể cuộn được.
Daniel Bonnell,

2

Bạn có thể sử dụng mã này để xóa touchmovehành động được xác định trước:

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
Mặc dù điều này có thể trả lời câu hỏi, nhưng tốt hơn là giải thích các phần thiết yếu của câu trả lời và có thể là vấn đề với mã OPs là gì.
pirho

Câu trả lời của bạn đã bị gắn cờ vì độ dài và nội dung của nó. Tôi đề nghị sửa đổi. Có lẽ thêm chi tiết bổ sung.
www139

1
position: fixedlà vị cứu tinh!
Nizamil Putra

1

Hãy thử cách này

body {
    height: 100vh;
    background-size: cover;
    overflow: hidden;
}

0

position: absolutelàm việc cho tôi. Tôi đã thử nghiệm trên 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

Không thể tắt hiệu ứng thoát ngoại trừ chiều cao của trang web bằng window.innerHeight, bạn có thể cho phép các thành phần phụ của mình cuộn.

html {
    overflow: hidden;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.