переключение отображения div, когда 2-й div прокручивает страницу включения / выключения

0

Я смотрел код на этот вопрос SO и думал, что было бы полезно переключить видимость div, например navbar, в зависимости от того, какой другой элемент на странице будет виден на экране или нет. Вот код, который я использовал на странице:

function isScrolledIntoView(elem) {
var docViewTop = $(window).scrollTop();
var docViewBottom = docViewTop + $(window).height();

var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();

return ((docViewTop < elTop) && (docViewBottom > elBottom));
}

Я попытался построить функцию, чтобы сделать это, но, к сожалению, я сосать в программировании. Вот что я использовал:

$('#magicnav').hide();
var intro = $('#intro');
$(document).ready(function () {
   if (intro.isScrolledIntoView()) {
    $('#magicnav').fadeOut();
   } else {
    $('#magicnav').fadeIn();
    }
  });

Я попробовал утверждение if(isScrolledIntoView($intro)), но, очевидно, это неверно. Может кто-нибудь мне помочь?

Вот ссылка на страницу для справки. Моя цель - иметь фиксированную навигационную панель в верхней части экрана, которая отображается только тогда, когда конкретный div (также содержащий ссылки навигации) НЕ на экране.

Вы можете заметить, что я застрял div "magicnav" в середине страницы. Это было специально, так как я хотел, чтобы он не фиксировался на вершине в настоящее время и был необходим, чтобы я мог быстро узнать, работает ли мой jQuery.

  • 0
    Где вы добавляете событие прокрутки?
  • 0
    Я на самом деле попытался запустить свою функцию с помощью $ (window) .scroll (), и он сразу показал div 'magicnav' (что неверно, так как показывается intro div), плюс div никогда не исчезал при прокрутке.
Теги:
if-statement
scroll
toggle

2 ответа

3
Лучший ответ

$(document).ready() проверяет состояние элемента один раз. Вместо этого используйте $(window).on('scroll');

Я исправил это в этом JSFiddle

  • 0
    Вы поймали проблему в исходном операторе возврата. Это сделало это работает отлично!
1

Основные проблемы

Первый шаг к устранению неполадок сценария: всегда проверяйте консоль на наличие ошибок. Проверяя консоль при загрузке Fiddle, я вижу эту ошибку:

Uncaught TypeError: Object [object Object] не имеет метода 'isScrolledIntoView'

Это связано с тем, что не существует метода под названием .isScrolledIntoView. Это простая JS-функция, в которой вы указываете идентификатор элемента (класс или идентификатор), который затем возвращается, если указанный элемент находится в поле зрения или нет. Его следует использовать примерно так:

// For class
if(isScrolledIntoView(".class")) {...} else {...}

// For ID
if(isScrolledIntoView("#id")) {...} else {...}

Это связано с тем, что функция оценивает элемент на основе этой строки:

var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();

Кроме того, elTop и elBottom на самом деле не определены. Я считаю, что это опечатка. Вот фиксированная функция:

function isScrolledIntoView (elem) {var docViewTop = $ (window).scrollTop(); var docViewBottom = docViewTop + $(window).height(); var docViewBottom = docViewTop + $ (window).height();

var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();

return ((docViewTop < elemTop) && (docViewBottom > elemBottom));
var elemTop = $(elem).offset().top;
var elemBottom = elemTop + $(elem).height();

return ((docViewTop < elemTop) && (docViewBottom > elemBottom));

} }


Ваша скрипка

При манипулировании DOM всегда выполняйте их, когда DOM готов, то есть:

$(document).ready(function () {
    $('#magicnav').hide();
    $(window).scroll(function() {
        if (isScrolledIntoView('#intro')) {
            $('#magicnav').fadeOut();
        } else {
            $('#magicnav').fadeIn();
        }
    });
});

Обратите внимание, что я переместил метод .hide() в событие готовности DOM. Кроме того, функция isScrolledIntoView только один раз, когда DOM готов в исходном Fiddle. Вам придется запускать его каждый раз при обнаружении события прокрутки, поэтому я завернул ваш условный оператор в событие $(window).scroll().

Я исправил вашу скрипку - http://jsfiddle.net/teddyrised/XN82s/10/


Дополнительные замечания

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

Ваш код требует минимальной модификации:

$(document).ready(function () {
    $('#magicnav').hide();

    // Here we throttle the scroll event to firing once every 250ms
    $(window).scroll($.throttle(250, function() {
        if (isScrolledIntoView('#intro')) {
            $('#magicnav').fadeOut();
        } else {
            $('#magicnav').fadeIn();
        }
    }));
});
  • 0
    Это отличное объяснение и помогло мне учиться, так что СПАСИБО. Первоначально я установил свою функцию с помощью функции $ (window) .scroll (), а мой оператор if был if (isScrolledIntoView ('# intro')), и, поскольку он не работал, я отказался от него (очевидно, глупо! ). Ваше решение работает, за исключением того, что оно срабатывает, пока div 'intro' еще в поле зрения. Проблема была в выражении возврата, мне нужно было сравнивать вершины / впадины, а не вершины / вершины, основания / основания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню