結論
プロは装飾を「足す」のではなく「引く」。要素を分けたくなったら反射的に 1px solid を引くのをやめ、余白 → 背景色差 → box-shadow → 線 の順で手段を選び、線は最後の手段にする。線を引くときも「布の静かな縫い目」レベル(1px・不透明度12%)に抑え、影は真っ黒禁止・単一光源・背景の色相で着色する。逆に、足してよい数少ない装飾が「アクセント帯」だ。
01 — 分離は「余白→背景色差→影→線」の順、線は最後
要素を分けたくなった瞬間に border へ手を伸ばすのが学生っぽさの最大要因。border は句読点のように脳へ強制的な区切りを作るため、多用すると busy and cluttered(雑然)に見え、2009年のフォームやスプレッドシートの古さが出る。まず近接(余白)でグルーピングし、それでも足りなければ背景色差、影、最後に線、という優先順位を体に入れる。
アカウント
プロフィール
通知設定
プライバシー
primary7 Practical Tips for Cheating at Design — Refactoring UI
02 — 線を引くなら「静かな縫い目」に抑える
密度が高く余白でスケールできない反復コンテンツ(テーブル・設定リスト・スペック表)では、線が現実解になる。そのときの正準値が Material Design 由来の 1px厚・不透明度12%(明地は rgba(0,0,0,0.12)、暗地は白12%)。テストは簡単で、「ページを開いて最初に目に入るのが線なら、それは過剰」。線は最初に気づかれてはいけない。
primaryDividers — Material Design
blogVisual Dividers in User Interfaces — Tubik Studio
03 — 影は「真っ黒禁止・背景の色相で着色・多層」
box-shadow: 0 2px 4px rgba(0,0,0,0.5) のような pure black の影は背景を脱色し、washed-out grey(洗いざらしのグレー)に見せる。デフォルト値のまま使うこと自体が安っぽさの記号だ。プロは影色を 背景の色相に寄せて彩度・明度を下げた色(青背景なら hsl(220deg 40% 30%))にし、現実の光の減衰を真似て低不透明度を多層に重ねる。単層のベタ影は奥行きが死ぬ。
primaryDesigning Beautiful Shadows in CSS — Josh W. Comeau
04 — 影は単一光源を共有する
カードごとに影の向き・比率がバラバラだと、一貫した光源が成立せず全体が「雑な貼り合わせ」に見える。ページ上のすべての影は同じ光源(上方やや手前)を共有し、垂直オフセット=水平の約2倍を守る。浮くほどオフセットと blur を増やし opacity を下げる、という比率を全要素で揃えるだけで画面が締まる。
primaryDesigning Beautiful Shadows in CSS — Josh W. Comeau
05 — 冗長な手がかりは重ねない
分離のキューを重ねるのは冗長だ。背景色が違えば border はいらない(remove it)し、border と drop shadow の併用は過剰で濁る。「分けたい」一念で線・色差・影を全部盛りにすると、かえって安っぽくなる。手がかりは1つに絞り、余白は多すぎる状態から始めてOKになるまで減らす。
primary7 Practical Tips for Cheating at Design — Refactoring UI
blogDesign Matters #11 — Borders & Shadows (datarocks)
06 — アクセント帯だけは「足し算してよい」
引き算の原則の例外。カード上端・アラート左側・ナビ項目に色付きの矩形(アクセント線)を1辺だけ足すと、グラフィックの才能なしに知覚品質を底上げできる。状態(info / warning / error)の即時伝達にも効く。色は制約されたパレットから選び、1要素につき1辺だけに留めるのがコツ。
新機能のお知らせ
のっぺりして印象に残らない
新機能のお知らせ
上端3pxの色帯で品質感が出る
primary7 Practical Tips for Cheating at Design — Refactoring UI
実装スニペット
/* 静かな縫い目(divider)— Material Design準拠 1px / 12% */
.divider {
height: 1px;
background: rgba(0, 0, 0, 0.12); /* 明地: 黒12% */
border: 0;
}
.divider--dark {
background: rgba(255, 255, 255, 0.12); /* 暗地: 白12% */
}
.divider--inset {
margin-inline: 16px; /* 関連項目をまとめる inset divider */
}
/* レイアウトを揺らさない1px枠 = box-shadow */
/* offset 0 0 / blur 0(クリスプ) / spread=線の太さ / color */
.card {
box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08); /* 外側 */
}
.input:focus {
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12); /* 内側 */
}
/* box-shadowはボックスモデル外に描かれるため、
border幅変更で起きるレイアウトシフトを回避できる */
/* 品のある影 — 単一光源・多層・背景色相で着色 */
:root {
/* 真っ黒を使わず背景の色相(例: 青系220deg)で着色 */
--shadow-color: 220deg 40% 30%;
}
.elevated {
box-shadow:
0 0.5px 0.5px hsl(var(--shadow-color) / 0.10),
0 1px 1px hsl(var(--shadow-color) / 0.10),
0 2px 2px hsl(var(--shadow-color) / 0.10),
0 4px 4px hsl(var(--shadow-color) / 0.10),
0 8px 8px hsl(var(--shadow-color) / 0.10),
0 16px 16px hsl(var(--shadow-color) / 0.10);
}
/* 足し算してよいアクセント帯 — カード上端 / アラート左 */
.card--accent {
border-top: 3px solid hsl(221deg 83% 53%); /* カード上端の色帯 */
}
.alert--warning {
border-left: 4px solid hsl(38deg 92% 50%); /* アラート左の色帯 */
background: hsl(38deg 92% 95%);
}
/* 1要素につき1辺だけ。色は制約パレットから */
チェックリスト
- 要素を分ける前に、まず余白(近接)→ 背景色差 → box-shadow → 線 の順を試したか
- ページを開いて最初に目に入るのが「線」になっていないか(なっていたら過剰)
- 線を使うなら 1px・不透明度12%(黒12% / 白12%)に抑え、グリッドに整列させたか
- 影に `rgba(0,0,0,…)` の真っ黒を使っていないか(背景の色相で着色したか)
- ページ上のすべての影が同じ光源(上方やや手前・垂直=水平の約2倍)を共有しているか
- border + 背景色差、border + drop shadow のような分離キューの二重がけはないか
- アクセント帯は1要素につき1辺だけ・制約パレットから選んだ色か
- 色付き影・半透明線・box-shadow枠を、実機・実背景・印刷/スクショ環境で確認したか
限界 / 出典
primary7 Practical Tips for Cheating at Design — Refactoring UI
primaryDesigning Beautiful Shadows in CSS — Josh W. Comeau
primaryDividers — Material Design
blogVisual Dividers in User Interfaces — Tubik Studio
blogDesign Matters #11 — Borders & Shadows (datarocks)
blogWrap your elements with box-shadow instead of border — Bekk Christmas