【練習】瀑布流+即時搜尋

Andrew Su
AndrewStudio
Published in
6 min readApr 21, 2017

最近在做網站時,應用了許多在線上課程中學到的技巧,因此想來做一些實作的部分,這次分享的練習是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有

//jQueryhttps://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js//masonryhttps://cdnjs.cloudflare.com/ajax/libs/masonry/4.1.1/masonry.pkgd.min.js//imagesloadedhttps://cdnjs.cloudflare.com/ajax/libs/jquery.imagesloaded/4.1.1/imagesloaded.pkgd.min.js

UI參考:奧格設計資源

技術文章參考:

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

以上為小弟的拙作,若前輩大大們有其他的想法,請各位指教了。

--

--