Cegah "overscrolling" halaman web

105

Di Chrome untuk Mac, seseorang dapat "menggulung" halaman (karena tidak ada kata yang lebih baik), seperti yang ditunjukkan pada gambar di bawah, untuk melihat "apa yang ada di belakang", mirip dengan iPad atau iPhone.

Saya perhatikan bahwa beberapa halaman menonaktifkannya, seperti gmail dan halaman "tab baru".

Bagaimana cara menonaktifkan "overscrolling"? Apakah ada cara lain untuk mengontrol "overscrolling"?

masukkan deskripsi gambar di sini

Randomblue
sumber
1
Saya sebenarnya mencoba mengaktifkannya di halaman tab baru, misalnya. Mencoba memahami masalah yang terlibat di sini.
Randomblue
Saya tidak berpikir ada cara untuk melakukan itu. Ini masalah sederhana memiliki halaman yang cukup panjang untuk memungkinkan penggulung memulai. Juga, pertimbangkan untuk mengubah judul posting Anda menjadi apa yang ingin Anda capai, bukan sebaliknya.
Jon Egeland

Jawaban:

164

Solusi yang diterima tidak berhasil untuk saya. Satu-satunya cara saya membuatnya berfungsi sambil tetap dapat menggulir adalah:

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

body {
    height: 100%;
    overflow: auto;
}
Florian Feldhaus
sumber
2
Solusi ini bermasalah untuk kedua perangkat yang tidak menghormati htmlperetasan gaya dan untuk browser web seluler yang melihat luapan penuh bodymengabaikan ketinggian yang htmlditetapkan.
runspired
5
Solusi ini tidak berfungsi pada Chrome 46 untuk Mac. Ini mencegah pengguliran berlebihan tetapi tidak ada elemen turunan yang dapat digulir.
Daniel Bonnell
1
Lalu, bagaimana Anda bisa mendapatkan nilai scrollTop yang biasanya Anda dapatkan $(window).scrollTop?
Guig
1
Tidak ada solusi yang berfungsi untuk saya di Chrome 49 untuk mac atau Firefox 44 untuk mac. window.scrollYselalu 0.
momo
3
Berfungsi untuk Chrome, tetapi tidak Safari.
Bretton Wade
61

Di Chrome 63+, Firefox 59+, dan Opera 50+ Anda dapat melakukan ini di CSS:

body {
  overscroll-behavior-y: none;
}

Ini menonaktifkan efek karet gelang di iOS yang ditunjukkan di tangkapan layar pertanyaan. Namun itu juga menonaktifkan tarik-untuk-menyegarkan, efek cahaya dan rantai gulir.

Namun Anda dapat memilih untuk menerapkan efek atau fungsionalitas Anda sendiri setelah menggulir berlebihan. Jika Anda misalnya ingin mengaburkan halaman dan menambahkan animasi yang rapi:

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

Dukungan Browser

Pada tulisan ini Chrome 63+, Firefox 59+ dan Opera 50+ mendukungnya. Edge secara publik mendukungnya sementara Safari tidak dikenal. Lacak kemajuan di sini dan kompatibilitas browser saat ini di dokumentasi MDN

Informasi lebih lanjut

Koslun
sumber
3
Ini adalah solusi terbaik menurut saya. Dan sederhana. Yang memiliki semua suara positif bisa jadi bermasalah.
TheTC
1
Yang ini bekerja dengan baik untuk saya.
Rajilesh Panoli
38

Salah satu cara untuk mencegahnya adalah dengan menggunakan CSS berikut:

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

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

Dengan cara ini badan tidak akan pernah meluap dan tidak akan "terpental" saat di-scroll di bagian atas dan bawah halaman. Kontainer akan menggulung kontennya dengan sempurna. Ini berfungsi di Safari dan di Chrome.

Edit

Mengapa elemen ekstra <div>sebagai pembungkus dapat berguna:
Solusi Florian Feldhaus menggunakan kode yang sedikit lebih sedikit dan berfungsi dengan baik juga. Namun, ini bisa memiliki sedikit kekhasan, jika menyangkut konten yang melebihi lebar viewport. Dalam hal ini scrollbar di bagian bawah jendela dipindahkan setengah dari viewport dan sulit untuk dikenali / dijangkau. Ini dapat dihindari penggunaan body { margin: 0; }jika cocok. Dalam situasi di mana Anda tidak dapat menambahkan CSS ini, elemen pembungkus berguna karena bilah gulir selalu terlihat sepenuhnya.

Temukan tangkapan layar di bawah ini: masukkan deskripsi gambar di sini

masukkan nama penggunadi sini
sumber
3
Jika ini berhasil sekali, itu tidak lagi berfungsi. Di Chrome v37 saya, perilaku overscoll akan terjadi di mana pun elemen menggulir.
bbsimonbb
@ user1585345 Saya telah menguji ini sekarang di Chrome 38 lagi di OS X dan masih berfungsi (juga di Safari). Ini file yang saya gunakan. Bisakah Anda mengujinya dengan file ini? Tautan langsung ke file di sendspace.com .
masukkan nama penggunadi sini
1
Saya telah menguji dengan file di atas, dan saya masih memiliki bounce. Saya menduga kita tidak akan sampai ke dasar misteri ini. Chrome 37
bbsimonbb
Anda tidak perlu div pembungkus ekstra. Periksa jawaban di bawah ini untuk solusi yang lebih baik.
JayD3e
1
Solusi ini tidak berfungsi pada Chrome 46 untuk Mac. Ini mencegah pengguliran berlebih tetapi tidak ada elemen turunan yang dapat digulir.
Daniel Bonnell
2

Anda dapat menggunakan kode ini untuk menghapus touchmovetindakan yang telah ditentukan sebelumnya:

document.body.addEventListener('touchmove', function(event) {
  console.log(event.source);
  //if (event.source == document.body)
    event.preventDefault();
}, false);
Daniel Prol
sumber
2
html,body {
    width: 100%;
    height: 100%;
}
body {
    position: fixed;
    overflow: hidden;
}
Cormorano71
sumber
4
Meskipun ini mungkin menjawab pertanyaan, lebih baik menjelaskan bagian penting dari jawaban dan mungkin apa masalah dengan kode OPs.
pirho
Jawaban Anda ditandai karena panjang dan isinya. Saya sarankan untuk merevisi. Mungkin menambahkan detail tambahan.
www139
1
position: fixedadalah penyelamat!
Nizamil Putra
1

Coba cara ini

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

position: absolutebekerja untuk saya. Saya telah menguji Chrome 50.0.2661.75 (64-bit)dan OSX.

body {
  overflow: hidden;
}

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

Efek pantulan tidak dapat dinonaktifkan kecuali tinggi halaman web sama dengan window.innerHeight, Anda dapat membiarkan sub-elemen Anda menggulir.

html {
    overflow: hidden;
}
Yibo
sumber