1. はじめに
CSS 2.1 [CSS21] では、 初期包含ブロックが 連続メディアの場合に ビューポートのサイズで定義されます。 ビューポートは一般的に表示領域以上になることはないため、スマートフォンやタブレットのような小さな画面を持つデバイスは、 デスクトップやノートPCなどの大きなデバイスよりも小さなビューポートを持つことになります。
しかし、多くのドキュメントは歴史的に大きなビューポートを前提に設計されてきたため、 小さなビューポートで表示した際に様々な不具合が発生します。 これには、意図しないレイアウトの折り返し、コンテンツの切り捨て、スクロール範囲の問題、 スクリプトエラーなどが含まれます。これらの問題を回避するため、モバイルブラウザは一般的に デスクトップブラウザのウィンドウサイズ(おおよそ980~1024px)を模倣した 固定の初期包含ブロック幅を使用します。この結果、レイアウトは画面に収まるよう縮小されます。
この方法は上述の問題を緩和しますが、縮小されることでCSSピクセルサイズは CSS 2.1で推奨される値より小さくなります。 ユーザーは快適に閲覧するためにコンテンツを拡大表示(ズーム)する必要がある場合があります。
このような対策は、小さなビューポートでも適切に動作するように設計されたサイトでは不要です。
この仕様書は実装者視点から記述されており、読みづらい部分があります。 異なる読者層のためにも理解しやすくするための編集作業が必要かもしれません。 また、各種JS APIがどのビューポートを指しているかも明確化すべきです。 これらの課題の詳細な議論はppkのこのブログ記事にあります。
この仕様や関連仕様に関する様々な課題は このレポート にリストされています。
2. ビューポート
CSS 2.1 において ビューポートは、 連続メディアのためのユーザーエージェントの機能であり、 連続メディアの初期包含ブロックの基準として使われます。 ページメディアでは、初期包含ブロックはページ領域を基準とします。 ページ領域は@pageルールで設定できます。
本仕様は、ユーザーエージェント(UA)が提供するビューポートのサイズを上書きする方法を示します。 そのため、初期ビューポートと実際のビューポートの違いについて説明する必要があります。
- 初期ビューポート
- これはUAのウィンドウや表示領域によって与えられるビューポートが、 UAや著者のスタイルによって上書きされる前の状態を指します。 初期ビューポートのサイズはウィンドウや表示領域のサイズが変化すると連動して変化します。
- 実際のビューポート
- これはビューポートの
<meta>タグの処理後に得られるビューポートを指します。
実際のビューポートをレイアウトビューポートとし、「visual viewport」を定義する。
実際のビューポートがウィンドウや表示領域に収まらない場合、つまり 実際のビューポートが初期ビューポートより大きい場合や ズーム係数により実際のビューポートの一部のみが表示される場合、UAはスクロール・パン操作を提供すべきです。
文書の基本方向がltrの場合は、最初は実際のビューポートと
ウィンドウまたは表示領域の左上を揃えることが推奨されます。rtlの場合は右上を揃えます。
文書の基本方向は、HTMLやXHTML文書では最初の<BODY>要素のdirectionプロパティの計算値とし、他の文書型ではルート要素の
directionプロパティの計算値です。
3. ビューポート <meta> 要素
3.1. プロパティ
ビューポートの<meta>要素で認識されるプロパティは以下の通りです:
widthheightinitial-scaleminimum-scalemaximum-scaleuser-scalableinteractive-widget
3.2. パースアルゴリズム
以下は、iPhoneのSafariでテストした<meta>タグのcontent属性の
パースアルゴリズムです。テスト環境はiPhone OS 4搭載iPod touch。
ブラウザUA文字列:
"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_0 like Mac OS X;
en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5
Mobile/8A293 Safari/6531.22.7"
です。
疑似コード表記は[Algorithms]の記法に基づいています。
whitespaceクラスには以下(ascii)の文字が含まれます:
- 水平タブ (0x09)
- 改行 (0x0a)
- 復帰 (0x0d)
- スペース (0x20)
プロパティ/値ペアの区切りとしてSafari実装ではカンマを認識します。 一部実装ではカンマとセミコロン両方がサポートされてきました。 そのため既存コンテンツにはセミコロンが使われることがありますが、 著者はすべてのUAで意図通り動作するようカンマを用いるべきです。 実装者側では互換性のため両方の区切り文字をサポートしても構いません。
separatorクラスには以下(ascii)の文字が含まれます。推奨区切りはカンマ、セミコロンは任意:
- カンマ (0x2c)
- セミコロン (0x3b)
Parse-Content(S) i ← 1 while i ≤ length[S] do while i ≤ length[S] and S[i] in [whitespace, separator, '='] do i ← i + 1 if i ≤ length[S] then i ← Parse-Property(S, i) Parse-Property(S, i) start ← i while i ≤ length[S] and S[i] not in [whitespace, separator, '='] do i ← i + 1 if i > length[S] or S[i] in [separator] then return i property-name ← S[start .. (i - 1)] while i ≤ length[S] and S[i] not in [separator, '='] do i ← i + 1 if i > length[S] or S[i] in [separator] then return i while i ≤ length[S] and S[i] in [whitespace, '='] do i ← i + 1 if i > length[S] or S[i] in [separator] then return i start ← i while i ≤ length[S] and S[i] not in [whitespace, separator, '='] do i ← i + 1 property-value ← S[start .. (i - 1)] Set-Property(property-name, property-value) return i
Set-Property はリストされたプロパティ名と
大文字小文字を区別せずに一致します。
property-valueの解釈は次の通りです:
property-valueの先頭がstrtodで数値に変換できる場合、 その値を使用します。残りの文字列は無視します。- 上記で数値に変換できない場合は
property-value文字列全体を以下の文字列と大文字小文字区別せず 比較します:yes、no、device-width、device-height - いずれとも一致しなかった場合、その値は未知とみなします。
3.3. extend-to-zoom
viewport metaタグによるextend-to-zoomの動作仕様の記述
3.4. interactive-widget
visual viewportの定義をCSSOM-Viewからこの仕様へ移動
interactive-widgetプロパティは、インタラクティブなUIウィジェットがページのビューポートに対して与える影響を指定します。
このプロパティで、ウィジェットが指定ビューポートと重なるのか、それともウィジェットが表示されている間もビューポート全体が見えるように縮小するのか決定できます。
インタラクティブUIウィジェットは、ユーザーが入力できる一時的なユーザーエージェントまたはOSのUIです。
interactive-widgetの有効な値とそのビューポートリサイズ動作の一覧:
overlays-content- インタラクティブUIウィジェットはリサイズしてはならず、初期ビューポートや
visual viewportには影響しません。ユーザーエージェントは
VirtualKeyboard.overlaysContentがtrueの場合と同様の手順を踏みます。 resizes-content- インタラクティブUIウィジェットはリサイズして 初期ビューポートに影響を与えます。
resizes-visual- インタラクティブUIウィジェットはリサイズで visual viewportにのみ影響を与え、 リサイズで初期ビューポートには影響しません。
interactive-widgetに値が指定されていない、または無効値の場合は、 resizes-visualの動作がデフォルトとして使われます。
インタラクティブウィジェットによるビューポートのリサイズとは、 ビューポート矩形とウィジェットのOSが報告する外接矩形との交差領域を差し引くことです。 この結果ビューポートが長方形でなくなる場合、挙動はユーザーエージェント任意とされます。
3.4.1. virtualKeyboard.overlaysContent との連携
[VIRTUAL-KEYBOARD]は
overlays-content挙動を適用するAPIを提供します。
これはVirtualKeyboard.overlaysContent
属性で操作可能です。この属性はinteractive-widgetで設定された値より優先され、以下の通り動作します:
VirtualKeyboard.overlaysContent
がtrueの場合、UAはインタラクティブウィジェットのリサイズ判断時に
interactive-widgetで指定した値を無視しなければなりません。
VirtualKeyboard.overlaysContent
がfalseの場合、UAは
interactive-widgetで指定された値、または指定がなければデフォルト挙動を
用いてインタラクティブウィジェットのリサイズ挙動を決定しなければなりません。
VirtualKeyboard.overlaysContent
の値取得は、以前に設定された値のみ返さなければなりません。
VirtualKeyboard.overlaysContentは
<meta>タグでinteractive-widget=overlays-contentが設定されていてもfalseを返します。
付録A. 変更点
この付録は参考情報です。
2016年3月29日ワーキングドラフト以降
- ビューポートメタにinteractive-widgetsプロパティを追加
- @viewportルールを削除
- 仕様名をdevice-adaptからcss-viewportに改名
- CSSViewportRuleをWindowに公開
2011年9月15日初回公開ワーキングドラフト以降
- 様々な編集的修正と明確化の実施
- OMインターフェース追加
- メタビューポートにセミコロン区切り追加
- UAスタイルシートの章追加
- orientationプロパティを尊重する場面の推奨追加
- resolutionデスクリプタ廃止
- width/heightとzoomを分離し、メタビューポート変換用にextend-to-zoom値を導入
- @viewportと@mediaの連携に関する規範的なルール追加
- <viewport-length>やzoom値に0を許容
- device-width/heightサポートを削除
- @viewportはトップレベル文書のみに適用
- [CSS3-CONDITIONAL]拡張部分を@mediaの入れ子用に採用し、CSS21には依存しない形に
- @viewport 削除