Teoría
Al observar la implementación actual del sitio pinterest (puede cambiar en el futuro), cuando abre la superposición noscroll
, se aplica una clase al body
elemento y overflow: hidden
se establece, por body
lo que ya no se puede desplazar.
La superposición (creado en la marcha o ya dentro de la página y se hace visible a través display: block
, no hay diferencia) tiene position : fixed
y overflow-y: scroll
, con top
, left
, right
y bottom
propiedades definidas 0
: este estilo hace que la superposición de llenar toda la ventana gráfica.
El div
interior de la superposición está en su lugar justo position: static
entonces, la barra de desplazamiento vertical que ves está relacionada con ese elemento. Como resultado, el contenido es desplazable pero la superposición permanece fija.
Cuando cierra el zoom, oculta la superposición (a través de display: none
) y luego también puede eliminarla por completo a través de javascript (o solo el contenido dentro, depende de usted cómo inyectarlo).
Como paso final, también debe eliminar la noscroll
clase body
(para que la propiedad de desbordamiento vuelva a su valor inicial)
Código
Ejemplo de Codepen
(funciona cambiando el aria-hidden
atributo de la superposición para mostrarlo y ocultarlo y aumentar su accesibilidad).
Marcado
(botón de apertura)
<button type="button" class="open-overlay">OPEN LAYER</button>
(botón de superposición y cierre)
<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);
});
Finalmente, aquí hay otro ejemplo en el que la superposición se abre con un efecto de desvanecimiento por un CSS transition
aplicado a la opacity
propiedad. También padding-right
se aplica a para evitar un reflujo en el texto subyacente cuando la barra de desplazamiento desaparece.
Ejemplo de codepen (desvanecimiento)
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;
}