學習筆記:瀑布流+即時搜尋

最近在做網站時,應用了許多在線上課程中學到的技巧,因此想來做一些實作的部分,這次分享的練習是Masonry+Bootstrap+簡易即時搜尋的效果。

在Masonry的部分,參照了Masonry的教學文件中,有一個與Bootstrap做結合的範例,code改寫如下:

//html
<div class="container">
  <div class="grid">
    <div class="grid-sizer col-xs-12 col-md-6 col-lg-3"></div>
    <div class="grid-item col-xs-12 col-md-6 col-lg-3">
      <div class="grid-item-content">...</div>
    </div>
    <div class="grid-item col-xs-4">
      <div class="grid-item col-xs-12 col-md-6 col-lg-3">...</div>
    </div>
    ...
  </div>
</div>
//js
var $grid= $('.grid').masonry({
  itemSelector: '.grid-item',
  columnWidth: '.grid-sizer',
  percentPosition: true,
  horizontalOrder: true //控制div排列的順序
});

本來想要透過lazyload不要讓大量圖片一次載入,導致視覺上的不佳與效能上的低落,但是Masonry似乎跟lazyload好像有那麼一點衝突,因此使用了Masonry官方推薦的plugin:imagesloaded,code如下:

//js
$grid.imagesLoaded().progress( function() {
  $grid.masonry();
});

到這邊為止,Bootstrap+Masonry+imagesload的部分已經處理完成了,接下來進入即時搜尋的部分,這邊我參考了兩個技術文章分享的網誌的文章:OXXOSTUDIOMuki’space,但依照範例,由於codepen的部分js的載入皆在</body>之前,因此我無法將OXXOSTUDIO範例中,讓jQuery去寫入樣式的方式去執行,指令將會是undefined的狀態。

因此這次我們利用Muki大大的範例來做使用,首先我在搜尋框的下方加入了一個style class以便稍後可以透過jQuery寫出樣式。

//html
<div class="search">
    <div class="container">
        <input type="text" class="searching form-control" id="key-in" placeholder="輸入您想搜尋的標題,結果將會即時出現">
   <style id="search-style"></style> //加入此行可讓jQuery寫入樣式
    </div>
</div>

加入了style class之後,就可以來使用即時搜尋的code了:

var that = $(this);
var Search = $("#search-style");
$("#key-in").bind("change paste keyup", function(){
  var value = $(this).val(); //偵測搜尋框中的文字(值)
  if (!value) { 
    Search.html("");
    return;
  }; 
  Search.html('.grid-item:not([data-title*="' + value.toLowerCase() + '"]) {display:none;}');
});
//當搜尋框中之文字符合data-*中的文字時,其他非符合的class全數隱藏

加入這段code 之後,卻發現當我的關鍵字出現符合的結果後,我的結果居然不會因為其他區塊的display:none; 而顯示在最上方,而是固定在原本的位置,因此我們在上方的code的判斷式中,兩種狀況各執行一次masonry的指令,結果如下:

var that = $(this);
var Search = $("#search-style");
$("#key-in").bind("change paste keyup", function(){
  var value = $(this).val();
  if (!value) {
    Search.html("");
    $('.grid').masonry();
    return;
  }; 
  Search.html('.grid-item:not([data-title*="' + value.toLowerCase() + '"]) {display:none;}');
  $('.grid').masonry();
});

這樣,就完成了即時搜尋的部分與瀑布流的結合呈現效果。

本範例引入的js有

//jQuery
https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js
//masonry
https://cdnjs.cloudflare.com/ajax/libs/masonry/4.1.1/masonry.pkgd.min.js
//imagesloaded
https://cdnjs.cloudflare.com/ajax/libs/jquery.imagesloaded/4.1.1/imagesloaded.pkgd.min.js

UI參考:奧格設計資源

技術文章參考:

最後本篇範例請至小弟的codepen觀看:瀑布流即時搜尋測試

Andrew

一個不務正業的前端網頁設計。 讀的是公共行政,不小心踏入金融業; 做的是從小有興趣的網頁設計與開發,卻又應用在網路行銷的工作上。