結論

プロは「数学的整列が先、光学微調整が後」の順序を必ず守る。まず 8px 基準グリッド(アイコン・タイポは 4px 細グリッド)に全要素を機械的に揃え、その上で目が読むのは外接矩形の座標ではなく視覚的重心だという事実に従って、重心と逆方向へ意図的にずらす。決定的なのは、その「微妙なズレ」の補正を目分量でやらず、86px/70px や +4px のように数値化してトークン/keyline に固定することだ。

01 — まずピクセルグリッド、次に光学補正

順序を逆にしてはいけない。最初に 8px(コンポーネント)と 4px(アイコン・タイポのベースライン)のグリッドに全要素を機械的にスナップさせ、サイズと余白を 8 の倍数(8/16/24/40)で刻む。土台が乱れたまま光学調整に入ると、何を直しているのか分からなくなる。光学補正は土台が正しく敷けてから初めて意味を持つ。

✗ 端が 5px / -3px と揃わない → 目分量で刻んだ余白
✓ 左端と gap を 8px グリッドに固定 → 静かに揃う

primaryMetrics & keylines — Material Design

02 — 視覚的重心の反対方向へずらす

play 三角や矢印など非対称シルエットは、外接矩形の座標で中央に置くと「左に寄って」見える。三角は視覚的重心が左にあるため、右へずらして初めて中央に見える。RingCentral の実測ではコンテナ内で左 86px / 右 70px の非対称マージン(左 > 右)で光学中央を達成している。方向則はシンプルで、要素を重心と逆方向へ動かすだけだ。

✗ 矩形座標で中央配置 → 三角が左に沈んで見える
✓ 右へ +3px ずらす → 視覚的に中央へ収まる

blog'Eyeballing' or Optical Alignment in Design — RingCentral UX

03 — 等重量に見せるためのオーバーシュート

円・三角・菱形は、同じ実寸の正方形より小さく・軽く見える。アイコンセットやボタン群を「同じ大きさ」に見せたいなら、実寸を揃えるのではなく超えさせる。Material の keyline は正方形 18×18dp に対し円は 20dp 径(2dp 大きい)、三角ボタンは矩形ボタンより約 40px 幅広にして等重量に見せる。座標上の同寸は、目には不揃いに映る。

✗ 全部 36px 実寸 → 円と三角が小さく軽く見える
✓ 円+4px / 三角を拡大 → 三つが等しい大きさに見える

blogOptical effects in user interfaces — Design Bridges

04 — アイコン-テキストのベースラインオフセットを計算する

アイコンとテキストを横並びにすると、テキストはベースラインで重心が下がるため、ボックス中央で揃えるとアイコンだけ「浮いて」見える。目分量で下げず、式で出す。baselineDistance = font-size × line-heighticonOffset = (baselineDistance − iconSize) / 2。16px / 1.5 / 16px なら 24px − 16px の半分で +4px 下げる。アイコンがテキストの 2 倍大なら値は負になり、自動で上方向補正される。

ダウンロード
✗ ボックス中央揃え → アイコンが上に浮く
ダウンロード
✓ +2px(算出値)下げ → 文字の重心に揃う

blogImproving Icons for UI Elements with Typographic Alignment and Scale — CSS-Tricks

05 — アイコンとテキストに同一 hex を使わない

同じ色値でも、テキストはアイコンより暗く(薄く)見える。細い文字のストロークが面で塗られたアイコンより視覚的に軽くなるためだ。同一 hex は「手抜き」に見え、アイコンを少し明るく、またはテキストを少し暗くする補正が要る。下の例はどちらも見出しとアイコンに同系の濃度を使っているが、左は完全同値、右はアイコンだけ一段明るくして見た目の濃度を揃えている。

警告メッセージ
✗ 同一 hex (#5c5a50) → 文字だけ沈んで見える
警告メッセージ
✓ アイコンを一段明るく → 濃度が揃って見える

blog'Eyeballing' or Optical Alignment in Design — RingCentral UX

06 — コンテンツをガター(溝)に置かない

レスポンシブ列グリッドでは、コンテンツは列内に収め、ガターは空けるのが規律だ。要素がガターに侵食すると整列が崩れ、一気に素人っぽく見える。端の列を画面端までフラッシュさせたいときは負マージンで明示的に出す——溝へにじませるのではなく。下の図は同じ 4 カラムで、左は要素が gap に食い込み、右は列の幅にきっちり収まっている。

✗ ブロックが gutter に侵食 → 列が揃わない
✓ 列幅にきっちり収め gutter を空ける

blogUI Design Grids Explained — Supercharge

実装スニペット

/* 基準グリッドのトークン (8px / 4px) — Material 準拠 */
:root {
  --grid-base: 8px;        /* コンポーネント */
  --grid-fine: 4px;        /* アイコン・タイポのベースライン */
  --space-1: 8px;
  --space-2: 16px;         /* mobile margin */
  --space-3: 24px;         /* tablet margin */
  --space-5: 40px;
  --touch-min: 48px;       /* 最小タップ領域 48×48dp */
  --content-keyline: 72px; /* アイコン付きコンテンツ左マージン(mobile) */
}
/* 12カラム, frame幅 375/600/900/1200px。コンテンツはガターに置かない */
/* アイコン-テキストのベースライン補正 (CSS変数 + 計算) */
.icon-text {
  --fontSize: 16px;
  --lineHeight: 1.5;
  --iconSize: 16px;
  --baselineDistance: calc(var(--fontSize) * var(--lineHeight)); /* 24px */
  --iconOffset: calc((var(--baselineDistance) - var(--iconSize)) / 2); /* 4px */
}
.icon-text svg {
  transform: translateY(var(--iconOffset));
}
/* アイコンがテキストより大きいとオフセットは負(例 16px/1.6/32px → −3.2px)になり自動で上方向補正される */
/* モダンCSS: lh/em 単位でベースライン補正(手計算不要) */
.icon {
  /* テキストと同サイズ系アイコン */
  transform: translateY(calc(.5em - .5lh));
}
.icon-variable {
  /* 可変サイズアイコン (vertical-align:middle前提) */
  --icon-size: 24px;
  vertical-align: middle;
  --icon-block-offset: calc((1lh - var(--icon-size)) * 0.5);
  margin-block-start: var(--icon-block-offset);
}
/* lh単位はモダンブラウザ前提。古い環境向けには px計算フォールバックを併記する */
/* play三角形の光学センタリング (非対称マージン) */
.play-button {
  display: flex;
  align-items: center;
  justify-content: center;
}
.play-button .triangle {
  /* 視覚重心が左にあるので右へ寄せる: 左86 / 右70 の比率 */
  margin-left: 86px;
  margin-right: 70px;
  /* 三角ボタンは矩形より約40px幅広にして等サイズに見せる */
}
/* RingCentral実測の左86px/右70px。寸法は容器に合わせ比率(left>right)を保って調整 */

チェックリスト

  • 全要素を 8px グリッドに、アイコン・タイポのベースラインを 4px 細グリッドにスナップさせたか(光学調整より先に)
  • サイズ・余白は 8 の倍数(8/16/24/40)から選んでいるか
  • 三角・矢印など非対称シルエットを、視覚的重心と逆方向へずらしたか
  • 円・三角を正方形と同列に置くとき、実寸をオーバーシュートさせたか(円 +2dp など)
  • アイコン+テキストの縦位置を `(font-size×line-height − iconSize)/2` の算出値で補正したか
  • アイコンとテキストに完全同一 hex を使っていないか(濃度差を補正したか)
  • コンテンツが列内に収まり、ガターに侵食していないか
  • タップ領域は 48×48dp 以上、隣接間隔 8dp 以上を確保したか
  • 補正値を目分量でなく数値(86px/70px・+4px 等)でトークン/keyline に固定したか
  • 補正リソースを最も目立つ要素(大見出し・主要 CTA)に集中投下したか

限界 / 出典

数値はコンテキスト依存:左 86px / 右 70px は特定コンテナでの RingCentral 実測値で、容器寸法が変われば比率(左 > 右)を保って再計算が要る。CSS-Tricks のオフセット値(4px / −3.2px / −12.8px)はそれぞれの font-size / line-height / iconSize でのみ成立し、式で都度算出すべき。
環境と過剰補正の注意:`lh` 単位はモダンブラウザ前提で、古い環境には px フォールバックを併記する。Material 1 の keyline 値(18/20dp 等)は M1 由来で、M3 では形は変わるが「幾何ベース形を保つ」方針は継続。trim / live / padding 等の dp 値は SVG 設計レイヤーの話で Web 実装の余白とは別物。そして「全要素を光学補正」は過剰——最も目立つ要素を優先するのが現実的だ。具体オフセット値の多くはブログ実例ベースなので、自プロジェクトでは必ず目視で微調整すること。

primaryMetrics & keylines - Layout - Material Design

primaryIcons — Material Design 3

primaryResponsive layout grid — Material Design

secondaryIcons – Style – Material Design 1

secondaryImproving Icons for UI Elements with Typographic Alignment and Scale — CSS-Tricks

secondaryWhat is Visual Alignment? — Interaction Design Foundation

blogMathematical and Optically alignment in (visual/UI) design — Rails Designer

blog'Eyeballing' or Optical Alignment in Design — RingCentral UX

blogOptical effects in user interfaces — Design Bridges

blogEverything you need to know about spacing & layout grids — UI Prep

blogUI Design Grids Explained — Supercharge

blogMeasured vs Optical Alignment — Liferay.Design

blogGraphic Design Principles: Alignment and Grid Systems — The Noun Project