2025/12/22 / 技術メモ

ブログのCSSにコードブロックにシンタックスハイライト付ける

ブログのCSSにコードブロックに各言語、拡張子に対応したシンタックスハイライトを行うようにする方法をわかりやすく解説します。

css

こんにちは!パン君です。

今回は自分のブログでコードブロックにシンタックスハイライトを入れるためにやったことをまとめます。

ビルドはコードブロックの構造を整形して出力しているだけであり
見た目はクライアント側の CSS / ハイライトライブラリで行うという設計にしています。
以下、実際に確認した実装と私が追加・調整した CSS/導入手順を具体例付きで説明します。

ビルドの要点

ビルドスクリプトのカスタムレンダラで Markdown のコードブロックを次のような HTML 構造で出力するようになっています

  • <figure class="code-block" data-lang="xx">: コードブロック全体をラップ
  • div.code-header: 上部に言語ラベルを出す
  • ビルド結果の想定は <pre><code class="language-xx">...</code></pre> という形になるように実装

以上です。

チャート出力のためにMermaidに対応する場合は
<div class="mermaid-wrapper"><div class="mermaid">...</div></div>
として置いて、クライアント側で mermaid を初期化して描画する想定で吐き出しましょう。

端的に話すとビルド側は「どの言語か」「見た目のためのフック」を付与する役割にとどめ色付けはクライアント側のライブラリに任せる設計です。

この設計は以下の利点があります。

  • サイトビルドが軽い(トークン化やサーバ側でのハイライト処理を行わない)
  • クライアントでテーマを切替えやすい
  • mermaid のようにクライアント描画が必要なブロックも扱いやすい

実際に行った手順(概要)

  1. 出力される HTML 構造に合わせて CSS を作成(.code-block 系)
  2. Prism.js(または highlight.js)を導入して <code class="language-..."> に対してハイライト処理を行う
  3. Mermaid を利用するブロックがある場合は mermaid.initialize() を呼んで描画
  4. 追加で行番号表示や行ハイライト、ダークモード対応を CSS で実装(必要なら JS で補助)

以下に、私が実際に記事内で示したサンプル CSS と Prism 導入例を掲載します。
プロジェクト方針に合わせて調整してください。

サンプル CSS

実際に使った例を示します。色やフォントは好みに合わせて変えてください。

/dev/null/example.css
/* ブログ用: コードブロック基本スタイル */
figure.code-block {
  margin: 1.2em 0;
  border-radius: 8px;
  overflow: hidden;
  background: #0b0f14; /* ダーク系の例。ライトテーマ用は別クラスで上書きする */
  color: #e6eef6;
  box-shadow: 0 1px 0 rgba(0,0,0,0.15);
  font-size: 0.9rem;
}

figure.code-block .code-header {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: linear-gradient(90deg, rgba(255,255,255,0.03), rgba(255,255,255,0.01));
  border-bottom: 1px solid rgba(255,255,255,0.04);
}

figure.code-block .lang-icon { display: inline-flex; align-items: center; }
figure.code-block .lang-label { font-weight: 600; font-size: 0.85rem; color: #cfe3ff; }

figure.code-block pre {
  margin: 0;
  padding: 12px;
  overflow: auto;
  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, "Roboto Mono", "Courier New", monospace;
  line-height: 1.6;
  background: transparent;
  color: inherit;
}

/* 行番号や行ハイライトの準備(Prism のプラグインと併用可) */
pre[data-line] {
  position: relative;
}

/* Prism の token カラーはテーマ毎に上書きする想定 */
.token.comment { color: #6a737d; }
.token.keyword { color: #ff7b72; font-weight: 600; }
.token.function { color: #79b8ff; }

Prism.js を CDN で読み込む例

軽く試すときは CDN で読み込みます。実運用では本番ビルドに組み込むかローカル配備を推奨します。

/dev/null/example.html
<!-- Prism の CSS と JS(例: CDN)-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@latest/themes/prism-tomorrow.css" />
<script src="https://cdn.jsdelivr.net/npm/prismjs@latest/prism.min.js"></script>
<!-- 必要な言語コンポーネントは個別に読み込む -->
<script src="https://cdn.jsdelivr.net/npm/prismjs@latest/components/prism-javascript.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@latest/components/prism-python.min.js"></script>

<!-- Prism プラグイン(行番号など) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@latest/plugins/line-numbers/prism-line-numbers.css" />
<script src="https://cdn.jsdelivr.net/npm/prismjs@latest/plugins/line-numbers/prism-line-numbers.min.js"></script>

<!-- 初期化は不要(Prism は DOMContentLoaded 時に自動で実行されることが多い) -->

tools/build-blog.js<code class="language-xxx"> を生成しているので、Prism 側で対応する言語コンポーネントを読み込めば普通に色が付くはずです。

mermaid の扱い

mermaid ブロックはビルド側で専用ラッパーを出力しているため、クライアントで初期化します。

/dev/null/example.html
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
<script>
  mermaid.initialize({ startOnLoad: false, theme: 'base' });
  // build-blog.js が .mermaid 要素を出力しているので、
  // DOM の準備が出来たら mermaid を個別に初期化して描画します
  document.addEventListener('DOMContentLoaded', () => {
    document.querySelectorAll('.mermaid').forEach((el) => {
      try {
        mermaid.parse(el.textContent);
        // mermaid の描画呼び出し(簡易的)
        mermaid.init(undefined, el);
      } catch (e) {
        console.warn('mermaid parse failed', e);
      }
    });
  });
</script>

追加で入れると便利な改善点

  • 行番号表示
  • 行ハイライト
  • コピーボタン
  • ライト/ダークのテーマ切替え
  • サーバ側でプリレンダ: 現在はクライアント側でハイライトしているため、初回表示パフォーマンスや SEO を重視する場合はビルド時に Prism を走らせて HTML を直接生成する方式も検討の余地あり

まとめ

  • コードブロックの「構造(ラベル、class、data-lang)」を整えて出力して、色付けや見た目の細かい調整は CSS とクライアントのハイライトライブラリで行うのが素直で運用もしやすいです。
  • 小さめのブログなら CDN で Prism や Mermaid を導入して見た目を整え、動作確認のあと本番用にビルドへ組み込むのが手早い方法でした。
  • 行番号やコピー機能、テーマ切替えなどユーザー体験を向上させるオプションも簡単に追加できます。

  

ここまで読んでくれてありがとうございました!
必要なら CSS の具体ファイル追加や Prism のビルド組み込み手順も追記します。
要望があれば教えてください。

← C#14の新機能の解説← ブログ一覧へ戻る