teori
Pinterest sitesinin mevcut uygulamasına bakıldığında (gelecekte değişebilir), bindirmeyi açtığınızda öğeye bir noscroll
sınıf uygulanır body
ve overflow: hidden
ayarlanır, bu nedenle body
artık kaydırılamaz.
Bindirme (-fly-on ya da zaten sayfanın içinde ve aracılığıyla görünür hale oluşturulan display: block
, hiç fark etmez) sahiptir position : fixed
ve overflow-y: scroll
, ile top
, left
, right
ve bottom
özellikleri ayarlı 0
: Bu tarz tüm görünüm doldurmak overlay yapar.
Bunun div
yerine bindirmenin iç kısmı, position: static
gördüğünüz dikey kaydırma çubuğunun o öğeyle ilişkilidir. Sonuç olarak içerik kaydırılabilir ancak yer paylaşımı sabit kalır.
Yakınlaştırmayı kapattığınızda kaplamayı gizlersiniz (üzerinden display: none
) ve ardından javascript (veya yalnızca içindeki içerik, tamamen nasıl enjekte edeceğinize bağlı olarak) tamamen kaldırabilirsiniz.
Son adım olarak, noscroll
sınıfı body
(gruba) kaldırmanız gerekir (böylece taşma özelliği başlangıç değerine döner)
kod
Codepen Örneği
( aria-hidden
yer paylaşımını göstermek ve gizlemek ve erişilebilirliğini artırmak amacıyla bindirmenin niteliğini değiştirerek çalışır ).
İşaretleme
(açma düğmesi)
<button type="button" class="open-overlay">OPEN LAYER</button>
(kaplama ve kapatma düğmesi)
<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 (vanilya-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);
});
Son olarak, yerleşimin transition
, opacity
mülke uygulanan bir CSS tarafından solma etkisi ile açıldığı başka bir örnek . Ayrıca padding-right
, kaydırma çubuğu kaybolduğunda alttaki metnin yeniden akmasını önlemek için a uygulanır.
Kodpen Örneği (solmaya)
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;
}