• CSSの@supportsはpropertyと値の対応可否でstyleを切り替える

CSSの@supportsはpropertyと値の対応可否でstyleを切り替える

公開日: 執筆:佐藤

@supportsは、指定したCSSのpropertyと値に対応する場合だけ、group内のstyleを適用する規則です。未対応環境でも必要な情報を読める基本表示を先に書き、追加のlayoutや装飾だけを@supportsの中へ置きます。

先に新しいstyleを書いてから未対応環境を直すのではなく、基本表示を正本にします。@supportsはbrowser名を判定する仕組みではなく、使いたい宣言そのものを条件にする仕組みです。

propertyと値を一組で条件にする

W3CのCSS Conditional Rules Module Level 3では、@supportsをCSSのpropertyと値への対応を調べるconditional group ruleとして定めています。条件がtrueならgroup内のruleを適用し、falseなら適用しません。

条件には、確認したい宣言を丸括弧へ入れます。

@supports (display: flex) {
  .service-list {
    display: flex;
  }
}

この条件が調べるのは、displayというproperty名だけではありません。flexという値を含む宣言をCSS processorがsupportするかを調べます。property名だけを見て対応済みと判断しない点が重要です。

基本表示を条件の外へ置く

次は、service一覧を縦に並べる基本表示を残し、対応環境だけ横並びへ変える説明用の仮例です。

.service-list {
  display: block;
}

.service-item {
  margin-bottom: 1rem;
}

@supports (display: flex) {
  .service-list {
    display: flex;
  }

  .service-item {
    margin-right: 1rem;
    margin-bottom: 0;
  }
}

@supportsへ対応しない環境や、条件がfalseになる環境には、外側の基本表示が残ります。文章、link、操作などの必要な機能を条件内だけへ置かないでください。

追加styleを消した状態でも読めることを確認してから、条件内のlayoutを試します。fallbackを「古いbrowser向けの別site」と考えると、管理する実装が増えます。同じHTMLと基本CSSを保ち、追加部分だけを条件化するほうが確認範囲を限定できます。

and、or、notは必要な条件だけに使う

複数の宣言がそろう場合だけ適用するならand、どちらか一方へ対応すればよいならor、対応しない場合を示すならnotを使えます。

@supports (display: flex) and (flex-wrap: wrap) {
  .service-list {
    display: flex;
    flex-wrap: wrap;
  }
}

各宣言は丸括弧へ入れ、andやorの前後には空白を置きます。andとorを同じ階層で混ぜる場合は、評価したいまとまりをさらに丸括弧で囲みます。

条件を増やす前に、本当に一組で必要かを確かめてください。一つのpropertyだけで成立するstyleへ三つの条件を付けると、どの条件で適用されなかったのか調べにくくなります。

trueでも画面全体の正しさまでは証明しない

@supportsがtrueになることは、指定したpropertyと値をCSS processorがsupportするという判定です。複雑なlayoutが設計どおりに見えること、すべての操作方法で使えること、処理が速いことまで証明するものではありません。

実際の画面では、文字量、画像寸法、親要素の幅、ほかのCSSとのcascadeが影響します。条件へ対応する環境と基本表示になる環境の両方で、内容の順序、link、form、keyboard操作を確認します。

制作を委託する場合は、「未対応browserでも同じ見た目にする」とだけ依頼せず、基本表示で残す機能と、対応時に追加する見た目を分けて渡します。CSSを書く作業を委託しても、どの環境を確認対象にするか、基本表示で何を保証するかはsite側が決めます。

最初の一手は、新しいpropertyを使う箇所を一つ選び、その宣言を削除しても内容と操作が残る基本表示を作ることです。その後、確認したいpropertyと値を一組だけ@supportsへ入れてください。

戻る