2013-03-26 13 views
13

Usiamo fancybox2 per la visualizzazione delle immagini. Tutto funziona bene, ma quando l'immagine più grande viene visualizzata nella fancybox, la pagina dietro scorre verso l'alto. Dopo aver chiuso la fancybox, l'utente deve scorrere indietro verso il basso fino alla posizione, dove ha aperto la scatola. Gli esempi sul sito fancybox2 non mostrano questo comportamento. Non sono riuscito a scoprirlo, dov'è la differenza per far sì che ciò accada.come evitare lo scorrimento della pagina dietro fancybox-2

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' 
    } 
    } 
}; 

Stiamo usando fancybox2 come modulo all'interno di require.js. La chiamata .fancybox() si trova in un blocco $ (documento) .ready.

Lì dove 2 barre di scorrimento e ho nascosto una con css

.fancybox-overlay { 
overflow: hidden !important; 
} 
+0

soluzione di lavoro nascondendo le barre di scorrimento: http://stackoverflow.com/a/13424120/216084 –

risposta

0

Si può provare questo: -

beforeShow: function(){ 
$("body").css({'overflow-y':'hidden'}); 
}, 

afterClose: function(){ 
$("body").css({'overflow-y':'visible'}); 

} 

Si ferma lo scorrimento verticale sulla pagina padre mentre fancybox è aperto.

+0

Non penso che tu abbia davvero capito la domanda. Il problema è dopo aver chiuso fancybox, la pagina padre è già stata spostata in alto. – JFK

+0

Questo non ha aiutato. Niente sta cambiando. – tomsteg

+0

Siamo spiacenti, il rilancio non è online ora, ma con o senza questo bug a metà aprile. – tomsteg

3

La mia ipotesi? Il selettore si fa clic al fuoco fancybox è più probabile un ancoraggio con un hashmark come:

<a href="#"> 

poi si ottiene il fancybox href dall'elemento più vicino <a>, come nel codice:

beforeLoad: function(){ 
    this.title = getTitle(this); 
    this.href = $(this.element).closest('a').attr('href'); 
    } 

Qui is a DEMO che riproduce il comportamento che si sta descrivendo (scorrere il contenuto verso il basso fino a trovare la miniatura che spara fancybox)

Se ciò che ho assunto sopra è corretto, allora le possibili soluzioni sono:

1). Modificare l'hashmark nell'attributo del vostro ancoraggio href al hashtag#nogo come <a href="#nogo">

come riferisce Stuart Nicholls (cssplay) nel suo aggiornamento 15 Marzo 2005 nel post collegato.

2). O sostituire il hashmark nell'attributo del vostro ancoraggio href da javascript:; come <a href="javascript:;">

Vedi updated JSFIDDLE utilizzando la prima opzione.

+0

Usiamo la costruzione con this.title e this.href a causa di un wrapper, costruiamo attorno al link, per mostrare una piccola lente sul bordo inferiore destro dell'immagine. Quindi l'utente può distinguere se l'immagine può essere visualizzata in una fancybox. Il link ha un vero url per un'immagine più grande e senza hashtag. – tomsteg

+0

@ user2210437 puoi condividere un link per vedere il comportamento? – JFK

+0

Siamo spiacenti, il rilancio non è online ora, ma con o senza questo bug a metà aprile. – tomsteg

4

questo ha funzionato per me:

$.fancybox({ 
     scrolling : 'hidden', 
     helpers: { 
      overlay: { 
       locked: true 
      } 
     }); 

Speranza che aiuta :)

+0

Ciao, potrei essere io, ma non riesco a trovare queste opzioni documentate. Potresti condividere un link alla documentazione di queste opzioni? – Bertvan

+0

Per interrompere lo scorrimento, dovrebbe essere impostato su 'false', non' true'. Vedi: http://stackoverflow.com/a/15306863/594235 – Sparky

21

A quanto pare, Fancybox cambia la proprietà CSS overflow su body elemento da hidden quando un'immagine viene mostrato. Ciò fa sì che lo sfondo torni verso l'alto. Tutto quello che devi fare è commentare la riga dicendo overflow: hidden !important; nella sezione .fancybox-lock nel foglio di stile jquery.fancybox.css.

Vedere anche fancybox2/fancybox causes page to to jump to the top.

+0

Questo ha funzionato per me - ora il corpo mantiene la posizione di scorrimento, ma è bloccato quindi non ci sarà alcun doppio scorrimento in caso di scorrimento nel popup modale. Bello, che i riflessi veloci. :) – kasperwf

+2

Grazie. Ti amo. – Leng

0

In jquery.fancybox.css -> .fancybox-lock
cambiamento:
overflow: hidden !important;
a:
overflow: visible !important;
lavori per me :)

+0

Si sta modificando il file principale di un plug-in. Non possiamo chiamarlo una tecnica consigliata a meno che nessun altro metodo non abbia completato il lavoro. :) –

1

Mi rendo conto che questo problema è stato fatto un po ' fa, ma penso di aver trovato una buona soluzione per questo. Il problema è che la scatola fantasia cambia il valore di overflow del corpo per nascondere le barre di scorrimento del browser.

Come SimCity sottolinea, siamo in grado di fermare la casella operata dal fare questo con l'aggiunta dei seguenti parametri:

$('.image').fancybox({ 
    padding: 0, 
    helpers: { 
    overlay: { 
     locked: false 
    } 
    } 
}); 

Ma, ora siamo in grado di scorrere la pagina principale, mentre guardando la nostra finestra casella di fantasia. È meglio che saltare in cima alla pagina, ma probabilmente non è ciò che vogliamo veramente.

possiamo impedire lo scorrimento nel modo giusto con l'aggiunta dei prossimi parametri:

$('.image').fancybox({ 
     padding: 0, 
     helpers: { 
     overlay: { 
      locked: false 
     } 
     }, 
    'beforeLoad': function(){ 
     disable_scroll(); 
     }, 
    'afterClose': function(){ 
     enable_scroll(); 
     } 
    }); 

E aggiungere queste funzioni da galambalaz. Vedi: How to disable scrolling temporarily?

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; 
    } 
15

Questo sta lavorando bene per me:

aggiungere funzioni seguire in inizializzazione facnybox

beforeShow: function(){ 
    $("body").css({'overflow-y':'hidden'}); 
}, 
afterClose: function(){ 
    $("body").css({'overflow-y':'visible'}); 
} 

Esempio:

$(".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 
     } 
    } 
}); 

spero che funzionerà per voi .

+1

Soluzione programmatica perfettamente elegante senza la necessità di modificare il file CSS. Questa dovrebbe essere la risposta accettata. –

0

mia modifica, questo mi aiuta

/* Fancybox */ 
$('.fancybox').fancybox({ 
    beforeShow: function(){ 
     $("body").css({ 
      "overflow-y": "hidden", 
      "position": "fixed" 
      } 
     ); 
    }, 
    afterClose: function(){ 
     $("body").removeAttr("style"); 
    } 
}); 
0
$('.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; 
} 

in fullPage.js

function scrollPage(element, callback, isMovementUp) 
{ 
    if(disabled_scroll) return; 
    ..... 
}