2015-10-26 267 views
2

任何人都可以幫我梳理jQuery同位素過濾器請。在示例(CodePen鏈接)中,頂部有按鈕過濾器,下面還有一個文本搜索過濾器。每個單獨工作,但如何調整,以便您可以使用兩種過濾器類型在一起?梳理jQuery同位素過濾器

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

感謝

HTML

<div class="button-group filter-button-group"> 
    <button data-filter="*">show all</button> 
    <button data-filter=".metal">metal</button> 
    <button data-filter=".transition">transition</button> 
    <button data-filter=".alkali, .alkaline-earth">alkali & alkaline-earth</button> 
    <button data-filter=":not(.transition)">not transition</button> 
    <button data-filter=".metal:not(.transition)">metal but not transition</button> 
</div> 

<p><input type="text" class="quicksearch" placeholder="Search" /></p> 

<div class="grid"> 
    <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Mercury</h3> 
    <p class="symbol">Hg</p> 
    <p class="number">80</p> 
    <p class="weight">200.59</p> 
    </div> 
    <div class="element-item metalloid " data-category="metalloid"> 
    <h3 class="name">Tellurium</h3> 
    <p class="symbol">Te</p> 
    <p class="number">52</p> 
    <p class="weight">127.6</p> 
    </div> 
    <div class="element-item post-transition metal " data-category="post-transition"> 
    <h3 class="name">Bismuth</h3> 
    <p class="symbol">Bi</p> 
    <p class="number">83</p> 
    <p class="weight">208.980</p> 
    </div> 
    <div class="element-item post-transition metal " data-category="post-transition"> 
    <h3 class="name">Lead</h3> 
    <p class="symbol">Pb</p> 
    <p class="number">82</p> 
    <p class="weight">207.2</p> 
    </div> 
    <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Gold</h3> 
    <p class="symbol">Au</p> 
    <p class="number">79</p> 
    <p class="weight">196.967</p> 
    </div> 
    <div class="element-item alkali metal " data-category="alkali"> 
    <h3 class="name">Potassium</h3> 
    <p class="symbol">K</p> 
    <p class="number">19</p> 
    <p class="weight">39.0983</p> 
    </div> 
    <div class="element-item alkali metal " data-category="alkali"> 
    <h3 class="name">Sodium</h3> 
    <p class="symbol">Na</p> 
    <p class="number">11</p> 
    <p class="weight">22.99</p> 
    </div> 
    <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Cadmium</h3> 
    <p class="symbol">Cd</p> 
    <p class="number">48</p> 
    <p class="weight">112.411</p> 
    </div> 
    <div class="element-item alkaline-earth metal " data-category="alkaline-earth"> 
    <h3 class="name">Calcium</h3> 
    <p class="symbol">Ca</p> 
    <p class="number">20</p> 
    <p class="weight">40.078</p> 
    </div> 
    <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Rhenium</h3> 
    <p class="symbol">Re</p> 
    <p class="number">75</p> 
    <p class="weight">186.207</p> 
    </div> 
    <div class="element-item post-transition metal " data-category="post-transition"> 
    <h3 class="name">Thallium</h3> 
    <p class="symbol">Tl</p> 
    <p class="number">81</p> 
    <p class="weight">204.383</p> 
    </div> 
    <div class="element-item metalloid " data-category="metalloid"> 
    <h3 class="name">Antimony</h3> 
    <p class="symbol">Sb</p> 
    <p class="number">51</p> 
    <p class="weight">121.76</p> 
    </div> 
    <div class="element-item transition metal " data-category="transition"> 
    <h3 class="name">Cobalt</h3> 
    <p class="symbol">Co</p> 
    <p class="number">27</p> 
    <p class="weight">58.933</p> 
    </div> 
    <div class="element-item lanthanoid metal inner-transition " data-category="lanthanoid"> 
    <h3 class="name">Ytterbium</h3> 
    <p class="symbol">Yb</p> 
    <p class="number">70</p> 
    <p class="weight">173.054</p> 
    </div> 
    <div class="element-item noble-gas nonmetal " data-category="noble-gas"> 
    <h3 class="name">Argon</h3> 
    <p class="symbol">Ar</p> 
    <p class="number">18</p> 
    <p class="weight">39.948</p> 
    </div> 
    <div class="element-item diatomic nonmetal " data-category="diatomic"> 
    <h3 class="name">Nitrogen</h3> 
    <p class="symbol">N</p> 
    <p class="number">7</p> 
    <p class="weight">14.007</p> 
    </div> 
    <div class="element-item actinoid metal inner-transition " data-category="actinoid"> 
    <h3 class="name">Uranium</h3> 
    <p class="symbol">U</p> 
    <p class="number">92</p> 
    <p class="weight">238.029</p> 
    </div> 
    <div class="element-item actinoid metal inner-transition " data-category="actinoid"> 
    <h3 class="name">Plutonium</h3> 
    <p class="symbol">Pu</p> 
    <p class="number">94</p> 
    <p class="weight">(244)</p> 
    </div> 
</div> 

CSS

* { 
    -webkit-box-sizing: border-box; 
    -moz-box-sizing: border-box; 
      box-sizing: border-box; 
} 

body { 
    font-family: sans-serif; 
} 

/* ---- input ---- */ 

input[type="text"] { 
    font-size: 20px; 
} 

/* ---- isotope ---- */ 

.grid { 
    /*border: 1px solid #333;*/ 
} 

/* clear fix */ 
.grid:after { 
    content: ''; 
    display: block; 
    clear: both; 
} 

/* ---- .element-item ---- */ 

.element-item { 
    position: relative; 
    float: left; 
    width: 100%; 
    height: 100px; 
    margin-bottom: 5px; 
    /*padding: 10px;*/ 
    background: #888; 
    color: #262524; 
} 

.element-item > * { 
    margin: 0; 
    padding: 0; 
} 

.element-item .name { 
    position: absolute; 

    left: 10px; 
    top: 60px; 
    text-transform: none; 
    letter-spacing: 0; 
    font-size: 12px; 
    font-weight: normal; 
} 

.element-item .symbol { 
    position: absolute; 
    left: 10px; 
    top: 0px; 
    font-size: 42px; 
    font-weight: bold; 
    color: white; 
} 

.element-item .number { 
    position: absolute; 
    right: 8px; 
    top: 5px; 
} 

.element-item .weight { 
    position: absolute; 
    left: 10px; 
    top: 76px; 
    font-size: 12px; 
} 

.element-item.alkali   { background: #F00; background: hsl( 0, 100%, 50%); } 
.element-item.alkaline-earth { background: #F80; background: hsl( 36, 100%, 50%); } 
.element-item.lanthanoid  { background: #FF0; background: hsl( 72, 80%, 50%); } 
.element-item.actinoid  { background: #0F0; background: hsl(108, 100%, 50%); } 
.element-item.transition  { background: #0F8; background: hsl(144, 100%, 50%); } 
.element-item.post-transition { background: #0FF; background: hsl(180, 100%, 50%); } 
.element-item.metalloid  { background: #08F; background: hsl(216, 100%, 50%); } 
.element-item.diatomic  { background: #00F; background: hsl(252, 100%, 50%); } 
.element-item.halogen   { background: #F0F; background: hsl(288, 100%, 50%); } 
.element-item.noble-gas { 
    background: #F08; 
    background: hsl(324, 100%, 50%); 
} 

JS

$(function() { 
    // quick search regex 
    var qsRegex; 

    // init Isotope 
    var $grid = $('.grid').isotope({ 
    itemSelector: '.element-item', 
    layoutMode: 'fitRows', 
    filter: function() { 
     return qsRegex ? $(this).text().match(qsRegex) : true; 
    } 
    }); 


    // use value of search field to filter 
    var $quicksearch = $('.quicksearch').keyup(debounce(function() { 
    qsRegex = new RegExp($quicksearch.val(), 'gi'); 
    $grid.isotope(); 
    }, 200)); 

}); 

// debounce so filtering doesn't happen every millisecond 
function debounce(fn, threshold) { 
    var timeout; 
    return function debounced() { 
    if (timeout) { 
     clearTimeout(timeout); 
    } 
    function delayed() { 
     fn(); 
     timeout = null; 
    } 
    timeout = setTimeout(delayed, threshold || 100); 
    } 
} 


// filter items on button click 
$('.filter-button-group').on('click', 'button', function() { 
    var filterValue = $(this).attr('data-filter'); 
    $('.grid').isotope({ filter: filterValue }); 
}); 

回答

0

您需要使用buttonFilter變量類似這樣的代碼示例:

// quick search regex 
var qsRegex; 
var buttonFilter; 

// init Isotope 
var $container = $('.isotope').isotope({ 
    itemSelector: '.element-item', 
    layoutMode: 'fitRows', 
    filter: function() { 
    var $this = $(this); 
    var searchResult = qsRegex ? $this.text().match(qsRegex) : true; 
    var buttonResult = buttonFilter ? $this.is(buttonFilter) : true; 
    return searchResult && buttonResult; 
    } 
}); 

$('#filters').on('click', 'button', function() { 
    buttonFilter = $(this).attr('data-filter'); 
    $container.isotope(); 
}); 

// use value of search field to filter 
var $quicksearch = $('#quicksearch').keyup(debounce(function() { 
    qsRegex = new RegExp($quicksearch.val(), 'gi'); 
    $container.isotope(); 
})); 

Example on CodePen

+0

這是太棒了!非常感謝。 – Rob