2015-01-25 2 views
0

У меня есть 2 раздела, каждый из этих разделов имеет фильтр изображений, однако, когда я нажимаю кнопку, чтобы отфильтровать изображения, скажем, из фильтра 2, он также скрывает все изображения из фильтр 1. Я использую: данные фильтр = «categoryofimages.»jQuery - Несколько фильтров изображений на одной странице

Вы можете видеть проблему непосредственно на веб-сайте:

nimvoker.com

в разделе „достижений“ является первый фильтр и «искусство & навыки проектирования» - это второй.

Некоторые пути к файлам неверны из-за формата (jpg, png и т. Д.), Но что он по-прежнему отображает символ «пропавшего изображения», поэтому это не имеет значения для решения проблемы.

Оба фильтра должны работать независимо.

Вот пример 2 фильтров делает конфликт:

http://codepen.io/anon/pen/NPvdBw

здесь является ЯШ:

$(function(){ 
// Filter portfolio 
$(window).load(function(){ 
    var $container = $('.popup-portfolio'); 

    $container.css({visibility:'visible'}); 

    var isotopePortfolio = function(filter){ 
     $container.isotope({ 
      filter: filter, 
      animationOptions: { 
       duration: 750, 
       easing: 'linear', 
       queue: false 
      }, 
      masonry: { 
       isFitWidth: true, 
       isResizable: true, 
       gutter: 15 
      } 
     }); 
    }; 

    isotopePortfolio('*'); 

    $('.filter-portfolio a').click(function(e){ 
     e.preventDefault(); 

     $('.filter-portfolio li').removeClass('active'); 

     $('.filter-portfolio a').removeClass('disabled'); 

     $(this).parent('li').addClass('active'); 

     $(this).addClass('disabled'); 

     var selector = $(this).attr('data-filter'); 

     isotopePortfolio(selector); 
    }); 
}); 

// Only animate elements when using non-mobile devices  
if (jQuery.browser.mobile === false) 
{ 
    $('.portfolio-item > .inner-content').each(function(i) 
    {    
     var element = $(this), 
     itemsDelay = (isNaN($(this).data('animation-delay')) ? 50 : $(this).data('animation-delay')); 
     element.css('opacity', 0).one('inview', function(isInView) { 
      if (isInView) 
      { 
       setTimeout(function(){ 
        element.addClass('animated fadeInUp').css('opacity', 1); 
       } , itemsDelay * i); 
      } 
     }); 
    }); 
} 

$('.popup-portfolio').magnificPopup({ 
    delegate: 'a', 
    type: 'image', 
    fixedContentPos: false, 
    gallery: { 
     enabled: true, 
     preload: [0,2], 
     navigateByImgClick: true, 
     arrowMarkup: '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>', 
     tPrev: 'Previous (Left arrow key)', 
     tNext: 'Next (Right arrow key)' 
    } 
}); 

});

+0

Я открыт для других решений –

+0

Создайте [MCVE] (http://stackoverflow.com/help/mcve) вместо ссылки на ваш живой сайт. –

+0

здесь http://codepen.io/anon/pen/NPvdBw –

ответ

1

У вас есть эта строка в коде:

var $container = $('.isotope') 

Это означает, что $container переменные будет содержать все .isotope дивов (два в данном случае). Теперь в обработчиках фильтра следующая строка:

$container.isotope({ filter: filterValue }); 

применяет фильтр к обоим элементам.

Решение: использовать JQuery к идентификации .button-group которая была нажата и применить фильтр на соответствующий .isotope:

// generalized function to handle toggle checked and 
// apply filter functions for all button groups 
$('.button-group').on('click', 'button', function() { 
    var $buttonGroup = $(this).closest(".button-group"); 
    // toggle checked 
    $buttonGroup.find('.is-checked').removeClass('is-checked'); 
    $(this).addClass('is-checked'); 
    // apply filter 
    var filterValue = $(this).attr('data-filter'); 
    filterValue = filterFns[filterValue] || filterValue; 
    $buttonGroup.next(".isotope").isotope({ filter: filterValue }); 
}); 
1

То есть много кода, чтобы посмотреть, но по крайней мере, дать другие некоторые подробности файл http://nimvoker.com/assets/js/features/portfolio.js имеет следующее:

var isotopePortfolio = function(filter){ 
     $container.isotope({ 
      filter: filter, 
      animationOptions: { 
       duration: 750, 
       easing: 'linear', 
       queue: false 
      }, 
      masonry: { 
       isFitWidth: true, 
       isResizable: true, 
       gutter: 15 
      } 
     }); 
    }; 
    $('.filter-portfolio a').click(function(e){ 
     e.preventDefault(); 

     $('.filter-portfolio li').removeClass('active'); 

     $('.filter-portfolio a').removeClass('disabled'); 

     $(this).parent('li').addClass('active'); 

     $(this).addClass('disabled'); 

     var selector = $(this).attr('data-filter'); 

     isotopePortfolio(selector); 
    }); 

И это замечательно, но проблема в том, как ваши фильтры # RJ- Портфолио3 и # rj-портфолио имеют одинаковые классы.

Если я правильно читать это у вас есть возможность добавить селектор текста в данном фильтре, так что вы можете захотеть, чтобы попытаться быть немного более точным

И сделать ваши кнопки фильтра, как:

<a href="#rj-portfolio3" data-filter="#rj-portfolio3 .lifedrawing" class="btn btn-custom">LifeDrawing</a> 

Трудно проверить с таким количеством кода и без скрипки, поэтому, пожалуйста, извините меня, если я уйду с базы.

Edit: снова Посмотрел, то # т-portfolio3 идентификатор путь выше $container в дереве, так что вам нужно сделать немного больше работы ... попробовать что-то вроде

<a href="#rj-portfolio3" data-filter=".lifedrawing:not(.achievements)" class="btn btn-custom">LifeDrawing</a> 

и т.д. и т.п. для всех ваших кнопок, то для всех ваших изображений добавьте классы «достижения» и «искусство» для каждого соответствующего миниатюры. Согласно http://isotope.metafizzy.co/filtering.html, это должно работать лучше .... снова жаль трудно проверить, нет скрипки, слишком много кода.

+0

put: not (.achievements) скроет все с помощью «достижений» класса, поэтому он не делает различий, должен быть способ иметь независимо функцию фильтра –

+0

@ Тогда BobXplosion, как насчет 'LifeDrawing' показывая как живые игры, так и все достижения? –

+0

проблема заключается в том, что пользователи могут просматривать первую галерею, а при просмотре 2-го, когда они нажимают на второй фильтр, окно просмотра будет оставаться высоким, если изображения, добавленные в 1-й фильтр (потому что изображения расширили страницу), или оставаться в стороне, если они удалены (потому что удаление изображений занимает меньше места) –

0

Это происходит потому, что вы используете тот же ID/CLASS.

Пример:

var $container = $('.isotope').isotope({ 
    itemSelector: '.element-item', 
    layoutMode: 'fitRows' 
}); 

, который используется на #filters и # filters2

$('#filters').on('click', 'button', function() { 
var filterValue = $(this).attr('data-filter'); 
// use filterFn if matches value 
filterValue = filterFns[ filterValue ] || filterValue; 
$container.isotope({ filter: filterValue }); 
}); 
$('#filters2').on('click', 'button', function() { 
var filterValue = $(this).attr('data-filter'); 
// use filterFn if matches value 
filterValue = filterFns[ filterValue ] || filterValue; 
$container.isotope({ filter: filterValue }); 
}); 

Попробуйте что-то вроде этого.

На этой HTML добавить уникальный идентификатор 'ID = "уникальный-идентификатор-1"'

<div class="filter-portfolio"> 
    <ul id="unique-id-1" class="list-unstyled"> 
    <li class="active page-scroll"> <a href="#rj-portfolio" data-filter="*" class="btn btn-custom disabled">All</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio" data-filter=".college" class="btn btn-custom">College</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio" data-filter=".highschool" class="btn btn-custom">Highschool</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio" data-filter=".childhood" class="btn btn-custom">Childhood</a> </li> 
    </ul> 
</div> 
<div id="unique-id-1-portfolio" class="popup-portfolio three-columns"> 
    <div class="portfolio-item grow illustration calligraphy"> 
    <div class="inner-content"> 
     <div class="portfolio-content"> 
     <div class="portfolio-detail"> <a href="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-001.jpg" title="Hover Effect 1 - Grow"> 
      <div class="portfolio-text"> 
      <h4>The Title</h4> 
      <p>Subtitle</p> 
      </div> 
      </a> </div> 
     </div> 
     <img src="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-001.jpg" alt="" class="img-responsive"/> </div> 
    </div> 
    <div class="portfolio-item grow illustration calligraphy"> 
    <div class="inner-content"> 
     <div class="portfolio-content"> 
     <div class="portfolio-detail"> <a href="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-002.jpg" title="Hover Effect 1 - Grow"> 
      <div class="portfolio-text"> 
      <h4>The Title</h4> 
      <p>Subtitle</p> 
      </div> 
      </a> </div> 
     </div> 
     <img src="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-002.jpg" alt="" class="img-responsive"/> </div> 
    </div> 
</div> 

Используйте это:

$('#unique-id-1 li a').on('click', 'button', function() { 
    var filterValue = $(this).attr('data-filter'); 
    filterValue = filterFns[ filterValue ] || filterValue; 
    $('#unique-id-1-portfolio').isotope({ filter: filterValue }); 
}); 

и для этого

<div class="filter-portfolio"> 
    <ul id="unique-id-2" class="list-unstyled"> 
    <li class="active page-scroll"> <a href="#rj-portfolio3" data-filter="*" class="btn btn-custom disabled">All</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".calligraphy" class="btn btn-custom">Calligraphy</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".lifedrawing" class="btn btn-custom">LifeDrawing</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".logodesign" class="btn btn-custom">LogoDesign</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".manga" class="btn btn-custom">Manga</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".marketing" class="btn btn-custom">Marketing</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".miscart" class="btn btn-custom">Miscart</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".technical" class="btn btn-custom">Technical</a> </li> 
    <li class="page-scroll"> <a href="#rj-portfolio3" data-filter=".uidesign" class="btn btn-custom">UIdesign</a> </li> 
    </ul> 
</div> 
<div id="unique-id-2-portfolio" class="popup-portfolio three-columns"> 
    <div class="portfolio-item grow illustration calligraphy"> 
    <div class="inner-content"> 
     <div class="portfolio-content"> 
     <div class="portfolio-detail"> <a href="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-001.jpg" title="Hover Effect 1 - Grow"> 
      <div class="portfolio-text"> 
      <h4>The Title</h4> 
      <p>Subtitle</p> 
      </div> 
      </a> </div> 
     </div> 
     <img src="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-001.jpg" alt="" class="img-responsive"/> </div> 
    </div> 
    <div class="portfolio-item grow illustration calligraphy"> 
    <div class="inner-content"> 
     <div class="portfolio-content"> 
     <div class="portfolio-detail"> <a href="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-002.jpg" title="Hover Effect 1 - Grow"> 
      <div class="portfolio-text"> 
      <h4>The Title</h4> 
      <p>Subtitle</p> 
      </div> 
      </a> </div> 
     </div> 
     <img src="../../assets/img/rj-portfolio/artanddesign/calligraphy/calligraphy-sample-002.jpg" alt="" class="img-responsive"/> </div> 
    </div> 
</div> 

использования это:

$('#unique-id-2 li a').on('click', 'button', function() { 
    var filterValue = $(this).attr('data-filter'); 
    filterValue = filterFns[ filterValue ] || filterValue; 
    $('#unique-id-2-portfolio').isotope({ filter: filterValue }); 
}); 

Надеется, что это поможет бро ..

Смежные вопросы