【PR】を含みます。

フロントエンド

CSSプロパティの順番をStylelintで統一する方法|設定例つき

CSSプロパティの順番をStylelintで統一する方法|設定例つき

CSSを書いていると、プロパティをどの順番で並べるか迷ったり、案件やチームごとに書き方がばらついたりしがちです。

CSSプロパティの順番は Stylelint と stylelint-order で管理するのがおすすめです。ルールを設定ファイルとして残せるうえ、違反の検出や自動修正もしやすくなります。

この記事では、StylelintでCSSプロパティ順序を管理する考え方から、stylelint-orderの導入方法、設定例、VS Codeでの使い方までまとめて解説します。

プロパティをどんな順番で並べるか迷っている場合は、先に以下の記事を読んでおくと考えがまとまります。

あわせて読む
CSS プロパティの記述順序の決め方|おすすめの並び順を解説

【CSS】プロパティの記述順序の決め方|おすすめの並び順を解説

CSSを書いていて、「なんとなく書いたけど、あとから見返したら読みにくい…」と感じたことはありませんか? CSSは自由度が高いぶん、同じ見た目でも書き方が人によって変わりやすく、プロパティの並び方がバ ...

Stylelintとstylelint-orderとは?

Stylelintは、CSSのエラー検出やコーディング規約の統一に使えるLinterです。

そしてstylelint-orderは、その中でも並び順に関するルールを追加するプラグインです。CSSプロパティの順序を管理したいなら、Stylelint本体に加えてstylelint-orderもあわせて導入します。

この記事は Stylelint 17系stylelint-order 8系 / stylelint-config-standard 40系)を前提に書いています(2026年6月時点の最新)。Stylelint 16以降は設定ファイルを export default 形式で書くスタイルが標準で、本記事の設定例もこの形式です。

ツール役割
StylelintCSS全体のLintを行う本体
stylelint-orderプロパティ順序などの order 系ルールを追加するプラグイン

それぞれの詳しい仕様は、Stylelint公式ドキュメントstylelint-order(GitHub)で確認できます。

PrettierとStylelintの違い

コード整形ではPrettierもよく使われますが、プロパティ順序の管理はStylelint系が向いています。

Prettierが整えるのは改行・インデント・クォートといった見た目の部分です。一方Stylelintは、ルール違反やコーディング規約をチェックするLinterなので、プロパティ順序のような独自ルールと相性がよいです。

コードの自動整形については、以下の記事でまとめています。

あわせて読む
VS Code 拡張機能で自動整形する方法|保存時フォーマットの設定も解説

【VS Code】拡張機能で自動整形する方法|保存時フォーマットの設定も解説

VS Codeでコードを書いていると、インデントや改行位置がばらついて見づらくなることがあります。 特にフリーランスや複数案件を行き来する働き方だと、現場が変わるたびにVS Codeの設定を見直す場面 ...

CSSプロパティの順番をStylelintで管理するメリット

プロパティの並び順に絶対の正解はありません。ただ、案件やチームで順序がばらつくと、レビューや保守のたびにコードが読みづらくなりがちです。

Stylelintで管理すると、次のようなメリットがあります。

  • 並び順のルールをファイルとして残せる
  • 人による書き方のぶれを減らせる
  • レビューで順序の指摘を減らせる
  • 自動修正まで設定しておけば、手作業を減らせる

Stylelintを導入する手順

まずは、使いたいプロジェクトのフォルダで、Stylelint本体とプロパティ順序を管理する stylelint-order をインストールします。

StylelintはNode.jsの上で動くツールです。インストールに使う npm はNode.jsに付いてくるので、先にNode.jsを入れておきましょう。ターミナルで node -v と打ってバージョン番号が表示されればインストール済みです。まだの場合は、次の記事を参考に用意してください。

あわせて読む
Windows Node.jsのインストール手順

【Windows】Node.jsのインストール手順

WindowsパソコンにNode.jsをインストールしたい方のために、公式サイトからのダウンロード方法からインストール手順、そしてインストール後の動作確認方法まで、初心者にも分かりやすく丁寧に解説しま ...

Command
Copy
npm install -D stylelint stylelint-config-standard stylelint-order

-Dは開発用のパッケージとしてインストールする指定です。Stylelintは開発中に使うツールなので、この形で問題ありません。

続いて、package.json があるフォルダに stylelint.config.mjs を作成します。export default を使うときは拡張子を .mjs にしておくと、モジュール形式がはっきりして、環境による読み込みエラーを避けられます。

stylelint.config.mjs
Copy
/** @type {import('stylelint').Config} */
export default {
  extends: ['stylelint-config-standard'],
  plugins: ['stylelint-order']
};

まずは最小構成で試す

最初から細かいグループ分けを作り込む必要はありません。まずはこの最小構成でStylelintが正しく動くことを確認し、そのあと案件やチームのルールに合わせて調整していくと、つまずきにくくなります。

CSSプロパティ順序の設定例

プロパティの順番を管理するには、stylelint.config.mjsrules に設定を追加します。すでに作成済みなら、そのファイルに追記してください。

まずはシンプルな形から見てみましょう。並べたい順にプロパティ名を配列で渡すだけでも動きます。書いていないプロパティは、unspecified: 'bottomAlphabetical' を指定しているので末尾にアルファベット順で並びます。

stylelint.config.mjs
Copy
/** @type {import('stylelint').Config} */
export default {
  extends: ['stylelint-config-standard'],
  plugins: ['stylelint-order'],
  rules: {
    'order/properties-order': [
      ['display', 'position', 'width', 'height', 'margin', 'padding', 'color', 'background'],
      { unspecified: 'bottomAlphabetical' }
    ]
  }
};

これだけでも運用を始められます。チームのルールが固まってきたら、次のようにグループごとに分けて、より細かく並び順を指定できます。groupName はグループの目印、emptyLineBefore: 'never' はグループ内に余計な空行を入れない指定です。

stylelint.config.mjs
Copy
/** @type {import('stylelint').Config} */
export default {
  extends: ['stylelint-config-standard'],
  plugins: ['stylelint-order'],
  rules: {
    'order/properties-order': [
      [
        {
          groupName: 'レイアウト・表示モード',
          emptyLineBefore: 'never',
          properties: [
            'display',
            'visibility',
            'position',
            'z-index',
            'inset',
            'top',
            'right',
            'bottom',
            'left',
            'float',
            'clear'
          ]
        },
        {
          groupName: 'Flex / Grid',
          emptyLineBefore: 'never',
          properties: [
            'flex',
            'flex-grow',
            'flex-shrink',
            'flex-basis',
            'flex-flow',
            'flex-direction',
            'flex-wrap',
            'justify-content',
            'align-items',
            'align-content',
            'align-self',
            'justify-self',
            'order',
            'grid',
            'grid-template',
            'grid-template-areas',
            'grid-template-columns',
            'grid-template-rows',
            'grid-auto-flow',
            'grid-auto-columns',
            'grid-auto-rows',
            'grid-area',
            'place-items',
            'place-content',
            'gap',
            'row-gap',
            'column-gap'
          ]
        },
        {
          groupName: 'ボックスサイズ',
          emptyLineBefore: 'never',
          properties: [
            'box-sizing',
            'aspect-ratio',
            'width',
            'min-width',
            'max-width',
            'height',
            'min-height',
            'max-height',
            'inline-size',
            'block-size'
          ]
        },
        {
          groupName: '余白',
          emptyLineBefore: 'never',
          properties: [
            'margin',
            'margin-top',
            'margin-right',
            'margin-bottom',
            'margin-left',
            'margin-block',
            'margin-inline',
            'padding',
            'padding-top',
            'padding-right',
            'padding-bottom',
            'padding-left',
            'padding-block',
            'padding-inline'
          ]
        },
        {
          groupName: 'スクロール・オーバーフロー',
          emptyLineBefore: 'never',
          properties: [
            'overflow',
            'overflow-x',
            'overflow-y',
            'overflow-anchor',
            'clip',
            'resize'
          ]
        },
        {
          groupName: 'リスト・テーブル・置換要素',
          emptyLineBefore: 'never',
          properties: [
            'list-style',
            'table-layout',
            'border-collapse',
            'object-fit',
            'object-position',
            'vertical-align'
          ]
        },
        {
          groupName: '文字',
          emptyLineBefore: 'never',
          properties: [
            'font',
            'font-family',
            'font-size',
            'font-weight',
            'font-style',
            'font-variant',
            'font-feature-settings',
            'line-height',
            'letter-spacing',
            'text-align',
            'text-indent',
            'text-decoration',
            'text-decoration-color',
            'text-decoration-thickness',
            'text-underline-offset',
            'white-space',
            'text-overflow',
            'word-break',
            'overflow-wrap',
            'color'
          ]
        },
        {
          groupName: '背景・境界線・装飾',
          emptyLineBefore: 'never',
          properties: [
            'background',
            'background-color',
            'background-image',
            'background-position',
            'background-size',
            'background-repeat',
            'border',
            'border-top',
            'border-right',
            'border-bottom',
            'border-left',
            'border-width',
            'border-style',
            'border-color',
            'border-top-width',
            'border-right-width',
            'border-bottom-width',
            'border-left-width',
            'border-top-style',
            'border-right-style',
            'border-bottom-style',
            'border-left-style',
            'border-top-color',
            'border-right-color',
            'border-bottom-color',
            'border-left-color',
            'border-radius',
            'outline',
            'opacity',
            'box-shadow',
            'filter'
          ]
        },
        {
          groupName: 'アニメーション・変化',
          emptyLineBefore: 'never',
          properties: [
            'cursor',
            'pointer-events',
            'user-select',
            'transform',
            'transform-box',
            'transform-style',
            'backface-visibility',
            'transition',
            'animation'
          ]
        },
        {
          groupName: '擬似要素・補助的なプロパティ',
          emptyLineBefore: 'never',
          properties: [
            'content'
          ]
        }
      ],
      {
        unspecified: 'bottomAlphabetical',
        emptyLineBeforeUnspecified: 'always'
      }
    ]
  }
};

設定の最後にある unspecified: 'bottomAlphabetical' は、リストに書いていないプロパティを末尾にアルファベット順で並べる指定です。emptyLineBeforeUnspecified: 'always' を付けると、それらの前に必ず空行が1行入るので、「自分で順番を決めたプロパティ」と「それ以外」の境目が見分けやすくなります。

emptyLineBeforeunspecifiedなど、指定できるオプションの一覧はproperties-orderのドキュメントにまとまっています。

contentプロパティの扱い

contentは、::before::afterなどの擬似要素で使う特殊なプロパティです。backgroundborderと同じ「装飾」グループに入れても問題ありませんが、気になる場合は最後の補助的なグループに分けても構いません。

実務ではルールの厳密さよりも「チーム内で違和感なく統一できるか」の方が大切なので、運用しやすい場所に置けば十分です。

Lintを実行する方法

Stylelintを実行しやすくするために、まず package.jsonscripts にコマンドを追加します。lint:css はチェックのみ、lint:css:fix はチェックに加えて自動修正も行うコマンドです。

自動修正とは、Stylelintが修正可能なルール違反を自動で書き換えることです。プロパティの並び替えや書式の一部調整などが該当します。

ただし、すべての問題を自動で直せるわけではなく、ルールによっては検出のみで終わるものもあります。

package.json
Copy
{
  "scripts": {
    "lint:css": "stylelint \"**/*.css\"",
    "lint:css:fix": "stylelint \"**/*.css\" --fix"
  }
}

設定後は、次のコマンドでLintを実行できます。

Command
Copy
npm run lint:css

順序がルールと違うと、違反した行が次のように一覧で出ます。

src/button.css
 2:3  ✖  Expected "display" to come before "color"      order/properties-order
 4:3  ✖  Expected "padding" to come before "background"  order/properties-order

2 problems (2 errors, 0 warnings)

自動修正まで行いたい場合は、次のコマンドを使います。

Command
Copy
npm run lint:css:fix

実行すると、設定した順番どおりにプロパティが並び替わります。

プロパティの値はそのままで、並び順だけが入れ替わります。手で並べ替えていたころのケアレスミスが無くなるのが、いちばんありがたいところです。

scripts を用意していない場合でも、npx で直接実行できます。まず試したいときに向いています。

Command
Copy
npx stylelint "**/*.css"

自動修正したい場合は、--fix を付けます。

Command
Copy
npx stylelint "**/*.css" --fix

VS Codeで保存時にStylelintを動かす方法

VS Codeで保存時にStylelintを動かすには、拡張機能「Stylelint」(stylelint.vscode-stylelint)を入れておきます。

VS Codeの拡張機能「Stylelint」のインストール画面

保存時に自動修正する設定

保存時に自動修正したい場合は、VS Code側の settings.json に次のコードアクションを設定します。

settings.json
Copy
{
  "editor.codeActionsOnSave": {
    "source.fixAll.stylelint": "explicit"
  }
}

標準のCSS検証と重複するときは

VS Code標準のCSSチェックとStylelintが同時に動くと、同じ箇所に警告が二重で出ることがあります。気になる場合は、標準のCSS検証をオフにすると表示を整理できます。

settings.json
Copy
{
  "css.validate": false
}

settings.json の開き方がわからない場合は、以下の記事を先に確認しておくとスムーズです。

あわせて読む

【VS Code】settings.json の開き方|ユーザー設定とワークスペース設定の違いも解説

VS Codeの設定を調整しようとしたとき、「settings.jsonはどこから開けばいいの?」と迷うことがあります。 自動整形やPrettierの設定を追加したいときも、設定画面ではなくJSONを ...

導入時の注意点

プロパティ順序のルールは、必ずしもゼロから自作する必要はありません。チームや案件によっては、既存の共有設定をベースにした方がスムーズなこともあります。まずは既存ルールで運用を始め、必要に応じて独自ルールへ寄せていく流れでも問題ありません。

また、すでにCSSファイルが多い案件で、いきなり広範囲に --fix をかけると、差分が大きくなってレビューの負担が増えます。最初は新規ファイルだけに適用したり、対象ディレクトリを絞ったりして、段階的に進める方が安全です。特に複数人で保守している案件では、導入タイミングと適用範囲を先に決めておくと、混乱を減らせます。

SCSSまで管理したい場合

SCSSも対象にしたい場合は、CSS向けの基本設定だけでは足りないことがあります。stylelint-config-standard-scss を入れれば、SCSSの構文解析(postcss-scss)も含めて面倒を見てくれます。CSSとSCSSが混在する案件では、最初からこちらを入れておくと設定をやり直さずに済みます。

Stylelint導入でよくある質問

Stylelint本体だけでプロパティの順序チェックは動きますか?

動きません。プロパティ順序の管理には stylelint-order が必要です。Stylelint本体だけでは、独自の順序ルールまでは設定できません。npm install -D stylelint-order を追加して、設定ファイルの plugins'stylelint-order' を指定してください。

CLIでは直るのにVS Codeの保存時に自動修正されません

CLIの --fix では直るのに、VS Codeの保存時では直らないことがあります。その場合は、Stylelint拡張機能(stylelint.vscode-stylelint)が入っているか、editor.codeActionsOnSave"source.fixAll.stylelint": "explicit" が設定されているかを確認してみてください。

設定ファイルは .js と .mjs のどちらにすべきですか?

export default を使うなら .mjs が確実です。stylelint.config.jsexport default を書くと、Node.js側のモジュール設定の影響を受けて読み込めないことがあります。拡張子を stylelint.config.mjs にしておくと、モジュール形式が明確になり詰まりにくくなります。

まとめ

CSSプロパティの順番を統一したいなら、Stylelintとstylelint-orderを使ってLintで管理するのがおすすめです。

  • プロパティ順序は手作業よりLintで統一する方が運用しやすい
  • StylelintはCSSの規約チェック、stylelint-orderは順序ルールの追加に向いている
  • order/properties-orderで独自の順番を設定できる
  • npm run lint:css:fixnpx stylelint "**/*.css" --fixで自動修正できる
  • VS Code拡張と組み合わせると日常運用しやすい

プロパティ順序に正解はありません。筆者はレイアウト→ボックス→余白→文字→装飾という大きな流れだけ決めて、細かいプロパティは bottomAlphabetical に任せる形に落ち着きました。全部を手で並べようとすると設定のメンテが続かないので、ざっくり決めて残りはLintに任せるくらいが、ちょうどいいです。

この記事を書いた人
もみじのアイコン画像

もみじ

現役フリーランスWebエンジニア。フロントエンド開発を中心に、Web制作、WordPress、業務効率化ツール開発、PHPを用いた機能改修に携わってきました。社内SEとして業務ツール開発や運用保守を担当した経験もあります。

実務や学習を通じて得た知見をもとに、初心者がつまずきやすいポイントや、現場で役立つ考え方をわかりやすく発信しています。

詳しいプロフィールはこちら

-フロントエンド
-,