Изотоп JQuery - сортировка, макет И несколько фильтров - PullRequest
3 голосов
/ 25 января 2012

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

    <div class="option-combo">
  <h2>Filter:</h2>
  <ul id="filter" class="option-set clearfix" data-option-key="filter">
    <li><a href="#show-all" data-option-value="*" class="selected">show all</a></li>
    <li><a href="#elements" data-option-value=".element:not(.feature)">elements</a></li>
    <li><a href="#features" data-option-value=".feature">features</a></li>
    <li><a href="#examples" data-option-value=".example">examples</a></li>
  </ul>
</div>

<div class="option-combo">
  <h2>Sort:</h2>
  <ul id="sort" class="option-set clearfix" data-option-key="sortBy">
  <li><a href="#sortBy=original-order" data-option-value="original-order" data>original-order</a></li>
  <li><a href="#sortBy=name" data-option-value="name">name</a></li>
  <li><a href="#sortBy=year" data-option-value="year" class="selected">year</a></li>
  <li><a href="#sortBy=size" data-option-value="size">size</a></li>
  <li><a href="#sortBy=random" data-option-value="random">random</a></li>
  </ul>
</div>

<div class="option-combo">
  <h2>Layout: </h2>
  <ul id="layouts" class="option-set clearfix" data-option-key="layoutMode">
    <li><a href="#masonry" data-option-value="masonry" class="selected">masonry</a></li>
    <li><a href="#fitRows" data-option-value="fitRows">fitRows</a></li>
    <li><a href="#straightDown" data-option-value="straightDown">straightDown</a></li>
  </ul>
</div>

И это javascript:

$(function(){

  var $container = $('#container');

  $container.isotope({
    masonry: {
      columnWidth: 70
    },
    sortBy: 'year',
    sortAscending : false,
    getSortData: {
      name : function ( $elem ) {
        return $elem.find('.name').text();
      },
      size : function ( $elem ) {
        return parseInt( $elem.find('.Size').text().replace( /,/g, ''), 10 );
      },
      year : function ( $elem ) {
        return parseInt( $elem.find('.year').text().replace( /,/g, ''), 10 );
      }
    }
  });


  var $optionSets = $('#options .option-set'),
      $optionLinks = $optionSets.find('a');

  $optionLinks.click(function(){
    var $this = $(this);
    // don't proceed if already selected
    if ( $this.hasClass('selected') ) {
      return false;
    }
    var $optionSet = $this.parents('.option-set');
    $optionSet.find('.selected').removeClass('selected');
    $this.addClass('selected');

    // make option object dynamically, i.e. { filter: '.my-filter-class' }
    var options = {},
        key = $optionSet.attr('data-option-key'),
        value = $this.attr('data-option-value');
    // parse 'false' as false boolean
    value = value === 'false' ? false : value;
    options[ key ] = value;
    if ( key === 'layoutMode' && typeof changeLayoutMode === 'function' ) {
      // changes in layout modes need extra logic
      changeLayoutMode( $this, options )
    } else {
      // otherwise, apply new options
      $container.isotope( options );
    }

    return false;
  });

});

Ответы [ 2 ]

1 голос
/ 16 октября 2012

Несколько фильтров, как я понимаю, означают элементы выбора, которые имеют несколько свойств.

Так, например, если у нас есть следующие изотопные элементы

<div class="isotope-item green big"></div>
<div class="isotope-item green small"></div>
<div class="isotope-item red big"></div>
<div class="isotope-item red small"></div>
<div class="isotope-item yellow big"></div>

Если вы хотите использовать в качестве фильтра все элементы, которые

  • красный и большой
  • красный ИЛИ большой

тогда вы можете использовать тот же JavaScript, что и у вас:

<h2>Filter:</h2>
<ul id="filter" class="option-set clearfix" data-option-key="filter">
   <li><a data-option-value="*" class="selected">Show All</a></li>
   <li><a data-option-value=".red">Show Red Elements</a></li>
   <li><a data-option-value=".big">Show Big Elements</a></li>
   <li><a data-option-value=".red, big">Show Elements Red OR Big</a></li>
   <li><a data-option-value=".red.big">Show Elements Red AND Big</a></li>
</ul>

Фильтр работает с простым селектором jQuery. Отображается все, что соответствует выбору, остальное скрыто.

0 голосов
/ 09 сентября 2013

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

...