Google画像検索のようなレイアウトで画像を並べるCSSをいくつか紹介します。
※今回のCSSでは実装の容易さを優先したため、画像はトリミングが発生します。
基本のhtml
以下のhtmlを元にそれぞれCSSを適応させます。実際のレイアウトはCodepenで確認とします。 画像については私のリポジトリーから適当に指定しています。
<div class="gallery">
<div class="item"><img src="https://afternoon20.github.io/test-images/img01.jpg" alt="img01"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img02.jpg" alt="img02"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img03.jpg" alt="img03"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img04.jpg" alt="img04"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img05.jpg" alt="img05"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img06.jpg" alt="img06"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img07.jpg" alt="img07"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img08.jpg" alt="img08"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img09.jpg" alt="img09"></div>
<div class="item"><img src="https://afternoon20.github.io/test-images/img10.jpg" alt="img10"></div>
</div>
flexboxを使った実装
画像の比率を維持したまま、行ごとに高さを揃えるレイアウトです。Google画像検索に最も近い挙動をします。
行の右端まで隙間なく埋まり、各行で画像の枚数が可変になります。
※object-fit: coverを使用するため、指定した高さに合わせる際に画像の一部がトリミング(見切れ)されます。
.gallery {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.item {
height: 200px;
flex-grow: 1;
}
.item img {
width: 100%;
height: 100%;
object-fit: cover;
}
grid: masonryを使う
高さがバラバラな画像を、隙間を埋めるようにレンガ状に配置します。ただし、2025年現在、主要ブラウザの標準設定では動作しないので、次に紹介するJavaScriptライブラリを使った方法で実現可能です。
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-template-rows: masonry;
gap: 10px;
}
※スタイルが適用されない
Masonry.jsを使ったレンガ状レイアウト
JavaScriptライブラリを使用して、画像の高さを維持したまま隙間なく並べます。画像を一切トリミングせず、パズルを埋めるように配置できます。
.gallery {
width: 100%;
}
.item {
width: 19%;
margin-bottom: 10px;
}
.item img {
width: 100%;
height: auto;
display: block;
}
window.onload = () => {
new Masonry('.gallery', {
itemSelector: '.item',
columnWidth: '.item',
gutter: 10,
percentPosition: true
});
};
Googleのレイアウトを忠実に再現する場合
もし画像をトリミングせずに忠実に再現をするなら、以下のJavaScriptによる計算が必要になります。
- 画像の比率(アスペクト比)の取得: 全ての画像の元サイズを把握する
- 1行に入る画像の比率を合計し、画面幅に合わせてその行の最適な高さを数ピクセル単位で算出・上書き
- ウィンドウ幅が変わるたびに、再計算して画像の並び順や高さを入れ替える
CSSのFlexboxを使えば、数行のコードでGoogle画像検索風の隙間のないレイアウトが実現できます。
手軽にタイル状に並べたいならflexbox、画像の形を一切変えたくないならMasonry.js、といったように用途に合わせて使い分けてみてください。