Hugoで実践!Gatsby風ブログカードレイアウトを完全再現するカスタマイズ手順

Hugoで実践!Gatsby風ブログカードレイアウトを完全再現するカスタマイズ手順

Hugoサイトで、Gatsby製ブログみたいな「カード型グリッドレイアウト(3x4)」を作りたくなったことはないか?
トップページで12記事(画像・タグ・抜粋・著者・読了時間・投稿日・更新日付き)が3列4行でバッチリ並ぶ、あのUX…
この記事では、**Bootstrap系テーマを使いつつ、実際に自分がやった「Gatsby風化カスタマイズ」の手順・注意点・最終ソース例をまとめる!


1. 最終イメージ

トップページ(index.html)は、こんな「カード12枚」が3 x 4 で並ぶ感じ。

  • 各記事のカードに
    • フロントマターのfeatured画像
    • タグ(クリックでタグ一覧へリンク)
    • タイトル
    • 投稿メタ(著者・投稿日・更新日・読了時間)
    • 抜粋
    • 「続きを読む」リンク

2. index.htmlをグリッド用にカスタマイズ

まず.blog-gridCSS Gridレイアウトを作ることで、Bootstrapテーマでも柔軟な3列グリッドにできる。

{{ define "main" }}
<div class="container" role="main">
  {{ $pages := where .Site.RegularPages "Draft" false }}
  {{ $paginator := .Paginate (sort $pages "Lastmod" "desc") 12 }}
  <div class="blog-grid">
    {{ range $page := $paginator.Pages }}
      <article class="blog-card">
        <!-- 画像 -->
        {{ with resources.Get (printf "images/%s" $page.Params.image) }}
          {{ with .Resize (printf "%dx%d webp" .Width .Height) }}
            <img src="{{ .RelPermalink }}" alt="{{ $page.Title }}" class="u-photo blog-card-image" style="width:100%;height:170px;object-fit:cover;">
          {{ end }}
        {{ end }}

        <!-- タグ(リンク化、後述) -->
        {{ if $page.Params.tags }}
          <div class="blog-card-tags">
            {{ range $page.Params.tags }}
              <a href="{{ (print "/tags/" (. | urlize) "/") | relLangURL }}" class="tag p-category">{{ . }}</a>
            {{ end }}
          </div>
        {{ end }}

        <!-- タイトル -->
        <h2 class="blog-card-title">
          <a href="{{ $page.Permalink }}">{{ $page.Title }}</a>
        </h2>

        <!-- メタ情報(partial呼び出しで全部出すスタイルが推奨) -->
        <div class="blog-card-meta">
          {{ partial "post_meta.html" $page }}
        </div>

        <!-- 抜粋 -->
        <div class="blog-card-excerpt">
          {{ if $page.Params.excerpt }}
            {{ $page.Params.excerpt | plainify | truncate 80 }}
          {{ else }}
            {{ $page.Summary | plainify | truncate 80 }}
          {{ end }}
        </div>

        <!-- 続きを読む -->
        <a href="{{ $page.Permalink }}" class="blog-card-readmore">続きを読む &rarr;</a>
      </article>
    {{ end }}
  </div>
  ...(省略。ページネーション/profile box等は必要に応じて)
</div>
{{ end }}

3. グリッドCSSとダークモード対応

CSS例(SassやpostcssでもOK):

.blog-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2em;
}
@media (max-width: 900px) { .blog-grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 600px) { .blog-grid { grid-template-columns: 1fr; } }

.blog-card {
  background: #fff;
  box-shadow: 0 2px 8px rgba(0,0,0,.05);
  border-radius: 10px;
  padding: 1em;
  color: #222;
  display: flex;
  flex-direction: column;
}
.blog-card-image img { object-fit: cover; width: 100%; height: 170px; border-radius: 8px 8px 0 0; }
.blog-card-tags a.tag { background: #f3f3f3; border-radius: 12px; font-size: 0.9em; margin-right: 0.4em; padding: 1px 0.8em; text-decoration: none; color: #555; }
.blog-card-title { font-size: 1.22em; margin: 0.2em 0 0.12em 0; }
.blog-card-excerpt { margin-bottom: auto; margin-top: 0.7em; }
.blog-card-readmore { color: #ff8300; font-weight: bold; text-decoration: none; }

/* Dark (night) mode! */
@media (prefers-color-scheme: dark), body.night-mode {
  .blog-card { background: #1a1a1a; color: #f9f9f9; }
  .blog-card-title a { color: #ffa134; }
  .blog-card-tags a.tag { background: #292929; color: #ffa134; }
}

4. 投稿日・更新日・著者・読了時間をpartialで一括制御

記事メタは partial化しておくと楽!

<div class="blog-card-meta">
  {{ partial "post_meta.html" $page }}
</div>

post_meta.htmlには

  • 日付(.Date)
  • 更新日(.Lastmod)
  • 著者名(front matterにauthor/なければconfigで共通指定)
  • 読了時間(.ReadingTimeでHugoが自動計算!)

みたいな表示制御を全部ギュッとまとめておける。
多言語もi18nでバッチリ。


5. おまけTips

  • Bootstrapテーマでもrow/colでなくGridを自作すれば見た目を完全コントロールできる
  • 画像は resources.Get + .Resize を使えばどんなベーステーマでもOK
  • メタ情報などは[list/single]共通でpartialを推奨
  • ダークモードCSSは必須! preferrs-color-schemeで事故を防ぐ
  • 英語/日本語共存サイトなら relLangURL でリンクパス多言語自動化OK

参考:設定ファイルやfront matter例

content/blog/xxx.md:

title = "記事タイトル"
date = 2025-09-07T19:00:00+09:00
lastmod = 2025-09-08T09:00:00+09:00
tags = ["ビート販売サイト","AI音楽"]
author = "Genx"
excerpt = "この記事は、HugoでGatsby風カード式レイアウトを再現する実践記です。Bootstrap混在でもOK!"
image = "sample-thumb.jpg"

config.toml:

[params.author]
name = "Genx"

まとめ

「Gatsbyみたいな3列グリッドブログをHugoでやりたい!」
そんな時は「index.html側でrange・カード構造・CSS Grid・partialの活用」を徹底するだけで、超快適におしゃれなブログ一覧が作れる。

実際やってみたら、
カード内で画像・タグ・タイトル・メタ・抜粋・リンク…全部Hugoで自由自在。

Hugo 

著者について

Profile Avatar

Genx
1982年生まれ、日本人のビートメイカー・音楽プロデューサー。実験的なヒップホップビートを制作。国際的な環境で育ったため英語が話せる。趣味は筋トレ、アートワーク制作、ウェブサイトカスタマイズ、Web3。韓国が大好き。
ウェブサイト:genxrecords.xyz

関連記事