Подтвердить что ты не робот

Как предотвратить прокрутку страницы за fancybox-2

Мы используем fancybox2 для отображения изображений. Все работает хорошо, но когда большее изображение отображается в fancybox, страница за спинами вверх. После закрытия fancybox пользователь должен прокрутить назад вниз до положения, где он открыл поле. Примеры на сайте fancybox2 не показывают этого поведения. Я не мог понять, где разница, чтобы это произошло.

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

Мы используем fancybox2 в качестве модуля в require.js. Вызов .fancybox() находится в блоке $(document).ready.

Там, где 2 полосы прокрутки, и я спрятал один с css

.fancybox-overlay {
overflow: hidden !important;
}
4b9b3361

Ответ 1

По-видимому, Fancybox изменяет свойство CSS overflow на body на hidden, когда отображается изображение. Это заставляет фон прокручиваться назад. Все, что вам нужно сделать, это прокомментировать строку с текстом overflow: hidden !important; в разделе .fancybox-lock в таблице стилей jquery.fancybox.css.

Посмотрите fancybox2/fancybox, чтобы страница также могла перейти в начало.

Ответ 2

Это отлично работает для меня:

Добавьте следующие функции в инициализацию 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
        }
    }
});

Я надеюсь, что это сработает для вас.

Ответ 3

Это сработало для меня:

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

Надеюсь, это поможет:)

Ответ 4

Мое предположение? Селектор, который вы нажимаете для запуска fancybox, скорее всего, является якорем с hashmark следующим:

<a href="#">

то вы получите fancybox href из ближайшего элемента <a>, как в вашем коде:

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

Здесь является DEMO, который воспроизводит поведение, которое вы описываете (прокручивайте контент до тех пор, пока вы не найдете миниатюру который запускает fancybox)

Если то, что я предположил выше, является правильным, тогда ваши возможные решения:

1). Измените hashmark в привязке href к hashtag #nogo как <a href="#nogo">

как указано Stuart Nicholls (cssplay) в своем обновлении от 15 марта 2005 года в связанном сообщении.

2). Или замените hashmark на ваш якорный атрибут href на javascript:; как <a href="javascript:;">

См. обновленный JSFIDDLE, используя первый вариант.

Ответ 5

Я понимаю, что этот вопрос задан некоторое время назад, но я думаю, что нашел для него хорошее решение. Проблема в том, что причудливый ящик меняет значение переполнения тела, чтобы скрыть полосы прокрутки браузера.

Как указывает SimCity, мы можем остановить причудливое поле от этого, добавив следующие параметры:

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

Ответ 6

Вы можете попробовать следующее: -

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

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

} 

Он останавливает вертикальную прокрутку на родительской странице, пока открыт fancybox.

Ответ 7

В jquery.fancybox.css → .fancybox-lock
изменить:
overflow: hidden !important;
to:
overflow: visible !important;
работает для меня:)

Ответ 8

Мое изменение, это поможет мне

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

в fullPage.js

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