開発サイトにfancybox2を実装しました。
ファンシーボックスをエンゲージすると(リンクをクリックするなど)、HTML全体がその後ろに移動し、先頭に移動します。別のデモでも問題なく機能していますが、同じコードをこのプロジェクトにドラッグすると、先頭にジャンプします。インラインdivへのリンクだけでなく、単純な画像ギャラリーにも使用できます。
誰かこれを経験しましたか?
開発サイトにfancybox2を実装しました。
ファンシーボックスをエンゲージすると(リンクをクリックするなど)、HTML全体がその後ろに移動し、先頭に移動します。別のデモでも問題なく機能していますが、同じコードをこのプロジェクトにドラッグすると、先頭にジャンプします。インラインdivへのリンクだけでなく、単純な画像ギャラリーにも使用できます。
誰かこれを経験しましたか?
回答:
これは実際にはFancybox 2のヘルパーを使用して行うことができます。
$('.image').fancybox({
helpers: {
overlay: {
locked: false
}
}
});
http://davekiss.com/prevent-fancybox-from-jumping-to-the-top-of-the-page/
locked
がに設定されてfalse
いる場合に起こります)。これは、いくつかのシナリオで別の問題を作成する可能性がある問題に対する一時的な回避策です。これはバグであり、最新のマスターgithub.com/fancyapps/fancyBox/archive/master.zipで
これは古い質問だと思いますが、良い解決策を見つけたと思います。問題は、派手なボックスがブラウザのスクロールバーを非表示にするためにボディのオーバーフロー値を変更することです。
Dave Kissが指摘するように、次のパラメーターを追加することで、ファンシーボックスがこれを行うのを停止できます。
$('.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からこれらの関数を追加します。参照:一時的にスクロールを無効にする方法は?
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コードのこのセクションを削除して、それを防ぐことができます。
if (obj.locked) {
this.el.addClass('fancybox-lock');
if (this.margin !== false) {
$('body').css('margin-right', getScalar( this.margin ) + obj.scrollbarWidth);
}
}
この問題を解決する適切な方法は、fancyboxが提供するオプション(この回答を参照)を使用することであるという事実にもかかわらず、CSSを使用して問題を解決できます。ライブラリのcssファイルを編集する必要はありません。これをアプリケーションのメインスタイルシートに追加するだけです。
html.fancybox-lock {
overflow: visible !important;
}
コードは、要素の元のオーバーフローをリセットします。問題はoverflow: hidden;
、<html>
要素のスクロールバーを非表示にすることです。これにより、ページが一番上に「ジャンプ」します。スクロールバーの位置を保持するために、オーバーフローを上書きしますoverflow: visible;
<body>
か/と<html>
していることheight: 100%
これも助けた
.fancybox-lock body {
overflow: visible !important;
}
受け入れられた回答は、実際には問題を解決せず、回避するだけなので、完全ではありません。これは、ウィンドウジャンプの問題を修正しながら実際に目的の機能を提供する、より完全な回答です。
$('.fancybox').fancybox({
helpers: {
overlay: {
locked: false
}
},
beforeShow:function(){
$('html').css('overflowX', 'visible');
$('body').css('overflowY', 'hidden');
},
afterClose:function(){
$('html').css('overflowX', 'hidden');
$('body').css('overflowY', 'visible');
}
});
多分この答えは遅れているかもしれませんが、多分それは将来役立つかもしれません、もし画像のflicboxをクリク/閉じた後にあなたのウェブサイトを上にスクロールさせたら、あなたは単に削除することができます:
F.trigger('onReady');
またはより良い使用:
/*F.trigger('onReady');*/
fancyBoxバージョン:2.1.5(2013年6月14日金曜日)では、コードの一部は897行目にあります。
fancyboxのデフォルト関数を使用している場合、実際には次のようにコーディングできます。
$(document).ready(function() {
$(".fancybox").fancybox({
padding: 0,
helpers: {
overlay: {
locked: false
}
}
});
});
私はそれを修正しました:
overflow: hidden !important;
中.fancybox-lock
で体jquery.fancybox.css
。スクロールバーがジャンプしない:)