最小限のCSSでそこそこ良いサイトを作る(2023)
(thecascade.dev)- 多くの開発者は CSS設計のやりすぎ によって不要な問題を抱えがち
- 最小限の グローバルスタイル だけでも、十分にすっきりしてレスポンシブなページを作れる
- 画像、SVG、動画 要素はサイズ制限とブロック表示だけで基本的なレイアウト問題を解決できる
- system-ui フォントと適切な 行間、段落の最大幅制限を設定することで可読性を向上できる
- OSの ダークモード などの環境設定を反映するため、
color-schemeプロパティの適用が必要
最小限のCSSでそこそこ良いサイトを作る
過剰なCSSの問題とアプローチ
- 多くの人はWebサイトを作るとき、CSS設計を必要以上に複雑にしがち
- 最小限のCSSだけでも、十分に洗練され、基本に忠実なレスポンシブページ を作成できる
基本的なHTMLと画像への対応
-
基本的なHTMLを書くだけでも、サイトは 基本的なレスポンシブ性 を備えている
-
画像が原因でレイアウトに オーバーフロー問題 が発生することがあるため、以下のCSSを適用する
img { max-width: 100%; display: block; } -
SVG、video 要素でも同様の問題が発生する場合は、以下のように拡張して適用できる
img, svg, video { max-width: 100%; display: block; }
タイポグラフィの改善
-
ブラウザのデフォルトフォントは、デザイン面でやや味気なく見えやすい
-
フォントファミリーに system-ui を使うことで、各プラットフォームに適した標準書体 を適用できる
-
既定のフォントサイズと行間は やや小さめな傾向 があるため、以下のような改善設定が推奨される
body { font-family: system-ui; font-size: 1.25rem; line-height: 1.5; } -
この設定だけでも、ブラウザのデフォルト値 と比べて大きな改善効果がある
ダークモード対応
-
多くのユーザーは ダークモード を好むため、OS設定に追従する color-scheme プロパティの適用が有効
html { color-scheme: light dark; } -
このプロパティにより、ユーザーエージェントスタイルが システムの優先テーマ を自動で反映するようになる
-
HTMLタグの属性として指定することもできる
<html lang="en" color-scheme="light dark"></html> -
システムの設定だけでなく、色のスキームをユーザーが直接選べるようにする のも良いベストプラクティス
コンテンツ幅の制限
-
コンテンツ段落の長さ は可読性に大きく影響する重要な要素
-
一般的には、本文は1行あたり45〜90文字 の範囲で表示されるように設定するのが理想的
-
以下のように
main要素の最大幅を制限することで、段落の 可読性改善 が可能main { max-width: min(70ch, 100% - 4rem); margin-inline: auto; } -
min()関数で70chと100% - 4remのうち小さい方の値を選ぶ -
margin-inline: autoによって 水平方向の中央揃え が行われる -
必要に応じて、main の代わりに .container または .wrapper クラスを使ってもよい
最終的な最小CSSの例
-
以上をまとめると、以下のような最小CSSセットで安定したサイトを構築できる
html { color-scheme: light dark; } body { font-family: system-ui; font-size: 1.25rem; line-height: 1.5; } img, svg, video { max-width: 100%; display: block; } main { max-width: min(70ch, 100% - 4rem); margin-inline: auto; }
まとめと拡張性
- 上記の例は、軽量な出発点や小規模なページ にすぐ活用できる
- 多くの場合、この土台の上に 追加のスタイル を重ねて拡張していくのが望ましい
1件のコメント
Hacker Newsの意見
system ui font familyを非推奨とする理由を整理した記事。 https://infinnie.github.io/blog/2017/systemui.htmlstリガチャがあまりに見づらく、そのサイトからフォントの助言を受けたいとは思わないmax-widthひとつで苦労する人たち? 個人ホームページを作るすべての人が対象だこれは誤り。正しい構文は
記事の筆者は一部の例では正しく書いているが、最初の例では間違っていて混乱を招きうる
のように。
timesもTimes New Romanも引用符なしで問題なく動くのを見ると、古いフォントだから特別扱いされているのか、それともCSSの名前マッチングがかなり寛容なのかが気になるこれ、ただのキャッシュ・マネーと呼びたくなる
html/cssを書くのもレイアウトやカスタマイズが面倒だという。Astroのテーマは個人ブログ向けが少なく、ほとんどが企業向けか派手なものばかり。こうした悩みを通じて、Webサイト設計がなぜここまで難しくなったのか改めて驚かされる。フレームワーク、コンポーネント、数多くの依存関係の中で、Web開発者はどうやってこの流れについていっているのか気になるimg { max-width: 100%; }この設定は必ず
height: autoと一緒に使うべきだ。さもないと画像の比率が崩れるimg, svg, video { max-width: 100%; }Chrome 141では、ネストされたSVG要素の
width/heightの問題でauto計算が狂う。一時的にはsvg:where(:not(svg svg))で対処すべきだsystem-uiフォントは単純なsans-serifの代替ではない。システムUIフォントを本文コンテンツに使うと、一部のOS/言語の組み合わせではほとんど読めないほど不快になることがある。sans-serifが必要ならsans-serifを使うのが正しいデフォルトのフォントサイズは少し小さめなので、18〜20px(1.25rem)程度が適切だ。ただし小さい画面では 1rem を超えないほうがよい
デフォルトの
line-heightは 1.5〜1.7 を勧めるが、1.7 は小さい画面では広すぎる。1.4〜1.5 が適切で、画面サイズに応じて 1.4〜1.6 まで調整できるfont-family: System UI;これは明らかな文法エラーだ。スタイルシートを確認すればすぐ分かる
ダーク/ライトのシステムテーマとWebテーマを分けるのは良い考えだ。Firefoxはコンテンツがシステムテーマに従うよう標準設定されており、個別に調整もできる
main { max-width: min(70ch, 100% - 4rem); margin-inline: auto; }これは最小でも2rem程度の余白を意味する(bodyのデフォルトマージンまで含めると 2rem+8px)。余白が多すぎ、適用箇所も不自然だ。
mainに適用するならのようにパディングを使うほうが理にかなっている。ただ実際には、
headerやfooterにも同じ左右余白が必要なので、bodyのマージンを調整するほうがよい余白を約40pxから16px程度まで減らせる