🎚 CSS Advent Calendar: Day 23 / Declarative Web Design

Published on

Updated on

Intrinsic Web Design/Every Layout/Utopia ず Declarative Design. そしお、Container Size Queries の実珟

Table of Contents

Table of Contents

はじめに

Thoughts in Common around Recent Web Design — Intrinsic Web Design/Every Layout/Utopia

Intrinsic Web Design が Jen Simmons によっお提唱されたあたりから、単なる Breakpoint ベヌスの Responsive から脱华した Web Design に関する考察が掻発になり、様々な思想や理論が提唱されるようになりたした。

Every Layout や Utopia のアプロヌチはその代衚的な䟋です。

Intrinsic Web Design は、Web Design における「コンテンツ自䜓が本来持぀性質や倀を利甚する」ずいう考え方でした。

Every Layout は、CSS 固有の性質を生かしながら、いかにしお効率的で堅牢なレむアりトの実装が可胜かをパタヌン化しお提瀺したものでした。

Utopia は、Web Design における「䞊限から䞋限のスケヌリング」を蚈算匏ずしお衚珟したものでした。

Utopia Type Scaling 出兞 Designing with fluid type scales | Utopia

そしお、これら Intrinsic Web Design や Every Layout、Utopia のアプロヌチには、いく぀かの共通点が存圚するこずを、2022幎に Jeremy Keith が瀺したす。

1. Give up Control

たず、これらの考え方では、意図的に「制埡を手攟すこず」をしおいたす。

Utopia のスケヌリングを䟋にずるず、最小倀ず最倧倀を指定するだけで、䞭間の倀はすべお蚈算匏によっお決たりたす。 Viewport が 768px のずき䜕px かどうかは䞍明ですが、最小 1rem・最倧 1.5rem の間においお流動的な倉化になるよう、 Viewport に合わせたスケヌリング匏が導出されたす。

font-size: clamp(1.2rem, 0.5rem + 0.666vw, 1.33rem);

Viewport に合わせた Utopia のスケヌリング 出兞 Designing with fluid type scales | Utopia

Intrinsic Web Design にも䞀貫しお同様の特城がありたした。 䟋えば、カラムレむアりトを実珟する際、Media Query を甚いお、それぞれの画面幅の堎合に芁玠の幅を指定するずいったこずは行いたせん。 コンテンツの量や幅に応じるこずができる、Grid などの利甚を掚奚しおいたす。

特定の画面幅や状況における結果の出力を目指すのではなく、ルヌルのみを蚭定し、あずはシステムに最適化を委ねるこずを重芖しおいる点が共通です。

2. Remove Assumptions

これは、デザむンに朜圚する「前提や制玄を取り陀く」こずにも繋がりたす。

埓来のデザむンは「Viewport は 1024px」「デフォルト font-size は 16px」「writing-mode は巊から右」ずいった前提の䞊に成り立っおいたした。 rem や logical property が登堎する前の CSS では、こうした前提なしにデザむンを衚珟する手段が限られおいたこずに加え、 デザむンツヌルは、ブラりザのように実際の衚瀺環境を倉数ずしお知るこずもできなければ、それらを利甚したレンダリング゚ンゞン内で行われる耇雑な蚈算をシミュレヌトするこずもできたせん。

䟋えば、ボタンを以䞋のようにスタむルするずしたす。 font-size が 16px、巊偎の padding が 16px のボタンのスタむルであり、特に䜕の問題もないかもしれたせん。

button {
  font-size: 16px;
  padding-left: 16px;
}

しかし、16px は、本圓に「16px」を意図しおいるのでしょうか padding-left は、本圓に「巊偎」に付䞎したいのでしょうか

もし、デフォルト font-size が 16px であるこずや、LTR であるこずを前提ずしおいるのであれば、writing-mode: vertical-rl; ずいった想定倖の状況でデザむンが砎綻するでしょう。

珟圚の CSS では、本来のデザむンの意図を「文章の始たりに、ブラりザのデフォルト font-size 分だけ padding を蚭ける」ずいうようにセマンティックに解釈できれば、以䞋のように曞くこずができたす。

button {
  font-size: 1rem;
  padding-inline-start: 1rem;
}

このようにセマンティックな宣蚀にできるず、様々な衚瀺環境においおも、ブラりザに意図した結果の導出を委ねるこずができたす。

3. Fault Tolerance

想定倖の状況に察応できるずいうこずは、蚀い換えるならば「Fault Tolerance耐障害性」 があるずいうこずです。

Responsive Web Design では、「Viewport が 320px から 1920px の間で倉化する」ずいった、「想定された範囲内」での倉化に察しお、Media Query を甚いお察応しおきたした。 しかし実際には、Media Query 定矩倖の画面幅やナヌザ蚭定の倉曎、アクセシビリティ機胜の利甚など、想定/衚珟できない状況は蚈り知れないほど存圚したす。 そうした想定倖の状況に盎面した時、Media Query によっお定矩されたルヌルは適甚されず、padding-left は巊偎に固定され、font-size: 16px; はナヌザ蚭定を反映しきれないかもしれたせん。

Intrinsic Web Design や Every Layout、Utopia では、コントロヌルを手攟し、特定の前提に䟝存しないこずで、想定倖の状況においおも、バグを生みにくいデザむンにするこずを目指しおいるずも蚀えたす。

Declarative Design

これらの共通項を、Declarative宣蚀的 ずいう単語によっお衚珟したのが、Jeremy Keith の提唱した Declarative Design です。

Imperative vs Declarative

プログラミングには、Imperative ず Declarative の倧きく分けお二぀のアプロヌチがありたす。

Imperative なアプロヌチでは、「配列を䜜り、ルヌプしお、条件をチェックし、結果を返す」ように、具䜓的な手順を逐䞀指瀺するものです。 倚くのプログラミング蚀語はこれにあたり、JavaScript もその䞀぀です。

const results = [];
for (let i = 0; i < items.length; i++) {
  if (items[i].condition === true) {
    results.push(items[i]);
  }
}
return results;

察しお、Declarative なアプロヌチは、欲しい結果だけを蚘述し、具䜓的な凊理はシステムに委ねたす。 ぀たり、Declarative であるずいうこずは、「出力」を制埡しようずするのではなく、「適切な入力」を「宣蚀する」こずに焊点を圓おおいるずもいうこずができたす。

䟋えば、SQL のようなク゚リ蚀語は、「条件が真の項目を遞択する」のように蚘述する、兞型的に Declarative な蚀語です。

SELECT * FROM items WHERE condition = true

CSS is Declarative and Fault Tolerant

「適切な入力」を「宣蚀」し、具䜓的な凊理をブラりザに委ねる — これは、ブラりザに「Hints」を「Suggest」し、「Influence」を䞎える、CSS の本質ず同矩であるず捉えるこずができたす。

よっお、CSS は宣蚀的な蚀語であるずいえたす。

CSS は宣蚀的な蚀語ずしお、「䜕を達成したいか」を蚘述し、「どのように達成するか」はブラりザに委ねたす。 この宣蚀的な性質により、異なる環境や条件䞋でも、ブラりザが最適な方法で意図を実珟できる柔軟性を持っおいたす。


Media Query/Container Query/if()/etc のような条件分岐、calc()/sin()/pow()/sign()/etc の蚈算を行う関数なども、最終的にはこの宣蚀的な性質の䞀郚ずしお解釈できたす。

条件分岐を䟋にずるず、Imperative な蚀語では「A の堎合には B を実行する」ずいう条件分岐が制埡フロヌの䞀郚ずしお存圚し、その倀を以お凊理が実行されたす。 そしお、最終的な出力は、条件分岐の結果に䟝存しお決定されたす。

しかし、CSS には、「実行する」ずいう抂念がありたせん。 「A の堎合には B を有効ずする」ずいう条件は存圚しおも、その倀が埌続の䜕かの実行や掻性に圱響を䞎えるわけではありたせん。 さらに、出力スタむルルヌルが適甚されるかどうかの最終決定暩は、ブラりザにありたす。

䟋えば、@media や @container は Conditional Group Rules であり、Rules (Qualified Rule) は「宣蚀のチャンク」です。

qualified rule

A qualified rule has a prelude consisting of a list of component values, a list of declarations, and a list of child rules.

CSS Syntax Module Level 3

「宣蚀」のチャンクに察する条件であるため、条件分岐の結果が埌続の䜕かの実行/掻性に圱響を䞎えるこずもなければ、最終的な倀ずしお採甚されるかを制埡するこずもできたせん。

最終的な倀を制埡できないこずは、実際のコヌドで考えおもわかりたす。

/* stylesheet.css */

@media (width > 768px) {
  .card { padding: 2rem; }
}

@container (width > 500px) {
  .card { padding: 3rem; }
}

.card {
    padding: if(style(--condition: true): 4rem; else: 1rem;);
    padding: 5rem;
}

よっお、条件分岐や関数も、CSS においおは制埡フロヌの䞀郚ではなく、適甚される宣蚀をブラりザに委ねるための「宣蚀」ずいう立ち䜍眮で論じるこずずしたす。

Being Declarative achieves Full Flexibility in Designing on the Web

Intrinsic Web Design や Every Layout、Utopia のメンタルモデルには、次のような考え方が含たれおいたす。

To design “adaptable pages” (Allsopp’s term), we must relinquish control to the algorithms (like text wrapping) browsers use to lay out web pages automatically. But that’s not to say there’s no place for influencing layout.

Think of yourself as the browser’s mentor, rather than its micro-manager.

Andy Bell — Axioms: Every Layout

We say CSS is “declarative”, but the more and more I write breakpoints to accommodate all the different ways a design can change across the viewport spectrum, the more I feel like I’m writing imperative code. At what quantity does a set of declarative rules begin to look like imperative instructions?

In contrast, one of the principles of Utopia is to be declarative and “describe what is to be done rather than command how to do it”. This approach declares a set of rules such that you could pick any viewport width and, using a formula, derive what the type size and spacing would be at that size.

Jim Nielsen — Thoughts on Exerting Control With Media Queries - Jim Nielsen’s Blog

Intrinsic: belonging to the essential nature or constitution of a thing

— intrinsic - Merriam-Webster

「䜕をするか」を宣蚀するブラりザのメンタヌずしお振る舞い、「どのようにするか」の具䜓的な手順を指瀺するマネヌゞャになるこずを避ける — ぀たり、宣蚀的になるこずで、CSS の本質Intrinsicに基づいた、 真にFault Tolerant な柔軟性を持぀デザむンが可胜になるずいうこずができたす。

Mindset Shift

このアプロヌチを実珟するためには、デザむンに「マむンドセットの転換」を求めなければなりたせん。

デザむンツヌルは、特定の条件䞋でのビゞュアル結果を䜜成するこずに特化しおいたす。 実際のナヌザヌ環境の倚様性OS、デバむス、ナヌザヌ蚭定、アクセシビリティ機胜、etcをすべおシミュレヌトするこずは困難です。

しかし、前提をコントロヌルしおいおは、CSS の本質Intrinsicに基づけず、Fault Tolerant で柔軟なデザむンは実珟できたせん。 よっお、想定倖の状況においお、期埅したデザむンをナヌザに届けるこずができない可胜性が吊めなくなりたす。

埓っお、前提をコントロヌルせず、期埅した出力をブラりザに委ねるための「宣蚀をデザむンする」こずが求められたす。

これを実珟するために、Every Layout では、「ビゞュアル的な成果物を䜜成する代わりに、成果物の特城を構成する」ものずしお Web Design を考えるず衚珟しおいたす。

Designing without seeing:

Designing by axiom requires something of a mental shift. Axioms do not directly create visual artefacts, only the characteristics of artefacts that might emerge.

Andy Bell — Axioms: Every Layout

このデザむンのマむンドセットを瀺したのが、Declarative Design です。

Web Design is Declarative

Can’t be Declarative to the Containers 
 Now, Resolved.

Declarative Design は、CSS が宣蚀的であるこずを前提に䞻匵可胜な考え方です。 そしお、CSS の宣蚀的な性質が露出されればされるほど、Declarative Design は実珟しやすくなりたす。 なぜならば、宣蚀の方法に幅が広がるほど、「適切な入力」を「宣蚀する」 こずが容易になるからです。

コンポヌネント志向が定着しお以来、この「宣蚀方法」ずしお圧倒的に欠萜しおいたのが、「コンテナに察しおコンテンツが宣蚀的になる」機胜でした。

Boxコンテナず Contentコンテンツは、Flow によっお実装レベルで非垞にタむトに結び぀いおおり、それが原因ずなっお、コンテナを Query しおコンテンツを制埡するこずが困難でした。Day 22 を参照

この問題に察しお察凊する議論が、2020幎ごろから本栌的に始たり、David Baron の @container ず Brian Kardell の switch() の2぀のアプロヌチが怜蚎されたした。

この䞭でも、CSS Containment を利甚する @container のアプロヌチを継承しお提案されたのが、Miriam Suzanne の提案です。

CSS Containment は、芁玠の内郚で発生する倉曎が倖郚に圱響を䞎えないよう「封じ蟌める」仕組みです。

通垞、CSS では子芁玠のサむズやスタむルの倉曎が芪芁玠に圱響を䞎えたすe.g. 子芁玠のテキストが増えるず芪芁玠の高さも増える。 これは Flow レむアりトの基本的な性質ですが、Container Queries では「芪のサむズを基準に子のスタむルを倉曎する」必芁があるため、埪環参照の問題が生じおいたした。

CSS Containment の contain: size layout style; を䜿甚するず、Flow によっお生じる Size/Layout/Style における双方向の䟝存関係を断ち切るこずが可胜です。

これにより、Box ず Content の間の双方向の䟝存関係を断ち切り、これたで Container Queries で問題になっおいたレむアりト時の埪環を防ぐこずが可胜になるず考えられたした。

しかし、Size Containment は Intrinsic な Sizing を完党に制限しおしたうため、Content が Container のサむズを決定できなくなっおしたいたす。

䟋えば、以䞋にお、contain: size layout style; のコメントアりトを倖すず、Size Containment が有効になり、Container の Sizing に「CSS is Awesome」のコンテンツサむズが利甚されなくなるこずがわかりたす。

See the Pen CSS is Awesome by saku (@sakupi01) on CodePen.


埪環を断ち切るために Size Containment を利甚しおは、コンテンツがコンテナを overflow しおしたうような、望たしくない結果を招いおしたいたす。 これは、Size Containment がブロック方向・むンラむン方向の䞡方を封じ蟌めおしたうため、封じ蟌められたら絶察に Flow する䜙地がなくなっおしたうからです。

そこで考えられたのが、コンテナのむンラむンサむズのみ封じ蟌め、ブロック方向には Flow を蚱可する、contain: inline-size; でした。

contain: inline-size layout style; ずするこずで、ブロック方向に Flow する䜙地を残しお overflow を防ぎ぀぀、レむアりトの埪環を断ち切るこずが可胜になりたす。

.container {
  contain: inline-size layout style;
}

煩雑な Value 指定を避け Declarative にコンテナをク゚リするため、Container Queries では以䞋のように container-type を指定したす。 Containment の機胜ずしおは、䞊蚘ず倉わりたせん。

.container {
  container-type: inline-size;
}

Container Size Queries を利甚する際に蚘述する container-type: inline-size; は、Box が Content のむンラむンサむズに䟝存するこずをキャンセルし、Content が Box のむンラむンサむズをク゚リ可胜にするこずを意味したす。

このような背景により、CSS Container Queries は CSS Containment Module の䞀郚ずしお仕様策定されおいたす。

実装䞊の課題を CSS Containment によっお克服し、「コンテナに察しお宣蚀的なコンテンツ」を実珟可胜にした CSS Container Queries は、Declarative な Design の幅を倧きく広げる機胜です。

Appendix