Masonry.js では gutter で余白を決めたりできますが、SP と PC で別々に設定する方法がわからなかったので、設定したビューポートを越えた時点でオプションを設定し直す方法です。
webpack を使っているので、最初の二行で読み込みを行ってますが普通に<script src="***">
でhtmlファイルに読み込んでる場合は取り除いてください。
コード
HTML
<ul class="masonry">
<li class="masonry-item"><img src="...">
<li class="masonry-item"><img src="...">
<li class="masonry-item"><img src="...">
</ul>
JS
import $ from 'jquery'
import Masonry from 'masonry-layout';
// ブレイクポイント
BREAK_POINT_MAX_SP = 736;
// selector
const list = '.masonry';
const item = '.masonry-item';
// viewport threshold
let threshold = '';
let thresholdBefore = '';
// masonry
let msnry = '';
let msnry_options = {
itemSelector: item,
}
$(window).on('load resize', function(){
thresholdBefore = threshold;
threshold = BREAK_POINT_MAX_SP < $(this).width() ? 'pc' : 'sp';
// is SP
if (threshold === 'sp') {
msnry_options.gutter = 5;
// is PC
} else {
msnry_options.gutter = 10;
}
// If threshold is changed (or when window loaded), Dispatch an event
if (thresholdBefore !== threshold) {
$(window).trigger('changeBreakpoint');
}
});
$(window).on('changeBreakpoint', function(){
// If Masonry exists, Destory it
if (msnry !== '') {
msnry.destroy();
}
// Initialize Masonry
msnry = new Masonry(list, msnry_options);
});
変数
BREAK_POINT_MAX_SP
SP用のブレイクポイントを設定list
masonry を実行する要素item
masonry を実行する要素のアイテムmsnry_options
PC/SP 共通で設定するオプション。公式サイトを参照。
windows の width を監視して、あらかじめ決めておいたブレイクポイントに達したら瞬間のみイベントを発火させています。
PC と SP でそれぞれ設定を変更する
例として、gutter を変更しています。SP なら 10、PC なら 30。量が多い場合はまとめて定義して結合などした方が良いかもしれません。
// is SP
if (threshold === 'sp') {
msnry_options.gutter = 10;
// msnry_options.なんかのオプション = なんか;
// is PC
} else {
msnry_options.gutter = 30;
}
全部 jQuery にするとき
もしセレクタも jQuery を使うときは、下記を変更します。
msnry.destroy();
↓
msnry.masonry('destroy');
msnry = new Masonry(list, msnry_options);
↓
msnry = $(list).masonry(msnry_options);