バレンタインチョコレートのイラスト

ブラウザに広くサポートされていない CSS を検証する require-baseline ESLint ルール

Baseline はブラウザで利用可能な JavaScript や CSS のサポート状況を明確化するプロジェクトです。ESLint/CSS の require-baseline ルールを使用することで、Baseline でサポートされていない CSS プロパティや値を検出することができます。

ブラウザによる CSS のサポート状況の差異は、Web 開発者にとって頭痛の種です。新しい CSS プロパティや値を使用する際には、それがどのブラウザでサポートされているかを確認する必要があります。Baseline はそのような問題を解決するためのプロジェクトです。ブラウザで利用可能な JavaScript や CSS のブラウザのサポート状況を明確化することで、Web 開発者が安心して新しい機能を使用できるようになります。

Baseline で「Newly Available」とされている機能は Chrome、Edge、Firefox、Safari などの主要ブラウザでサポートされていることが保証されています。「Widely Available」は、Newly Available になってから 30 ヶ月が経過したものであり、何年も前からブラウザで使われている機能です。「Limited availability」の場合にはいくつかのブラウザでのみサポートされており、Baseline とは言えません。

ESLint/CSSrequire-baseline ルールを使用すると、Baseline でサポートされていない CSS プロパティや値を検出することができます。このルールを導入することで、誤って対象ブラウザにサポートされていない CSS を使用してしまい、画面崩れが発生してしまうリスクを軽減することが期待できます。

実際にルールの設定を試してみましょう。

require-baseline ルールの設定

まずは @eslint/css パッケージをインストールします。あらかじめ ESLint がプロジェクトに導入されていることを前提とします。

Note

@eslint/css は ESLint v9.6.0 以上かつ、Flat Config を使用している場合にのみ利用可能です。

npm install @eslint/css --save-dev

eslint.config.js に以下の設定を追加します。

eslint.config.js
import css from "@eslint/css";
 
export default [
	// CSS ファイルを対象に lint を実行
	{
		files: ["**/*.css"],
		language: "css/css",
		...css.configs.recommended,
	},
 
	// your other configs here
  // ...
];

recommended には以下のルールが含まれています。

  • no-duplicate-imports:重複した @import を許可しない
  • no-empty-blocks:空のブロックを許可しない
  • no-invalid-at-rule:無効な @ ルールを許可しない
  • no-invalid-properties:無効なプロパティを許可しない
  • require-baseline:Baseline でサポートされていないプロパティや値を検出する

デフォルトでは CSS の構文を厳密に検査するモードで実行され、解析エラーが報告されます。しかし TailwindCSS や PostCSS のプラグインなどでカスタム構文を使用している場合に解析エラーが報告されるのは好ましくありません。解析エラーを許可する場合には tolerant オプションを true に設定します。

eslint.config.js
import css from "@eslint/css";
 
export default [
	{
		files: ["**/*.css"],
		plugins: {
			css,
		},
		language: "css/css",
		languageOptions: {
			tolerant: true,
		},
    ...css.configs.recommended,
	},
];

もしくはカスタム構文を設定で追加して解析エラーを回避することもできます。もし TailwindCSS を使用している場合には組み込みの tailwindSyntax オブジェクトを使用できます。

eslint.config.js
import css from "@eslint/css";
import { tailwindSyntax } from "@eslint/css/syntax";
 
export default [
	{
		files: ["**/*.css"],
		plugins: {
			css,
		},
		language: "css/css",
		languageOptions: {
			customSyntax: tailwindSyntax,
		},
    ...css.configs.recommended,
	},
];

require-baseline ルールの確認

require-baseline ルールは以下の CSS を検出した際にエラーを報告します。

  • 「Widely Available」に分類されておらず、@supports ブロックに囲まれていない CSS プロパティもしくは値
  • 「Widely Available」に分類されていない @ ルール
  • 「Widely Available」に分類されていない @media ルール内の条件
  • 「Widely Available」に分類されていない CSS 関数

Baseline のデータは web-features パッケージにより提供されています。web-features のデータが更新されれば、今までエラーとされていたプロパティや値がサポートされるようになる可能性があります。

2025 年 2 月現在「Limited availability」に分類されている field-sizing: content; プロパティを使用してみます。ESLint を実行すると Property 'field-sizing' is not a widely available baseline feature というエラーが報告されます。

textarea {
  /* Property 'field-sizing' is not a widely available baseline feature */
  field-sizing: content;
}

@supports ルールを使用して、field-sizing プロパティがサポートされているかどうかを確認したうえで使用するのであれば、ルールに違反しません。

@supports (field-sizing: content) {
  textarea {
    /** valid */
    field-sizing: content;
  }
}

デフォルトでは「Widely Available」に分類されているプロパティや値のみが利用可能です。「Newly Available」な機能である scrollbar-width プロパティを使用するとエラーがほうこくされます。

textarea {
  /* Property 'scrollbar-width' is not a widely available baseline feature */
  scrollbar-width: thin;
}

available オプションに newly を指定することで、「Newly Available」な機能も許可することができます(デフォルトは widely)。

eslint.config.js
import css from "@eslint/css";
 
export default [
  {
    files: ["**/*.css"],
    plugins: {
      css,
    },
    language: "css/css",
    rules: {
      "css/require-baseline": ["error", { available: "newly" }],
    }
  },
];

まとめ

  • Baseline はブラウザで利用可能な JavaScript や CSS のサポート状況を明確化するプロジェクト
  • ESLint/CSS の require-baseline ルールを使用することで、Baseline でサポートされていない CSS プロパティや値を検出することができる
  • Baseline にサポートされていない CSS であっても、@supports ルールを使用してサポート状況を確認したうえで使用することでルールに違反しない

記事の理解度チェック

以下の問題に答えて、記事の理解を深めましょう。

Baseline でサポートされていない CSS プロパティや値を検出するための ESLint/CSS ルールは何か?

  • require-baseline

    正解!

  • require-css

    もう一度考えてみましょう

  • require-support

    もう一度考えてみましょう

  • require-feature

    もう一度考えてみましょう

Baseline において「Widely Available」に分類されていない CSS プロパティや値を使用する場合に ESLint のエラーを回避する方法として正しいものはどれか?

  • `@supports(...)` ルールのブロック内で使用する

    正解!

  • `@if(...)` ルールのブロック内で使用する

    もう一度考えてみましょう

  • `<!-- [if !IE]> -->` コメント内で使用する

    もう一度考えてみましょう

  • -webkit- プレフィックスを付与する

    もう一度考えてみましょう


Contributors

> GitHub で修正を提案する
この記事をシェアする
はてなブックマークに追加

関連記事