Сочетание эффектов аккордеонного меню Javascript с фильтруемой фотогалереей jQuery - PullRequest
2 голосов
/ 25 февраля 2012

Я создал концепцию пользовательского интерфейса для веб-сайта, которая требует сочетания двух разных источников кода, но я не знаю, как правильно их собрать, поскольку я не очень хорошо разбираюсь в javascript.

Я хочу объединить это меню аккордеона Javascript с этим плагином отфильтрованной фотогалереи . Вот где это становится сложным.

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

То, что происходит сейчас, когда вы нажимаете на изображение, это то, что я хочу изменить. Вместо того, чтобы щелкнуть по изображению, чтобы увидеть увеличенную версию лайтбокса (используя PrettyPhoto), я хочу полностью исключить PrettyPhoto и использовать меню javascript для раскрытия под фотографией, чтобы отобразить простой текстовый список вкусов. Если пользователь снова щелкнет изображение, меню вернется на фотографию и исчезнет.

Есть ли способ скрыть мои аккордеонные меню внутри каждого элемента изображения и при этом иметь возможность фильтровать результаты со всеми анимациями и без сбоев? А при нажатии на изображение в меню будут отображаться ароматы поверх окружающих изображений? (Я не хочу, чтобы все было относительно позиционировано, потому что раскрывающееся меню будет разбрасывать все вокруг, если я не буду держать результаты в вертикальном положении, а не в сетке.)

Спасибо за всю вашу помощь заранее. Это действительно меня озадачило, потому что у меня нет учебников или поддержки.

Ответы [ 2 ]

1 голос
/ 25 февраля 2012

Ну, я не использовал плагин quicksand, но нужный вам эффект аккордеона не должен зависеть от функциональности фильтра галереи. (опять же, не используя его, я не могу сказать точно)

Сначала я бы бросил базу кода для аккордеонного меню и создал бы свою собственную выпадающую функциональность. После проверки dom на странице галереи я бы создал элемент div в качестве следующего элемента после метки привязки на изображении, установив для него значение «Нет». Добавьте событие переключения jquery к элементу привязки, а затем добавьте функциональность slideDown / slideUp к событию переключения. (или метод slideToggle для события click, за исключением кода, делает то же самое). Если вы не хотите, чтобы одновременно открывалось более одного раскрывающегося меню, используйте событие щелчка, чтобы скрыть все раскрывающиеся списки, а затем показать текущий раскрывающийся список.

Каждый элемент li должен иметь относительную позицию (что прекрасно без каких-либо свойств top, left, bottom, right), и каждый элемент div будет иметь абсолютную позицию. Думайте об этом как о выпадающем меню навигации.

Если добавление скрытого элемента div к элементу li нарушает функциональность фильтра, вы можете попробовать создать объект json для каждого изображения с соответствующими данными слайд-апа и использовать функцию для вставки данных в динамически создаваемый элемент div.

* РЕДАКТИРОВАТЬ: Должно быть, я пропустил его при первом прочтении, но что вы имеете в виду: "И при нажатии на изображение в меню будут отображаться ароматы поверх окружающих изображений?"

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

* Редактировать 2: Чтобы ответить на ваш вопрос ..

$('a.somelink').toggle(function() {
    $(this).next().slideDown(200);
}, function() {
    $(this).next().slideUp(200);
});

Или

$('a.somelink').click(function() {
    $(this).next().slideToggle(200);
    return false;
});

Эти два подойдут, если вы не возражаете против одновременного открытия более одного раскрывающегося списка, но если вам нужен только один открытый за раз, попробуйте следующее:

$('a.somelink').click(function() {
    if ($(this).hasClass('active') == true ) {
        $(this).next().slideUp(200);
        $('a').removeClass('active');
    } else {
        $('a.somelink').removeClass('active');
        $('.sub_div').slideUp(200);
        $(this).addClass('active').next().slideDown(200);
    }
    return false;
});

* new Edit: ваши элементы li должны выглядеть так:

<li class="item">
   <a href="#"><img src="thumbnail.jpg" /></a>
   <div class="drop_down_content">Content in Drop down</div>
</li>

Этот макет не должен меняться даже после нажатия кнопки фильтра

0 голосов
/ 02 марта 2012

Во-первых, вот как каждый <li> выглядит в портфеле.

    <li class="item" data-id="id-1" data-type="hannah">
        <a href="#"><img src="images/hannah_yg_thumb.jpg" width="210" height="130" alt="Yulia Gorbachenko, Hannah 1" /></a>
        <div class="drop">International<br />Regional<br />International<br />
        </div>
    </li>

Тогда вот .js, который поставляется с плагином галереи.

$(document).ready(function(){

    // Blur images on mouse over
    $(".portfolio a").hover( function(){ 
        $(this).children("img").animate({ opacity: 0.75 }, "fast"); 
    }, function(){ 
        $(this).children("img").animate({ opacity: 1.0 }, "slow"); 
    }); 


    // Clone portfolio items to get a second collection for Quicksand plugin
    var $portfolioClone = $(".portfolio").clone();

    // Attempt to call Quicksand on every click event handler
    $(".filter a").click(function(e){

        $(".filter li").removeClass("current"); 

        // Get the class attribute value of the clicked link
        var $filterClass = $(this).parent().attr("class");

        if ( $filterClass == "all" ) {
            var $filteredPortfolio = $portfolioClone.find("li");
        } else {
            var $filteredPortfolio = $portfolioClone.find("li[data-type~=" + $filterClass + "]");
        }

        // Call quicksand
        $(".portfolio").quicksand( $filteredPortfolio, { 
            duration: 800, 
            easing: 'easeInOutQuad' 
        }, function(){

            // Blur newly cloned portfolio items on mouse over and apply prettyPhoto
            $(".portfolio a").hover( function(){ 
                $(this).children("img").animate({ opacity: 0.75 }, "fast"); 
            }, function(){ 
                $(this).children("img").animate({ opacity: 1.0 }, "slow"); 
            }); 

            $(".portfolio a[rel^='prettyPhoto']").prettyPhoto({
                theme:'light_square', 
                autoplay_slideshow: false, 
                overlay_gallery: false, 
                show_title: false
            });
        });


        $(this).parent().addClass("current");

        // Prevent the browser jump to the link anchor
        e.preventDefault();
    })
});

(Извините за ответв «ответ», но я не мог отформатировать код иначе ..)

...