[jQuery Masonry]を使う際、Webkit系のブラウザ(Safari、Chrome)によっては、読み込みの際にボックスが重なり、初動では意図したように表示されないケースがあります。
巷のブログでは、その不具合を解決するために「<img>要素に[width][height]属性をそれぞれ記述しておけば大丈夫」という記事を見かけます。
しかし実際には、その方法では問題を解決しきれません。
そこでお勧めするのは、同じjQueryプラグインの[imagesLoaded]を併用するワザです。
[imagesLoaded]を使うと、画像を表示する際、先にデータを完全に読み込み、読み込みが完了した後に任意の処理を実行できるようになります。
この特性を利用して、[Masonry]側の計算処理が完全に終了してからデータの表示を始めるようにすることで、ページ読み込み時にレイアウトが崩れる既知の問題を解決しよう、というのがこの方法の狙いです。
ここでは、[Masonry]のほうは既にインストールされている前提で、追加で[imagesLoaded]を導入する方法を紹介します。
ちなみに[Masonry]の使用に関しては以下の記事を参照ください。
とりあえず[imagesLoaded]をダウンロードします。
ダウンロード:imagesLoaded
[jQuery]本体と[Masonry]も合わせて<head>〜</head>
内に読み込みますが、このときエラーがないように、念のために各jQueryの読み込み順も留意します。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script> <script src="/js/jquery.masonry.min.js"></script> <script src="/js/jquery.imagesloaded.min.js"></script>
これまでの Masonry の設定は一旦破棄して、以下のコードを記述。
これが今回のテーマの肝になります。
$(function(){ var $container = $('#masonry'); $container.imagesLoaded(function(){ $container.masonry({ itemSelector: '.item', isFitWidth: true, isAnimated: true }); }); });
エラーのあったブラウザで表示を試してみると、見事に不具合が解消されているのを確認できるはずです。