可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
We are using fancybox2 for displaying images. Everything works well, but when the larger image is displayed in the fancybox, the page behind scrolls to the top. After closing the fancybox the user has to scroll back downwards to the position, where he opened the box. The examples on the fancybox2 Site do not show this behaviour. I could not find out, where is the difference to make this happen.
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'
}
}
};
We are using fancybox2 as a module within require.js.
The .fancybox() call is in a $(document).ready block.
There where 2 scrollbars and I hid one with css
.fancybox-overlay {
overflow: hidden !important;
}
回答1:
Apparently, Fancybox changes the CSS property overflow
on body
element to hidden
when a picture is showed. This causes the background to scroll back to the top. All you have to do is comment out the row saying overflow: hidden !important;
in section .fancybox-lock
in stylesheet jquery.fancybox.css
.
Please see fancybox2 / fancybox causes page to to jump to the top as well.
回答2:
This is working fine for me:
Add follow functions in facnybox initialization
beforeShow: function(){
$("body").css({'overflow-y':'hidden'});
},
afterClose: function(){
$("body").css({'overflow-y':'visible'});
}
Example:
$(".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
}
}
});
I hope it will work for you.
回答3:
This worked for me :
$.fancybox({
scrolling : 'hidden',
helpers: {
overlay: {
locked: true
}
});
Hope it helps :)
回答4:
My guess? The selector you click to fire fancybox is most likely an anchor with a hashmark
like :
<a href="#">
then you get the fancybox's href
from the closest <a>
element, as in your code :
beforeLoad: function(){
this.title = getTitle(this);
this.href = $(this.element).closest('a').attr('href');
}
Here is a DEMO that reproduces the behavior you are describing (scroll the content down until you find the thumbnail that fires fancybox)
If what I assumed above is correct, then your possible solutions are :
1). Change the hashmark
in your anchor's href
attribute to the hashtag
#nogo
like <a href="#nogo">
as referred by Stuart Nicholls (cssplay) in his update of 15th March 2005 in the linked post.
2). Or replace the hashmark
in your anchor's href
attribute by javascript:;
like <a href="javascript:;">
See updated JSFIDDLE using the first option.
回答5:
I realize this question has been asked a while ago, but I think I have found a good solution for it.
The problem is that fancy box changes the overflow value of the body in order to hide the browser scrollbars.
As SimCity points out, we can stop fancy box from doing this by adding the following parameters:
$('.image').fancybox({
padding: 0,
helpers: {
overlay: {
locked: false
}
}
});
But, now we can scroll the main page while looking at our fancy box window. It is better than jumping to the top of the page, but it is probably not what we really want.
We can prevent scrolling the right way by adding the next parameters:
$('.image').fancybox({
padding: 0,
helpers: {
overlay: {
locked: false
}
},
'beforeLoad': function(){
disable_scroll();
},
'afterClose': function(){
enable_scroll();
}
});
And add these functions from galambalaz. See: 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;
}
回答6:
You may try this :-
beforeShow: function(){
$("body").css({'overflow-y':'hidden'});
},
afterClose: function(){
$("body").css({'overflow-y':'visible'});
}
It stops the vertical scrolling on the parent page while fancybox is open.
回答7:
In jquery.fancybox.css -> .fancybox-lock
change:
overflow: hidden !important;
to:
overflow: visible !important;
works for me :)
回答8:
My modification, this help me
/* Fancybox */
$('.fancybox').fancybox({
beforeShow: function(){
$("body").css({
"overflow-y": "hidden",
"position": "fixed"
}
);
},
afterClose: function(){
$("body").removeAttr("style");
}
});
回答9:
$('.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;
.....
}