Teori
Melihat implementasi situs pinterest saat ini (mungkin akan berubah di masa mendatang), saat Anda membuka overlay, sebuah noscrollkelas diterapkan ke bodyelemen dan overflow: hiddendiatur, sehingga bodytidak lagi dapat digulir.
Overlay (dibuat on-the-fly atau sudah di dalam halaman dan dibuat terlihat melalui display: block, tidak ada bedanya) memiliki position : fixeddan overflow-y: scroll, dengan top, left, rightdan bottomsifat set ke 0: gaya ini membuat overlay mengisi seluruh viewport.
Bagian divdalam overlay malah tepat di position: statickemudian scrollbar vertikal yang Anda lihat terkait dengan elemen itu. Hasilnya, konten dapat digulir tetapi hamparan tetap diperbaiki.
Ketika Anda menutup zoom, Anda menyembunyikan overlay (via display: none) dan kemudian Anda juga bisa menghapusnya sepenuhnya melalui javascript (atau hanya konten di dalamnya, terserah Anda bagaimana menyuntikkannya).
Sebagai langkah terakhir Anda juga harus menghapus noscrollkelas ke body(jadi properti overflow kembali ke nilai awal)
Kode
Contoh Codepen
(berfungsi dengan mengubah aria-hiddenatribut overlay untuk menampilkan dan menyembunyikannya dan meningkatkan aksesibilitasnya).
Markup
(tombol terbuka)
<button type="button" class="open-overlay">OPEN LAYER</button>
(tombol overlay dan tutup)
<section class="overlay" aria-hidden="true">
<div>
<h2>Hello, I'm the overlayer</h2>
...
<button type="button" class="close-overlay">CLOSE LAYER</button>
</div>
</section>
CSS
.noscroll {
overflow: hidden;
}
.overlay {
position: fixed;
overflow-y: scroll;
top: 0; right: 0; bottom: 0; left: 0; }
[aria-hidden="true"] { display: none; }
[aria-hidden="false"] { display: block; }
Javascript (vanilla-JS)
var body = document.body,
overlay = document.querySelector('.overlay'),
overlayBtts = document.querySelectorAll('button[class$="overlay"]');
[].forEach.call(overlayBtts, function(btt) {
btt.addEventListener('click', function() {
/* Detect the button class name */
var overlayOpen = this.className === 'open-overlay';
/* Toggle the aria-hidden state on the overlay and the
no-scroll class on the body */
overlay.setAttribute('aria-hidden', !overlayOpen);
body.classList.toggle('noscroll', overlayOpen);
/* On some mobile browser when the overlay was previously
opened and scrolled, if you open it again it doesn't
reset its scrollTop property */
overlay.scrollTop = 0;
}, false);
});
Akhirnya, inilah contoh lain di mana overlay terbuka dengan efek fade-in oleh CSS yang transitionditerapkan ke opacityproperti. Juga padding-rightditerapkan untuk menghindari reflow pada teks yang mendasarinya ketika scrollbar menghilang.
Contoh Codepen (fade)
CSS
.noscroll { overflow: hidden; }
@media (min-device-width: 1025px) {
/* not strictly necessary, just an experiment for
this specific example and couldn't be necessary
at all on some browser */
.noscroll {
padding-right: 15px;
}
}
.overlay {
position: fixed;
overflow-y: scroll;
top: 0; left: 0; right: 0; bottom: 0;
}
[aria-hidden="true"] {
transition: opacity 1s, z-index 0s 1s;
width: 100vw;
z-index: -1;
opacity: 0;
}
[aria-hidden="false"] {
transition: opacity 1s;
width: 100%;
z-index: 1;
opacity: 1;
}