J'ai créé un popup jQuery en suivant un tutoriel en ligne ( http://uposonghar.com/popup.html ).
En raison de ma faible connaissance de jQuery, je ne suis pas en mesure de le faire fonctionner selon mes besoins.
Mon problème:
CSS:
body {
background: #999;
}
#ac-wrapper {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255,255,255,.6);
z-index: 1001;
}
#popup{
width: 555px;
height: 375px;
background: #FFFFFF;
border: 5px solid #000;
border-radius: 25px;
-moz-border-radius: 25px;
-webkit-border-radius: 25px;
box-shadow: #64686e 0px 0px 3px 3px;
-moz-box-shadow: #64686e 0px 0px 3px 3px;
-webkit-box-shadow: #64686e 0px 0px 3px 3px;
position: relative;
top: 150px; left: 375px;
}
JavaScript:
<script type="text/javascript">
function PopUp(){
document.getElementById('ac-wrapper').style.display="none";
}
</script>
HTML:
<div id="ac-wrapper">
<div id="popup">
<center>
<p>Popup Content Here</p>
<input type="submit" name="submit" value="Submit" onClick="PopUp()" />
</center>
</div>
</div>
<p>Page Content Here</p>
Une réponse simple, que vous pourriez utiliser et ne nécessiterait pas d'arrêter l'événement de défilement, serait de régler la position de votre #ac-wrapper
.
par exemple.
#ac-wrapper {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255,255,255,.6);
z-index: 1001;
}
le conteneur de la fenêtre contextuelle sera toujours visible (aligné en haut à gauche) tout en permettant le défilement.
Mais faire défiler la page avec un popup ouvert est mauvais !!! (presque toujours quand même)
La raison pour laquelle vous ne souhaitez pas autoriser le défilement, c’est que, si votre popup n’est pas plein écran ou est semi-transparent, les utilisateurs verront le contenu défiler derrière le popup. En plus de cela, quand ils fermeront le popup, ils seront maintenant dans une position différente sur la page.
Une solution consiste, lorsque vous liez un événement click
en javascript à afficher cette fenêtre contextuelle, à ajouter également une classe au corps avec essentiellement ces règles:
.my-body-noscroll-class {
overflow: hidden;
}
Ensuite, lorsque vous fermez la fenêtre contextuelle en déclenchant une action ou en la supprimant d'un clic, vous supprimez simplement la classe à nouveau, ce qui vous permet de faire défiler après la fermeture de la fenêtre contextuelle.
Si l'utilisateur fait défiler alors que la popup est ouverte, le document ne défilera pas. Lorsque l'utilisateur ferme la fenêtre contextuelle, le défilement redevient disponible et l'utilisateur peut continuer là où il s'est arrêté :)
Pour désactiver la barre de défilement:
$('body').css('overflow', 'hidden');
Cela cachera la barre de défilement
Fond-fondu-chose:
J'ai créé mon propre widget popup-dialog-dialog qui a aussi un arrière-plan. J'ai utilisé le CSS suivant:
div.modal{
position: fixed;
margin: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 9998;
background-color: #000;
display: none;
filter: alpha(opacity=25); /* internet Explorer */
-khtml-opacity: 0.25; /* khtml, old safari */
-moz-opacity: 0.25; /* mozilla, netscape */
opacity: 0.25; /* fx, safari, opera */
}
J'avais un problème similaire; vouloir désactiver le défilement vertical alors qu'un div "popup" était affiché.
La modification de la propriété de débordement de la variable body
fonctionne, mais modifie également la largeur du document.
J'ai choisi jquery pour résoudre ce problème en utilisant un espace réservé pour la barre de défilement . Cela a été fait sans se lier à l'événement scroll
, car cela ne change pas la position de la barre de défilement ni ne scintille :)
HTML:
<div id="scrollPlaceHolder"></div>
CSS:
body,html
{
height:100%; /*otherwise won't work*/
}
#scrollPlaceHolder
{
height:100%;
width:0px;
float:right;
display: inline;
top:0;
right: 0;
position: fixed;
background-color: #eee;
z-index: 100;
}
Jquery:
function DisableScrollbar()
{
// exit if page can't scroll
if($(document).height() == $('body').height()) return;
var old_width = $(document).width();
var new_width = old_width;
// ID's \ class to change
var items_to_change = "#Banner, #Footer, #Content";
$('body').css('overflow-y','hidden');
// get new width
new_width = $(document).width()
// update width of items to their old one(one with the scrollbar visible)
$(items_to_change).width(old_width);
// make the placeholder the same width the scrollbar was
$("#ScrollbarPlaceholder").show().width(new_width-old_width);
// and float the items to the other side.
$(items_to_change).css("float", "left");
}
function EnableScrollbar()
{
// exit if page can't scroll
if ($(document).height() == $('body').height()) return;
// remove the placeholder, then bring back the scrollbar
$("#ScrollbarPlaceholder").fadeOut(function(){
$('body').css('overflow-y','auto');
});
}
J'espère que cela t'aides.
Utilisez le code ci-dessous pour désactiver et activer la barre de défilement.
Scroll = (
function(){
var x,y;
function hndlr(){
window.scrollTo(x,y);
//return;
}
return {
disable : function(x1,y1){
x = x1;
y = y1;
if(window.addEventListener){
window.addEventListener("scroll",hndlr);
}
else{
window.attachEvent("onscroll", hndlr);
}
},
enable: function(){
if(window.removeEventListener){
window.removeEventListener("scroll",hndlr);
}
else{
window.detachEvent("onscroll", hndlr);
}
}
}
})();
//for disabled scroll bar.
Scroll.disable(0,document.body.scrollTop);
//for enabled scroll bar.
Scroll.enable();
https://jsfiddle.net/satishdodia/L9vfhdwq/1/
html: - Ouvrir popup
pop open scroll scroll now ... quand je clique sur fermer automatiquement défiler en cours d'exécution.
**css:-**
#popup{
position: fixed;
background: rgba(0,0,0,.8);
display: none;
top: 20px;
left: 50px;
width: 300px;
height: 200px;
border: 1px solid #000;
border-radius: 5px;
padding: 5px;
color: #fff;
}
**jquery**:-
<script type="text/javascript">
$("#open_popup").click(function(){
$("#popup").css("display", "block");
$('body').css('overflow', 'hidden');
});
$("#close_popup").click(function(){
$("#popup").css("display", "none");
$('body').css('overflow', 'scroll');
});
</script>
J'ai eu le même problème et j'ai trouvé un moyen de s'en débarrasser, il vous suffit d'arrêter la propagation au toucher sur votre élément qui apparaît. Pour moi, c’était le menu plein écran qui apparaissait à l’écran et vous ne pouviez pas faire défiler, maintenant vous le pouvez.
$(document).on("touchmove","#menu-left-toggle",function(e){
e.stopPropagation();
});
Si le simple basculement du 'débordement-y' du corps rompt la position de défilement de votre page, essayez d'utiliser les 2 fonctions suivantes (jQuery):
// Run this function when you open your popup:
var disableBodyScroll = function(){
window.body_scroll_pos = $(window).scrollTop(); // write page scroll position in a global variable
$('body').css('overflow-y','hidden');
}
// Run this function when you close your popup:
var enableBodyScroll = function(){
$('body').css('overflow-y','scroll');
$(window).scrollTop(window.body_scroll_pos); // restore page scroll position from the global variable
}