2015年、几帳面なやり方でCSSレイアウトを学ぶ
(book.mixu.net)- CSSレイアウトをすでに使ったことのある読者が、レイアウトアルゴリズムを細かな規則まで理解できるように作られた章立ての学習資料
inline、block、z-index、ボックスモデルを単なる使い方ではなく、フォーマッティングコンテキストやスタッキングコンテキストのような決定規則として説明し直している- 通常フローにおけるブロック要素とインライン要素の相対位置は
displayだけで決まるのではなく、兄弟要素やコンテキストもあわせて影響する - ボックスモデルのサイズや
margin: autoの計算は、配置方式によって異なるため、ひとつの規則として暗記しにくい - 通常フロー、float、絶対配置、margin collapsing、overflow、
z-index、疑似要素、Flexboxを経て、センタリングやグリッドフレームワークのような実践的レイアウト問題へとつながっていく
CSSレイアウトを規則として理解する
- この資料はCSSレイアウトを小技集ではなく規則ベースのシステムとして捉え、各規則を章ごとに追いながら説明する長編の学習資料
- 「pedantic」という表現のとおり、些細に見える細部や形式的な規則まで厳密に扱うアプローチを取っている
- 対象読者はCSSを初めて学ぶ人ではなく、すでにCSSを使っているがレイアウトの動作をより厳密に理解したい人
- Webサイトはたいてい段階的に発展していくため、小さなヒントやテクニックだけでレイアウトを身につけがちで、その過程でレイアウトアルゴリズムそのものを見落とすことがある
- 主要な概念を順序立てて扱い、各概念を確認できる実例もあわせて提供している
章構成
- Chapter 1: Box positioning in CSS は、HTML要素が作るボックスが互いにどのように配置されるかを扱う
- CSSの3つの主要な配置方式: 通常フロー、float、絶対配置
- 通常フローにおける anonymous box generation、formatting context、line box、line box 内での配置
- float の順序、clearfix、float と親要素の高さの相互作用
- Chapter 2: Box sizing in CSS は、ボックスモデルと配置方式による違いを扱う
height、width、marginの計算にはそれぞれ異なるメカニズムが使われる- 計算方法を理解するには、現在使っている配置方式と計算メカニズムをあわせて見る必要がある
- Chapter 3: Additional properties that influence positioning は、ボックス配置に影響を与える追加のプロパティとメカニズムを整理する
- margin collapsing、negative margins、overflow
max-width、max-height、min-width、min-height- stacking context と
z-index - 疑似要素がレイアウトに与える影響
- CSS3
box-sizingプロパティ
- Chapter 4: Flexbox は、CSS 3 の Flexbox レイアウトモードを説明する
- Chapter 5: CSS layout - tricks and layout techniques は、前章までの内容を実際の問題に適用する
- 水平・垂直センタリング
- CSSグリッドフレームワークの動作原理
- 多段レイアウト
- よくある落とし穴とレイアウトのテクニック
- reference index は、特定の概念やプロパティを探して関連する章や節へ移動するときに使える
1件のコメント
Hacker News のコメント
CSS レイアウトを説明するときに最初に言うべきなのは、互いに異なる4つのレイアウト体系があるということです。メールで今も使われている最も古い table、本文中の画像向けの float、現在最もよく使われる flexbox、そして table の現代的な代替である grid です。
absolute と fixed の位置指定も、レイアウトを回避するハックのように使えます。
absoluteとfixedはハックでもなければ、レイアウトを「回避」するものでもありません。どちらも、要素が文書フロー内、または特定のコンテナ内でどのように配置され動作するかを定める5つの位置指定オプションのうちの2つです: https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layou...
floatプロパティは Grid と併用することもできます。最も簡単で基本的なレイアウト体系である通常フローが抜けています: https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layou...実際の HTML table マークアップは、Web ページの一部を横に並べて配置する最も古い方法の一つで、メールでも使われていますが、それは CSS とは別の話です。
CSS には
display: tableと関連する値がありますが、記憶では昔の IE では float より使いにくく、利用も限定的でした。現代の Web でも広く使われているのをほとんど見たことがなく、周辺のマークアップ要件が厳しすぎるせいかもしれません。たとえば順序を変える方法がなく、複数行が必要なら HTML の中にその役割を担う要素を入れなければなりません。古い後方互換の挙動を、合理的なデフォルトに変えてくれるからです。例: https://www.joshwcomeau.com/css/custom-css-reset/#our-finish...
float が「コンテナボックスの左端と右端にボックスを配置するために使われる」という説明は正確ではありません。
float でそうすることはできますが、flexbox と grid が登場してからはそのようには使いません。要素が通常フローから外れるため、CSS を学ぶ人にとってはレイアウトを作るうえで混乱を招く方法です。
floatはレイアウトツールというより組版ツールに近いものです。本文が自ら pedantic だと言うなら、もっと綿密であるべきです。基本的には、他人のコンピュータ上にあるファイルのための Microsoft Word のようなものとして作られたので、
floatのような初期のプロパティの大半は組版レイアウト向けでした。残りのスペースがなければ、前の要素たちの下へ降ります。要素が
display: blockなら横方向のスペースをすべて埋めるので、その後のすべての要素はその下へ浮き上がります。だから名前がfloatであり、要素位置を計算する方式です。float:left|rightを使うと、同じコンテナ内の他の要素より先に、その要素を左または右へ強制的に浮かせます。もちろんコンテナが flex や grid を使っていれば、もはやこのようには動作しません。特に執筆当時には flexbox/grid レイアウトがなかったことを考えれば、十分に綿密な説明だと思います。
複数のプロパティを気にする必要を減らしてくれます: https://flexboxcss.com
特にノートを段落中の参照位置に合わせて揃える必要がある場合はなおさらです。
こういう記事は CSS Grid 以前の記事であっても、気が重く感じられる。CSS Grid が登場してから、CSS レイアウトはさらに複雑になり、Web 開発を10年やっていても CSS はいまだに底が見えない気がする。
動作の仕組み、珍しい例外ケース、内部挙動、膨大な機能数がそうだし、最近その件についての記事も書いた。
Grid Layouting の細部を追いきる前に、subgrid と container queries が出てきた。新しく追加された多くのプロパティは、あまりに特定のケースを扱うものなので、使う機会があるのか疑わしい(
hanging-punctuation、font-paletteなど)。段落のハイフネーション関連のプロパティだけでも少なくとも3つあり、
filterプロパティが SVG を使うまったく別種のフィルターもサポートしていることを知らないかもしれない。画像のスケーリングアルゴリズムを調整することもできるし、border-radiusは楕円形の角もサポートしている。どんな技術についてもこういうことは言えるが、CSS は違う。あまりに多くのことを、あまりに多くの方法で扱い、あまりに多く、あまりに速く変わる: https://shubhamjain.co/2024/02/19/css-impossible-thats-okay/
もっと長く CSS を扱ってきたが、
align-itemsなのかjustify-contentなのかを覚えようともしていないので思い出せない。flexbox を使うとなった瞬間に https://css-tricks.com/snippets/css/a-guide-to-flexbox/ を開く。Grid はさらに覚えていない。それでも何度かぶつぶつ言って WTF となっていれば、欲しいものは十分簡単に作れるので、底が見えないという感じはしない。CSS についてこういう話はよく聞くが、ほとんどの場合、大した努力なしに望むレイアウトを作るのはかなり簡単だと感じる。ただ JS のように CSS を記憶していないだけだ。
どちらもドキュメントがよく整っていて比較的直感的で、特に grid は変わった挙動が少ない。
最近はフローレイアウトを深く知らなくてもよく、float と table レイアウトは完全に飛ばしてもいい。本来の用途だった、テキストコンテンツ内の浮動画像と実際の表にだけ使えばよい。
初めて実際のフロントエンド仕事をしてドルを受け取ったときは、perl から直接 DHTML を生成していた。その略語を打つことすら筋肉記憶のキャッシュからあまりに遠くへ消えてしまい、指がもたつくほどだ。
フロントエンドについては、6歳児が微積分を知っている程度にしか分かっていないので、もう追いつく方法がないように感じる。
ただし plain CSS を使っていて、グローバルなスタイルシートも普通は置かないので、かなり助かっている。
UI アプリを多く開発していて、主に Angular を使っているが、最近は単に Bootstrap や Foundation のようなフレームワークを使っている。
純粋な CSS の膨大なレイアウトオプションは、特にレスポンシブデザインでは圧倒的で頭が痛い。純粋な CSS を試したこともあるが、結局多くのボイラープレートを使い、ミニフレームワークのようなものを作ることになる。
カスタムデザインの Web サイトを作っているのでなければ、車輪の再発明を続ける必要は個人的には感じない。
CSS が必ずしも車輪の再発明というわけではなく、難しいレイアウトや、もともと JS が必要だった作業を、より簡単で強力にできるようにしてくれる。
Bootstrap も悪くないが、高度なレイアウト問題を解決しようとすると、実際にどんなスタイルが適用されているのかを見るために要素の検査をたくさんすることになる。少なくとも自分の経験ではそうだったので、個人的には CSS 側に賭ける。
期待している新機能は
@scopeルールで、スコープ付きスタイルをずっと簡単に作れるようにしてくれそうだ。https://open-props.style/
https://developer.mozilla.org/en-US/docs/Web/CSS/@scope
この記事は CSS Grid と CSS columns 以前に書かれたものなのか?
z-index に関する記事もある: https://philipwalton.com/articles/what-no-one-told-you-about...
第3章で margin collapsing と negative margins を扱っているのを見ると、この記事は古いレイアウト手法の理解を優先している。
レガシーなコードベースを扱うときには価値があるが、新規プロジェクトでは避けたほうがよい。
CSSを深く学ぶ最良の方法は何だろうか? 公式ドキュメントは、何が現在有効で何がそうでないのかが少し奇妙に感じられる
オランダ語では current が
actueel、actual がdaadwerkelijkと訳されることを考えると、十分理解できる。ネイティブが混乱するなら、むしろ助けになるかもしれない特定の学習スタイルに合った話かもしれないが、実際にスタイルやレイアウトをいじってみると、動作の実用的な側面が確実に身につく
CSSを書くときは、できるだけ少なく書くことを目標にしている。CSSが嫌いだからではなく、むしろ不当に悪い評判を受けていると思っているが、宣言を過度に重ねずにレイアウトをより効果的にスタイリングする方法を学べるからだ
CSSの基礎に最も良かった資料は https://web.dev/learn/css で、flexboxとgridも含まれている
デザインガイドラインとしては Refactoring UI を薦める。The UX Book のような本に足りない、実行可能なアドバイスが多い
自分のプロジェクトでは、Refactoring UI の著者による TailwindCSS と Daisy UI コンポーネントを使っていて、実際には raw CSS は書かない。最初は TailwindCSS が inline CSS への退化のように感じられるが、代替手段より単純に良い。一度使ってみることを薦める
[1] https://drafts.csswg.org/
[2] https://developer.mozilla.org/en-US/docs/Web/CSS
前者は新しいWeb開発者向けの学習資料ではない。後者も公式または権威ある文書ではないが、通常はBaselineサポートとブラウザ互換性表に関する情報がある
marginとpaddingをいつ使うかを身につけるとよいスタイルのカスケード適用がどう動作するかも学ぶとよく、それによって SCSS やコンポーネント開発を使って、その大半を気にしなくて済むようにする理由も理解できる
media query と画面サイズ別のターゲティングも身につければよい。何より「CSSで x をする方法」をWeb検索することを恥ずかしがる必要はない。仕様は巨大で覚えることが多く、長い間頻繁に使っていなければすべてを覚えてはいられない