Teori
Melihat implementasi situs pinterest saat ini (mungkin akan berubah di masa mendatang), saat Anda membuka overlay, sebuah noscroll
kelas diterapkan ke body
elemen dan overflow: hidden
diatur, sehingga body
tidak lagi dapat digulir.
Overlay (dibuat on-the-fly atau sudah di dalam halaman dan dibuat terlihat melalui display: block
, tidak ada bedanya) memiliki position : fixed
dan overflow-y: scroll
, dengan top
, left
, right
dan bottom
sifat set ke 0
: gaya ini membuat overlay mengisi seluruh viewport.
Bagian div
dalam overlay malah tepat di position: static
kemudian 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 noscroll
kelas ke body
(jadi properti overflow kembali ke nilai awal)
Kode
Contoh Codepen
(berfungsi dengan mengubah aria-hidden
atribut 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 transition
diterapkan ke opacity
properti. Juga padding-right
diterapkan 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;
}