文字を読ませる
この場面の困り事と、そのまま使えるコード。全17件。 足りなければ、行末のページへ進む。
このページの中だけを絞ります。ページは移りません。
文字が読みにくい、詰まって見える
行間を1.7〜1.9にする。字間は本文では触らない。詰めるのは見出しだけ。字間と行間
body { line-height: var(--leading-body); }
h1, h2, h3 { line-height: var(--leading-heading); letter-spacing: 0.02em; }行間をいくつにすればいいか
和文本文は1.7〜1.9、見出しは1.3〜1.5。行が長いほど広げる。字間と行間
:root { --leading-body: 1.9; --leading-heading: 1.35; }
body { line-height: var(--leading-body); }
h1, h2, h3 { line-height: var(--leading-heading); }1行を何文字にすればいいか
和文は全角35〜45字、欧文は45〜75字。ただし文字数で幅を指定せず、レイアウトで決める。版面と行長
版面幅を変えて1行の字数を確かめる。文字数で幅を指定せず、コンテナで決める。
HTML(見本の骨組み)
<div class="page"> <p>中央に寄せた本文列。幅を変えると1行に入る字数が変わります。</p> </div>
--page と --gutter は 出発点のCSS の :root にあります。
コピーする CSS
:root {
--page: 80rem;
--gutter: 32px;
}
.page {
max-inline-size: var(--page);
margin-inline: auto;
padding-inline: var(--gutter);
}
本文を何ピクセルにすればいいか
16pxを下限にする。指定はpxではなくremで、利用者のブラウザ設定に追従させる。大きさの体系
html { font-size: 100%; }
body { font-size: var(--text-base); } /* 16px相当 */見出しの大きさが決まらない
比1.2〜1.25の階段を作り、その中から選ぶ。1ページで使うのは4段まで。大きさの体系
h1 { font-size: var(--text-2xl); }
h2 { font-size: var(--text-lg); }
h3 { font-size: var(--text-base); }見出しと本文の差がつかない
大きさだけで差をつけようとしている。太さと余白を併せて動かすと、大きさは控えめで足りる。視覚階層
h2 {
font-size: var(--text-lg);
font-weight: 700;
margin-block: var(--space-8) var(--space-3);
color: var(--color-text);
}明朝とゴシックのどちらを使うか
長文を静かに読ませるなら明朝、画面のUIとして操作させるならゴシック。混ぜるなら役割で分ける。書体の選び方
body { font-family: "Noto Sans JP", system-ui, sans-serif; }
.prose { font-family: "Noto Serif JP", serif; }和文と欧文が混ざると欧文だけ沈んで見える
欧文側のx-heightが低い。和文に合う書体に替えるか、欧文だけ級数を上げる。和文組版
欧文だけ級数を上げるか、和文に合う書体に替える。
HTML(見本の骨組み)
<p>和文の中に <span class="latin">Latin 2026</span> が混ざる見本</p>
.latin で欧文だけ包んで指定します。
コピーする CSS
.latin { font-family: Inter, system-ui, sans-serif; font-size: 1.05em; }
英数字が和文の中で窮屈に見える
和文と欧文のあいだに四分アキ(全角の1/4)を入れる。CSSだけでは自動で入らないので、原稿側で半角の空きを入れるか、欧文を要素で包んで margin を付ける。和文組版
和文と欧文のあいだに四分アキ。原稿に半角スペースを入れるか、要素で margin を付ける。
HTML(見本の骨組み)
<p>コード <span class="code">API</span> と数字 <span class="num">2026</span></p>
原稿に半角スペースを入れる方法も有効です。
コピーする CSS
.code, .num { margin-inline: 0.25em; } /* 原稿に半角スペースを入れる */
約物(括弧や句読点)のアキが気持ち悪い
全角の約物は前後に余白を持っている。連続する箇所と行頭の始め括弧だけを詰める。和文組版
palt で約物のアキを詰める。見出しは pkna も併用。
HTML(見本の骨組み)
<h2>約物(「括弧」、句読点。)</h2> <p>本文でも「引用」と、句読点。</p>
本文は palt、見出しは palt + pkna。
コピーする CSS
body { font-feature-settings: "palt" 1; }
h1, h2 { font-feature-settings: "palt" 1, "pkna" 1; }
Webフォントを使うと表示が遅い
1書体に絞る。preload と font-display: swap を付け、数百KBを超えるならサブセット化する。Webフォントの実装
preload と font-face をセットで入れる。1書体に絞る。
HTML
<link rel="preload" href="/fonts/NotoSansJP.woff2" as="font" type="font/woff2" crossorigin>
CSS
@font-face {
font-family: "Noto Sans JP";
src: url("/fonts/NotoSansJP.woff2") format("woff2");
font-display: swap;
}読み込み中に文字が出ない時間がある
font-display が block になっている。swap にすると代替書体で先に出る。Webフォントの実装
font-display: swap で代替書体を先に出す。
HTML
<!-- HTML の変更は不要 -->
CSS
@font-face {
font-family: "Noto Sans JP";
src: url("/fonts/NotoSansJP.woff2") format("woff2");
font-display: swap;
}書体が入れ替わるときガタつく
size-adjust と ascent-override で代替書体の見た目を本番に寄せる。Webフォントの実装
size-adjust で代替書体の見た目を本番に寄せる。
HTML
<!-- HTML の変更は不要 -->
CSS
@font-face {
font-family: "Noto Sans JP";
src: url("/fonts/NotoSansJP.woff2") format("woff2");
size-adjust: 100%;
ascent-override: 90%;
font-display: swap;
}太字がぼやける、細字が読めない
合成太字になっている。太字のファイルを読み込み、font-weight で実在するウェイトを指定する。書体の選び方
合成太字に頼らず、太字ファイルを font-face で読み込む。
HTML
<p>通常 <strong>太字</strong></p>
CSS
@font-face {
font-family: "Noto Sans JP";
src: url("/fonts/NotoSansJP-Bold.woff2") format("woff2");
font-weight: 700;
font-display: swap;
}
strong, b {
font-weight: 700;
}同じ級数なのに、書体を変えたら大きさが変わって見える
x-heightが違う。字面の大きさは font-size と一致しない。書体を替えたら級数も測り直す。文字の骨格
/* 書体を替えたら実寸で測り直す */
body { font-size: var(--text-base); }
.serif { font-family: "Noto Serif JP", serif; font-size: 1.05em; }文字の高さを揃えたのに揃って見えない
ボックスの上端で揃えている。ベースラインで揃える。文字の骨格
flex の align-items は baseline。box の上端では揃えない。
HTML(見本の骨組み)
<div class="row"><span>12px</span><span>本文</span><span>A</span></div>
align-items: baseline が要点です。
コピーする CSS
.row { display: flex; align-items: baseline; gap: var(--space-2); }
キャッチコピーの改行位置を決めたい
見出しは text-wrap: balance で行の長さが揃う。ここで折りたいと決まっているなら、折りたくない語を要素で包んで display: inline-block にする。和文組版
balance で行長を揃える。折りたくない語は inline-block で包む。
HTML(見本の骨組み)
<h1>今日の<span class="keep">特別な</span>お知らせ</h1>
幅を変えて balance の効きを確かめます。
コピーする CSS
h1 { text-wrap: balance; }
.keep { display: inline-block; } /* 折りたくない語を包む */
この場面の値をまとめて決めるなら作業台へ。和文の予約ページに載せて、幅と明暗を替えて確かめてから CSS を持ち帰る: 字と余白と幅
この場面で貼れるもの#
答えを読んだら、ここから完成形を持ち帰れます。
和文本文段長文記事の基本組版。見出し余白と行送りを starter に合わせる
縦スタックmargin 相殺を避ける基本レイアウト。gap だけで間隔を取る
本文+サイドバー読む幅を本文列に限定し、補助情報を脇に置く
図版とキャプション画像+説明を1単位に。width/height でCLSを防ぐ
記事ヘッダータグ・日付・読了目安をタイトルの前後にまとめる。日付は datetime つきの time で持つ
ページ送り記事一覧の下に置く。現在ページを aria-current で示し、番号は押せる大きさに保つ
タグ絞り込み(一覧の頭)一覧の頭でタグを選ばせる。選択中の見た目と件数を同じ場所で示す
記事内目次長い記事の冒頭に置く1段の目次。見出しの id へ飛ばすだけの静的版
前後の記事ナビ記事末尾から前後の1件ずつへ送る。タイトルは2行まで、rel で向きを示す
関連記事3件読み終えた人へ次の3件を差し出す。サムネなしの文字組で日付を添える