Théorie
En regardant l'implémentation actuelle du site pinterest (cela pourrait changer à l'avenir), lorsque vous ouvrez la superposition, une noscrollclasse est appliquée à l' bodyélément et overflow: hiddenest définie, elle bodyn'est donc plus défilable.
La superposition (créé sur la volée ou déjà à l' intérieur de la page et rendu visible par l' intermédiaire display: block, il ne fait aucune différence) a position : fixedet overflow-y: scroll, avec top, left, rightet bottomdéfinir les propriétés à 0: ce style fait de la superposition remplir toute la fenêtre.
L' divintérieur de la superposition est à la place juste à l'intérieur, position: staticpuis la barre de défilement verticale que vous voyez est liée à cet élément. En conséquence, le contenu peut défiler mais la superposition reste fixe.
Lorsque vous fermez le zoom, vous masquez la superposition (via display: none) et vous pouvez également la supprimer entièrement via javascript (ou simplement le contenu à l'intérieur, c'est à vous de l'injecter).
Comme dernière étape, vous devez également supprimer la noscrollclasse dans le body(afin que la propriété overflow revienne à sa valeur initiale)
Code
  Exemple de Codepen  
(cela fonctionne en changeant l' aria-hiddenattribut de la superposition afin de l'afficher et de la cacher et d'augmenter son accessibilité).
Marquage 
(bouton ouvert)
<button type="button" class="open-overlay">OPEN LAYER</button>
(bouton de superposition et de fermeture)
<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  (vanille-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);
});
Enfin, voici un autre exemple dans lequel la superposition s'ouvre avec un effet de fondu par un CSS transitionappliqué à la opacitypropriété. Un padding-rightest également appliqué pour éviter une redistribution sur le texte sous-jacent lorsque la barre de défilement disparaît.
  Exemple de Codepen (fondu)  
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; 
}