Nous utilisons fancybox2 pour afficher des images. Tout fonctionne bien, mais lorsque la plus grande image est affichée dans la fancybox, la page derrière défile vers le haut. Après la fermeture de la fancybox, l'utilisateur doit faire défiler vers le bas jusqu'à la position où il a ouvert la boîte. Les exemples sur le site fancybox2 n'indiquent pas ce comportement. Je ne pouvais pas savoir où est la différence pour que cela se produise.
fancyOptions = {
type: 'image',
closeBtn: false,
autoSize: false,
scrolling: 'no',
type: 'image',
padding: [10,10,10,10],
beforeLoad: function(){
this.title = getTitle(this);
this.href = $(this.element).closest('a').attr('href');
},
helpers: {
overlay: {
css: {
'background': 'rgba(0, 0, 0, 0.7)'
},
},
title: {
type: 'inside'
}
}
};
Nous utilisons fancybox2 en tant que module dans require.js . L'appel .fancybox () est dans un bloc $ (document) .ready.
Là où 2 barres de défilement et j'en ai caché une avec css
.fancybox-overlay {
overflow: hidden !important;
}
Apparemment, Fancybox modifie la propriété CSS overflow
sur l'élément body
en hidden
lorsqu'une image est affichée. Cela fait revenir l'arrière-plan en arrière-plan. Tout ce que vous avez à faire est de commenter la ligne en indiquant overflow: hidden !important;
dans la section .fancybox-lock
dans la feuille de style jquery.fancybox.css
.
Veuillez consulter fancybox2/fancybox amène la page à se placer en haut également.
Cela fonctionne bien pour moi:
Ajout des fonctions suivantes dans l'initialisation de facnybox
beforeShow: function(){
$("body").css({'overflow-y':'hidden'});
},
afterClose: function(){
$("body").css({'overflow-y':'visible'});
}
Exemple:
$(".fancyBoxTrigger").fancybox({
maxWidth : 820,
maxHeight : 670,
fitToView : false,
width : 760,
height : 580,
autoSize : false,
closeClick : false,
openEffect : 'none',
closeEffect : 'none',
padding : 10,
closeBtn : false,
beforeShow: function(){
$("body").css({'overflow-y':'hidden'});
},
afterClose: function(){
$("body").css({'overflow-y':'visible'});
},
helpers : {
overlay : {
opacity: 0.4,
locked: false
}
}
});
J'espère que cela fonctionnera pour vous.
Cela a fonctionné pour moi:
$.fancybox({
scrolling : 'hidden',
helpers: {
overlay: {
locked: true
}
});
J'espère que ça aide :)
Mon deviner? Le sélecteur sur lequel vous cliquez pour déclencher une fantaisie est probablement une ancre avec une variable hashmark
comme:
<a href="#">
alors vous obtenez la variable href
de la boîte fantaisie à partir de l'élément <a>
le plus proche, comme dans votre code:
beforeLoad: function(){
this.title = getTitle(this);
this.href = $(this.element).closest('a').attr('href');
}
Ici est une DEMO qui reproduit le comportement que vous décrivez (faites défiler le contenu jusqu'à ce que vous trouviez la vignette qui déclenche fancybox)
Si ce que j'ai supposé ci-dessus est correct, vos solutions possibles sont les suivantes:
1). Changez la hashmark
dans l'attribut href
de votre ancre en la hashtag
#nogo
comme <a href="#nogo">
comme indiqué par Stuart Nicholls (cssplay) dans sa mise à jour du 15 mars 2005 dans le post lié.
2) Ou remplacez la hashmark
dans l'attribut href
de votre ancre par javascript:;
comme <a href="javascript:;">
Voir mis à jour JSFIDDLE en utilisant la première option.
Je me rends compte que cette question a été posée il y a quelque temps, mais je pense avoir trouvé une bonne solution à cette question. Le problème vient de ce que la boîte fantaisie change la valeur de dépassement du corps afin de masquer les barres de défilement du navigateur.
Comme le fait remarquer SimCity, nous pouvons empêcher cela, en ajoutant les paramètres suivants:
$('.image').fancybox({
padding: 0,
helpers: {
overlay: {
locked: false
}
}
});
Mais, maintenant, nous pouvons faire défiler la page principale tout en regardant notre fenêtre de boîte fantaisie. C’est mieux que de sauter en haut de la page, mais ce n’est probablement pas ce que nous voulons vraiment.
Nous pouvons empêcher le défilement dans le bon sens en ajoutant les paramètres suivants:
$('.image').fancybox({
padding: 0,
helpers: {
overlay: {
locked: false
}
},
'beforeLoad': function(){
disable_scroll();
},
'afterClose': function(){
enable_scroll();
}
});
Et ajoutez ces fonctions de galambalaz. Voir: Comment désactiver le défilement temporairement?
var keys = [37, 38, 39, 40];
function preventDefault(e) {
e = e || window.event;
if (e.preventDefault) e.preventDefault();
e.returnValue = false;
}
function keydown(e) {
for (var i = keys.length; i--;) {
if (e.keyCode === keys[i]) {
preventDefault(e);
return;
}
}
}
function wheel(e) {
preventDefault(e);
}
function disable_scroll() {
if (window.addEventListener) {
window.addEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = wheel;
document.onkeydown = keydown;
}
function enable_scroll() {
if (window.removeEventListener) {
window.removeEventListener('DOMMouseScroll', wheel, false);
}
window.onmousewheel = document.onmousewheel = document.onkeydown = null;
}
$('.fancybox').fancybox({
'beforeLoad': function(){
disable_scroll();
},
'afterClose': function(){
enable_scroll();
}
});
var disabled_scroll = false;
function disable_scroll() {
disabled_scroll = true;
}
function enable_scroll() {
disabled_scroll = false;
}
dans fullPage.js
function scrollPage(element, callback, isMovementUp)
{
if(disabled_scroll) return;
.....
}
Ma modification, ça m'aide
/* Fancybox */
$('.fancybox').fancybox({
beforeShow: function(){
$("body").css({
"overflow-y": "hidden",
"position": "fixed"
}
);
},
afterClose: function(){
$("body").removeAttr("style");
}
});
Vous pouvez essayer ceci: -
beforeShow: function(){
$("body").css({'overflow-y':'hidden'});
},
afterClose: function(){
$("body").css({'overflow-y':'visible'});
}
Il arrête le défilement vertical sur la page parent tant que fancybox est ouvert.
Dans jquery.fancybox.css -> .fancybox-lock
changement: overflow: hidden !important;
à: overflow: visible !important;
travaille pour moi :)