HCB の長いコードを折りたたみ表示にする
<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>SAMPLE PAGE</title>
  <link rel="stylesheet" href="css/style.css">
</head>
<body>
  <header class="site-header">
    <h1 class="site-title"><a href="/">SAMPLE</a></h1>
    <nav class="site-nav">
      <ul>
        <li><a href="/about/">ABOUT</a></li>
        <li><a href="/works/">WORKS</a></li>
        <li><a href="/contact/">CONTACT</a></li>
      </ul>
    </nav>
  </header>
  <main class="site-main">
    <article class="post">
      <h2 class="post-title">POST TITLE</h2>
      <p class="post-date">2026-11-03</p>
      <div class="post-body">
        <p>本文が入る。</p>
      </div>
    </article>
  </main>
  <footer class="site-footer">
    <p><small>© SAMPLE</small></p>
  </footer>
  <script src="js/main.js"></script>
</body>
</html>

Highlighting Code Block(HCB)で表示している長いコードを、途中まで表示してボタンで全部表示する方法。畳む高さは数字の変更だけで調整できる。

高さが 400px を超えるコードブロックだけ畳む。短いコードブロックはそのまま表示する。

  • 長いコードブロックは途中まで表示し、下の部分をフェードで薄くする
  • 枠の外・右下の「SHOW ALL」で全部表示する
  • 「CLOSE」で元の高さに戻す

前提

  • プラグイン Highlighting Code Block をインストール・有効化している(2.2.1 で確認)
  • ボタンのアイコンは Font Awesome 6 以上を利用。Font Awesome を利用していない場合は、アイコンが表示されず文字だけになる
  • jQuery は使っていない
  • ファイルはテーマ(子テーマ)に追加する

追加するもの
CSS:テーマの CSS に追記
JavaScript:js/hcb-fold.js(新規)をテーマに格納
PHP:functions.php に追記

CSS

テーマの CSS(style.css など)の一番下に追記。

/* ===== ここから CSS(HCB の長いコードを折りたたみ表示) ===== */
/*
  ・js/hcb-fold.js が長いコードブロックに .has-fold/.is-fold を指定したときだけ効く
  ・.hcb_wrap を2つ重ねて、HCB やテーマの pre の指定より強くしている
*/
.hcb_wrap.hcb_wrap.has-fold {
	position: relative;
	margin-bottom: 6px;                /* ★ コードブロックの枠 〜 ボタンの間 */
	--hcb-fold-height: 320px;          /* ★ 畳んだときの高さ(JavaScript の FOLD_HEIGHT と同じ値にする) */
}
.hcb_wrap.hcb_wrap.has-fold > pre {
	transition: max-height .45s ease;  /* ★ 開閉の速さ */
}
.hcb_wrap.hcb_wrap.is-fold > pre {
	max-height: var(--hcb-fold-height);
	overflow-y: hidden;
}

/* 下のフェード(色はコードブロックの背景色に合わせる) */
.hcb_wrap.hcb_wrap.is-fold::after {
	content: "";
	position: absolute;
	left: 1px;                         /* コードブロックの枠線(1px)の内側 */
	right: 1px;
	bottom: 1px;
	height: 80px;                      /* ★ フェードの高さ */
	background: linear-gradient(rgba(238, 241, 244, 0), #eef1f4); /* ★ 背景色 #eef1f4 */
	pointer-events: none;              /* フェードの上からもコードを選択できるように */
}

/* 枠の外・右下のボタン:アイコン+SHOW ALL / CLOSE */
button.hcb-fold-btn {
	display: flex;
	align-items: center;
	gap: .4em;                         /* アイコン 〜 文字 */
	width: fit-content;
	margin: 0 0 24px auto;             /* ★ ボタンの下の間(右寄せ) */
	padding: 0;
	border: 0;
	background: none;
	color: #1d1f28;                    /* ★ 文字の色 */
	font-family: 'Montserrat', sans-serif;
	font-size: 90%;                    /* ★ 文字の大きさ(本文の 90%) */
	font-weight: 500;
	letter-spacing: -0.05em;
	line-height: 1;
	cursor: pointer;
}
button.hcb-fold-btn i {
	color: #8a8f9d;                    /* ★ アイコンの色 */
}
button.hcb-fold-btn:hover,
button.hcb-fold-btn:hover i {
	color: #ccccc8;                    /* ★ マウスオンの色 */
}

/* 動きを減らす設定の場合は、開閉のアニメーションなし */
@media (prefers-reduced-motion: reduce) {
	.hcb_wrap.hcb_wrap.has-fold > pre {
		transition: none;
	}
}
/* ===== ここまで CSS ===== */

※ フェードの色 #eef1f4 はコードブロックの背景色。HCB の配色やテーマでコードブロックの背景色を変えている場合は、「変更する場合」のとおり背景色に合わせる。

JavaScript

下記を js/hcb-fold.js としてテーマのフォルダに格納する。

/* =====================================================================
   HCB(Highlighting Code Block)の長いコードを折りたたみ表示にする
   - FOLD_HEIGHT + MIN_HIDDEN より長いコードブロックだけ畳む(短いものは何もしない)
   - 枠の外・右下の「SHOW ALL」で全部表示 →「CLOSE」で畳む
   - JavaScript が動かない環境では畳まれず、全部表示される
   - デザイン:CSS の「HCB の長いコードを折りたたみ表示」
   ===================================================================== */
( function () {
	'use strict';

	var FOLD_HEIGHT = 320;  /* ★ 畳んだときの高さ(px)。CSS の --hcb-fold-height と同じ値にする */
	var MIN_HIDDEN  = 80;   /* ★ 隠れる部分が MIN_HIDDEN 未満なら畳まない(px) */

	var ICON_OPEN  = '<i class="fa-solid fa-expand" aria-hidden="true"></i>';   /* ★ SHOW ALL のアイコン */
	var ICON_CLOSE = '<i class="fa-solid fa-compress" aria-hidden="true"></i>'; /* ★ CLOSE のアイコン */

	// 1つのコードブロックを畳んで、枠の外・右下にボタンを追加する
	function fold( wrap, pre ) {
		wrap.classList.add( 'has-fold', 'is-fold' );

		var btn = document.createElement( 'button' );
		btn.type      = 'button';
		btn.className = 'hcb-fold-btn';

		// ボタンの表示を切り替える(畳んでいる:SHOW ALL / 開いている:CLOSE)
		function setLabel( folded ) {
			btn.innerHTML = folded ? ICON_OPEN + 'SHOW ALL' : ICON_CLOSE + 'CLOSE';
			btn.setAttribute( 'aria-expanded', folded ? 'false' : 'true' );
		}
		setLabel( true );
		wrap.after( btn );

		btn.addEventListener( 'click', function () {
			var folded = wrap.classList.toggle( 'is-fold' );

			// 開くときは中身の高さまで max-height を広げる(CSS の transition でなめらかに伸びる)
			pre.style.maxHeight = folded ? '' : pre.scrollHeight + 'px';
			setLabel( folded );

			// 閉じたとき、コードブロックが画面から外れていれば見える位置まで戻す
			if ( folded ) {
				wrap.scrollIntoView( { block: 'nearest' } );
			}
		} );
	}

	// 高さを測って、長ければ畳む。高さが 0(非表示で測れない)のときは false を返す
	function check( wrap, pre ) {
		var h = pre.scrollHeight;
		if ( 0 === h ) {
			return false;
		}
		if ( h > FOLD_HEIGHT + MIN_HIDDEN && ! wrap.classList.contains( 'has-fold' ) ) {
			fold( wrap, pre );
		}
		return true;
	}

	function init() {
		// ページを非表示(display: none)から表示させる演出がある場合、非表示の間は高さが 0 で測れない。
		// ResizeObserver で、表示されて高さが決まったときに1回だけ測る
		var ro = window.ResizeObserver ? new ResizeObserver( function ( entries ) {
			entries.forEach( function ( entry ) {
				var pre = entry.target;
				if ( check( pre.closest( '.hcb_wrap' ), pre ) ) {
					ro.unobserve( pre );
				}
			} );
		} ) : null;

		document.querySelectorAll( '.hcb_wrap' ).forEach( function ( wrap ) {
			var pre = wrap.querySelector( 'pre' );
			if ( pre && ! check( wrap, pre ) && ro ) {
				ro.observe( pre );
			}
		} );
	}

	// 読み込み完了(load)の後に始める。
	// HCB のスクリプトがコードブロックの中身を作り直すため、作り直したあとの高さで測る
	if ( 'complete' === document.readyState ) {
		init();
	} else {
		window.addEventListener( 'load', init );
	}
} )();

※ HCB のスクリプトがコードブロックの中身を作り直したあとの高さで判定するために、ページの読み込み完了(load)を待ってから測る。
※ ページを非表示(display: none)から表示させる演出がある場合、非表示の間はコードブロックの高さが 0 になり、長さを判定できないため、ResizeObserver で待ち、表示されて高さが決まったときに1回だけ測る。
※ 畳む・開くは max-height の切り替え。開くときになめらかに伸ばすために、max-height を none ではなく中身の高さに指定する(none には transition がかからない)。
※ 長いコードを開いて下まで読んだあとでも、どこを読んでいたか分かるように、「CLOSE」を押したときは、コードブロックが画面から外れていれば見える位置まで戻す。
※ .has-fold/.is-fold は JavaScript が指定するため、JavaScript が動かない環境では畳まれず、全部表示される。

functions.php

テーマの functions.php の一番下に追記(?> がある場合は ?> の手前)。<?php は記述していない。

/**
 * HCB の長いコードを折りたたみ表示にする JavaScript(js/hcb-fold.js)を読み込む
 * ・コードブロックがあるのは記事・固定ページなので、記事・固定ページだけで読み込む
 * ・バージョンにファイルの更新日時を指定して、JavaScript を直したらブラウザのキャッシュも更新されるようにする
 */
function hcb_fold_enqueue() {
	if ( ! is_singular() ) {
		return;
	}
	wp_enqueue_script(
		'hcb-fold',
		get_theme_file_uri( 'js/hcb-fold.js' ),
		array(),
		filemtime( get_theme_file_path( 'js/hcb-fold.js' ) ),
		true
	);
}
add_action( 'wp_enqueue_scripts', 'hcb_fold_enqueue' );

※ get_theme_file_uri() は子テーマ → 親テーマの順に探すため、js/hcb-fold.js はどちらに格納しても読み込める。
※ コードブロックがあるのは記事・固定ページなので、is_singular() で記事・固定ページだけで読み込む。

変更する場合

変えたい内容変更箇所
畳んだときの高さJavaScript の FOLD_HEIGHT と CSS の --hcb-fold-height。同じ値にする。高さはコードの部分だけで、上下の余白は含まない
畳まないコードの長さJavaScript の MIN_HIDDEN。隠れる部分が MIN_HIDDEN 未満のコードブロックは畳まない
フェードの色CSS の linear-gradient の2色
フェードの高さCSS の .is-fold::after の height
開閉の速さCSS の transition
アイコンJavaScript の ICON_OPEN・ICON_CLOSE
ボタンの文字の色・大きさCSS の button.hcb-fold-btn

フェードの色は、2色ともコードブロックの背景色にする。1色目は背景色を透明にしたもの(rgba の最後が 0)。たとえば背景色が #2b2b2b の場合は、次のように変更する。 background: linear-gradient(rgba(43, 43, 43, 0), #2b2b2b);
※ コードブロックの背景色は、ブラウザの開発者ツールで pre の background-color を見ると分かる。

既存の設定がある場合

CSS は .hcb_wrap を2つ重ねて指定を強くしているため、テーマで pre に max-height や overflow を指定している場合も、畳むときの指定が優先される。

畳んだコードブロックは、コードブロックの下の間を 6px にして、ボタンの下に 24px の間を設定している。テーマでコードブロックの下の間を決めている場合は、button.hcb-fold-btn の margin の 24px をテーマの値に合わせる。

表示環境によって動きの見え方が異なる場合があるため、本番に反映する前に確認してね。

NOTICES

  • 記事内容は実装させたものがほとんどですが自己責任で参考にしてください。