how to prevent scrolling of page behind fancybox-2
Asked Answered
O

9

15

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;
}
Outreach answered 26/3, 2013 at 6:57 Comment(1)
Working solution by hiding the scrollbars: https://mcmap.net/q/495074/-jquery-fancybox-but-i-don-39-t-want-scrollbarsSelfcontained
C
21

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.

Canonicity answered 3/7, 2013 at 21:14 Comment(1)
This worked for me - now the body keeps the scroll position, but is locked so there won't be any double scrolling in case of scroll in the modal popup. Nice, than's fast-reflexes. :)Candelariacandelario
R
19

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.

Rhinal answered 9/4, 2014 at 8:32 Comment(2)
Perfectly elegant programmatic solution without the need to modify the CSS file. This should be the accepted answer.Mayworm
@TerryCarter Thanks :)Rhinal
S
5

This worked for me :

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

Hope it helps :)

Sabol answered 2/7, 2013 at 1:25 Comment(2)
Hi, it may be me, but I can't seem to find these options documented. Could you share a link to the documentation of these options?Marquismarquisate
To stop the scrolling, it should be set to false, not true. See: https://mcmap.net/q/194717/-fancybox2-fancybox-causes-page-to-to-jump-to-the-topViperous
L
3

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.

Loudhailer answered 26/3, 2013 at 8:7 Comment(5)
We are using the construction with this.title and this.href because of a wrapper, we build around the link, to show a little tiny loupe in the right bottom edge of the image. So the user can distinguish if the image can be displayed in a fancybox. The link has a real url to a bigger image and no hashtag.Outreach
@user2210437 can you share a link to see the behavior?Loudhailer
Sorry, the relaunch is not online now, but will be with or without this bug middle of April.Outreach
They're called "fragments" not "hashtags". Jeez.Analgesia
@Analgesia : in this case (IF the assumption in my answer is true), they are not "fragment identifiers" because they are not pointing to any section in the document so they are simply hashmark... the word #nogo on the other hand is a hashtag. I edited my answer to avoid confusion.Loudhailer
B
1

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;  
    }
Bolin answered 25/1, 2014 at 19:37 Comment(0)
S
0

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.

Snicker answered 26/3, 2013 at 7:11 Comment(4)
I don't think you really understood the question. The issue is after closing fancybox, the parent page has already scrolled to the top.Loudhailer
That did not help. Nothing is changing.Outreach
Sorry, the relaunch is not online now, but will be with or without this bug middle of April.Outreach
Our Website is now online and we have not fixed the problem with the scrolling background using fancybox2 image. Here is a link to a page where the fancybox2 is used: agenda-kunden.de/faq-fibu-allgemein.htm To see the content you have got to register. The typical fancybox images are those with the loupe. We still have no clue, why the page in the background scrolls to the top.Outreach
S
0

In jquery.fancybox.css -> .fancybox-lock
change:
overflow: hidden !important;
to:
overflow: visible !important;
works for me :)

Suzerainty answered 16/9, 2013 at 19:38 Comment(1)
This is editing the core file of a plugin - We cannot call it a recommended technique unless no other method gets the job done. :)Selfcontained
K
0

My modification, this help me

/* Fancybox */
$('.fancybox').fancybox({
    beforeShow: function(){
        $("body").css({
            "overflow-y": "hidden",
            "position": "fixed"
            }
        );
    },
    afterClose: function(){
        $("body").removeAttr("style");
    }
});
Kanarese answered 15/9, 2015 at 10:23 Comment(0)
J
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;
   .....
}
Jabiru answered 25/4, 2016 at 14:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.