2013-03-26 76 views
13

我們使用fancybox2來顯示圖片。一切正常,但當大圖像顯示在fancybox中時,後面的頁面會滾動到頂部。在關閉fancybox之後,用戶必須向下滾動回到打開盒子的位置。 fancybox2網站上的示例不顯示此行爲。我無法發現,發生這種情況的區別在哪裏。如何防止頁面滾動到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' 
    } 
    } 
}; 

我們在require.js中使用fancybox2作爲模塊。.fancybox()調用位於$(document).ready塊中。

其中有2個滾動條和我躲在一個用CSS

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

通過隱藏滾動條工作液:http://stackoverflow.com/a/13424120/216084 – 2014-09-10 05:32:52

回答

0

你可以試試這個: -

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

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

} 

它停止垂直滾動父頁面上同時的fancybox是開放的。

+0

我不認爲你真的理解這個問題。問題是在關閉fancybox之後,父頁面已經滾動到頂部。 – JFK 2013-03-26 07:20:11

+0

這沒有幫助。沒有什麼改變。 – tomsteg 2013-03-26 07:40:41

+0

對不起,重新啓動現在不在線,但會在四月中旬有或沒有這個錯誤。 – tomsteg 2013-03-27 07:02:19

3

我的猜測是?您按一下火的fancybox的選擇是最有可能與一個錨​​,如:

<a href="#"> 

,那麼你得到的fancybox的href從最近<a>元素,如代碼:

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

這裏is a DEMO重現您所描述的行爲(向下滾動內容直到找到引發fancybox的縮略圖)

如果我以上所假設的是正確的,那麼您可能的解決方案是:

1)。改變你的錨的href屬性​​到hashtag#nogo<a href="#nogo">

Stuart Nicholls (cssplay)在他2005年3月15日更新的鏈接後簡稱。 2)。或javascript:;替換你的錨的href屬性​​像<a href="javascript:;">

選擇第一種方法見updated JSFIDDLE

+0

我們使用的是帶有this.title和this.href的構造,因爲它是一個包裝器,我們圍繞鏈接構建,在圖像的右下邊緣顯示一個小小的放大鏡。因此,用戶可以區分圖像是否可以顯示在fancybox中。該鏈接有一個真正的網址到一個更大的圖像和沒有標籤。 – tomsteg 2013-03-26 08:30:26

+0

@ user2210437你能分享一個鏈接來查看行爲嗎? – JFK 2013-03-26 15:22:14

+0

對不起,重新啓動現在不在線,但將在四月中旬有或沒有此錯誤。 – tomsteg 2013-03-27 07:29:08

4

這爲我工作:

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

希望它能幫助:)

+0

嗨,它可能是我,但我似乎無法找到這些選項記錄。你能分享一個鏈接到這些選項的文檔嗎? – Bertvan 2013-07-02 15:20:47

+0

要停止滾動,它應該設置爲「false」,而不是「true」。請參閱:http://stackoverflow.com/a/15306863/594235 – Sparky 2015-11-20 19:27:38

21

顯然,的fancybox拍攝照片時顯示body元素的CSS屬性overflow變爲hidden。這會導致背景滾動回頂部。你所要做的就是在樣式表jquery.fancybox.css中註釋overflow: hidden !important;.fancybox-lock這一行。

請參閱fancybox2/fancybox causes page to to jump to the top

+0

這爲我工作 - 現在身體保持滾動位置,而是被鎖定,不會有任何雙重滾動在模式彈出滾動的情況。不錯,比快速反應。 :) – kasperwf 2013-07-08 09:52:19

+2

謝謝。我我愛你。 – Leng 2015-09-05 04:11:49

0

在jquery.fancybox.css - > .fancybox鎖
變化:
overflow: hidden !important;
到:
overflow: visible !important;
作品對我來說:)

+0

這是編輯插件的核心文件 - 我們不能把它推薦的技術,除非沒有其他方法能夠完成任務。 :) – 2014-09-10 05:27:12

1

我意識到這個問題已經被問了一會兒以前,但我認爲我找到了一個很好的解決方案。 問題是,花式框改變了正文的溢出值以隱藏瀏覽器滾動條。

正如模擬城市所指出的,我們可以通過添加以下參數做這個停止看中框:

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

但是,現在一邊看着我們看中框窗口,我們可以滾動主頁。這比跳到頁面頂部要好,但這可能不是我們真正想要的。

我們可以防止添加下一個參數滾動的正確方法:

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

而且從galambalaz添加這些功能。請參閱: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

這是對我工作的罰款:

添加後續功能facnybox初始化

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

例子:

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

我希望它會爲你工作。

+1

完美優雅的編程解決方案,無需修改CSS文件。這應該是被接受的答案。 – 2018-01-04 17:27:19

0

我的修改,這幫助我

/* 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; 
} 

在fullPage.js

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