Now and Next Generation of CSS Cascading Model

13.5K Views

November 18, 23

スライド概要

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Now and Next Generation of CSS Cascading Model araya @arayaryoma FRONTEND CONFERENCE OKINAWA 2023 araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

2.

自己紹介 araya / Ryoma Abe x.com/arayaryoma github.com/arayaryoma bsky.app/profile/araya.dev Web standardsやBrowser APIが好き 今日はCSSの新しめの仕様について 話します araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023 2020年4月 日経入社 日経電子版のWeb開発

3.

Agenda 1. 誰しもが一度は通る道なアレ 2. CSSのcascadeについておさらい 3. Layerとは 4. Scopeとは 5. これからのCSSとどう付き合う? slide: araya.dev/slides/fec-okinawa-2023 araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

4.

みんな(?)一回はやってる 結果 Modal 1を上に置きたい なんらかのCSSライブラリ lib.css なんかz-index効いてない araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

5.

CSSで、魔法のコトバといえば? araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

6.

!important araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

7.

とりあえず !important !importantはすべてを解決する!!(?) 結果 lib.css -> !important地獄へ araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

8.

正々堂々(?) specificity(詳細度)で勝負 結果 lib.css -> 詳細度を上げるために無駄にclassやidを増やしまくる戦いへ araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

9.

CSSの宣言の順位付け araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

10.

CSSの宣言の順位付け CSSの宣言の順位付けの決定についての仕様はW3CのCSS Cascading and Inheritance というmodule で定義されている ● 現状読むべきなのはLevel4~Level6 ○ https://www.w3.org/TR/css-cascade-4/ ○ https://www.w3.org/TR/css-cascade-5/ ○ https://www.w3.org/TR/css-cascade-6/ araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

11.

CSSの宣言の順位付け - css-cascade-4 1. Origin and Importance 2. Context 3. Specificity 4. Order of Appearance araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023 この順に評価されていく

12.

CSSの宣言の順位付け - css-cascade-5 1. Origin and Importance 2. Context 3. Element-Attached Styles 4. Layers 5. Specificity 6. Order of Appearance araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023 この順に評価されていく

13.

CSSの宣言の順位付け - css-cascade-6 1. Origin and Importance 2. Context 3. The Style Attribute 4. Layers 5. Strong Scoping Proximity 6. Specificity 7. Weak Scoping Proximity 8. Order of Appearance araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023 この順に評価されていく

14.

Level4までで定義されていた概念の復習 araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

15.

Origin and Importance スタイルシートがどこで宣言されているか。Origin間と!importの有無で優先度の強弱がある 1. Transition declarations 2. Important user agent declarations 3. Important user declarations 4. Important author declarations 5. Animation declarations 6. Normal author declarations 7. Normal user declarations 8. Normal user agent declarations araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

16.

Context ShadowDOMなどのカプセル化されたコンテキスト ShadowDOMに、ShadowDOM外からstyleを差し込んでいる場合、!importantなしでは外側のコンテ キストに由来する宣言が勝ち、!importantでは内側のコンテキストに由来する宣言が勝つ araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

17.

Specificity CSSセレクターの詳細度 詳細度自体の仕様はSelectors moduleで定義されている 詳細度の強さの例: ( `>` はセレクタではなく強弱を表している) ● h1 > * ● .heading > h1 ● h1.heading > .heading ● h1#foo.heading > h1.heading araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

18.

Order of Appearance 宣言の出現順 後ろに現れたものが優先される 右の例では z-index:10; が使われる araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023 lib.css

19.

CSSの宣言の順位付け - css-cascade-5 1. Origin and Importance 2. Context 3. Element-Attached Styles 4. Layers 5. Specificity 6. Order of Appearance araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

20.

新しい概念1 - Layer araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

21.

Layer CSS Cascading and Inheritance Level 5で追加された概念 Originsのように、stylesheetがどこに属するかによって優先度を決定づけする仕組みをauthorに提供 する stylesheetにlayerを指定する方法は@layer 宣言と@import 宣言での layer 付与の2つ layerを宣言しなかった宣言については暗黙的に”final” layerとして扱われる araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

22.

Layer - 宣言の仕方 araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

23.

Layer - 優先度との関与 final layer > explicit layer 右の例では color: blue; が優先される araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

24.

Layer - 優先度との関与 異なるlayerにある同一の宣言は 後に定義されたlayerが優先される layerの宣言時にlibよりもoverrideのほうが 後になっているため、lib layer内の宣言は override layer内の宣言に負ける araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

25.

modalの例をlayerで解決してみる 結果 lib.css araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

26.

新しい概念2 - Scope araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

27.

Scope CSS Cascading and Inheritance Level 6で策定中の概念 Document Treeにおいて、stylesheetを適用する範囲を定義することができる 例: main が scope root, .contents が scope limits となる araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

28.

@scopeでのscope定義例 araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023 結果

29.

@scopeでのscope定義例 - limit付き 結果 .nav-bar から .sub-list までのscope にあるulにlist-style: noneを適用 (境界は含まない) araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

30.

@scopeでのscope定義例 - limit付き 結果 nav.nav-bar ul li li ul.sub-list li araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

31.

style elementでの定義 結果 nav.nav-bar ul li li ul.sub-list li araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

32.

scopeが重なる宣言はどうなる? 結果 div.root nav.nav-bar ul li li ul.sub-list li araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

33.

scopeが重なる宣言はどうなる? 結果 div.root nav.nav-bar ul li li ul.sub-list “scope proximity” の近いものが優先 .nav-bar > ul > li から見ると一番近いscopeに定義されている styleは `list-style: none` li araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

34.

Strong or Weak proximity? scopeのproximityをspecificityよりも先に見るか https://github.com/w3c/csswg-drafts/issues /6790 issueはopenだが、Chromeはweakでshipしてお り、W3Cの議論でもweakでまとまった様子 冒頭に話したcascadeの順序は整理されるはず araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

35.

Layer と Scope とどう付き合うか araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

36.

実装状況 - Layer 各ブラウザでship済み これより下のバージョンをサポートしたい場合は @csstools/postcss-cascade-layers でトランスパイル可能 araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

37.

実装状況 - Scope Chrome系のブラウザでship済み Safariはサポート予定 https://github.com/WebKit/standards-positions/issues/13 Firefoxは議論中 https://github.com/mozilla/standards-positions/issues/472 specもまだ固まり切っていなくpostcssのpluginもないのでまだ実験以上に実用するのは難しい araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

38.

LayerとScope(発表者の見解) ● 具体的な事例はこれから出てくる ● LayerはCSS libraryとサービスstylesheetの強弱関係を明示することに役立つ ● Scopeはcomponent libraryの実装側に相性がいい ○ ビルド時にclassやattrにhash値を入れる必要がなくなる ○ sourcemapsがなくともソースと成果物の対応がつけやすくなる ■ ○ ● が、grepのしやすさはBEMなどのほうがいいかもしれない ブラウザ拡張などでのstylesheet上書きに対してフレンドリーに フロントエンド開発におけるCSS-in-JS/CSS modules問題に対しての1つの解答 araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023

39.

まとめ ● !import書かない、詳細度で戦わない、命名ルール頑張らない、hash値のclassいらない、 未来のCSS ● Scope, Layerの概念説明はしましたがspecificityやnestなど細かい仕様については説明を削った のでぜひMDNやdraftを読んでみてください ● ○ https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Cascade_layers ○ https://www.w3.org/TR/css-cascade-5/#cascade-layers ○ https://drafts.csswg.org/css-cascade-6/#scoped-styles ユースケースや活用事例については我々CSSを書くエンジニアが探っていく araya @arayaryoma - FRONTEND CONFERENCE OKINAWA 2023