vscodeでscss(css)を自動的に並び替える方法とcsscombの設定方法
CSSプロパティの並び順に規則性を持たせることで可読性が上がることや、思わぬ不具合を解消することができます。
その並び替えを自動的にあらかじめ指定しておいた順番に並び替えれる方法をご紹介いたします。
実装イメージ
例えば以下のCSSを保存した場合に、
#hoge {
margin-top: 10px;
margin: 0 auto;
display: block;
}
下記の様に自動で並び替えれるようにします。
#hoge {
display: block;
margin: 0 auto;
margin-top: 10px;
}
自動並び替えのメリット
先ほどのコード例をもう一度見てみましょう。
下記のコードの場合では、margin-top:10px;は適応されていません。
(適応されない理由は、margin-top;10px;の後に、margin:0 auto;を適応しているので、0pxが後勝ちしている状態です。)
#hoge {
margin-top: 10px;
margin: 0 auto;
display: block;
}
これが意図的であれば問題はございませんが、CSSの記述内容が多くなるとこういった順番によるミスで意図しないスタイル崩れが発生する可能性があります。
CSSの自動並び替えでは、こういった不具合の対策になります。
また、marginプロパティがtop,right,bottom,leftの4箇所を対象としているのに対して、
margin-topプロパティはtopだけを対象としています。
この場合、marginプロパティよりもmargin-topプロパティの方が詳細度が高いと言えます。
それにも関わらず詳細度の高いプロパティが適応されていないのはよろしくありません。
これを人力でチェックしながらコーディングするのは少し大変なので、自動にしてしまおうというのが目的です。
実装方法
実装方法はVScodeの拡張機能を使用いたします。
その中でもCSSconbを使用した方法と、Stylelintを使用した方法がございます。
CSSconbはサポートが終了(使用はできるが今後のアップデート等はなし)したので、Stylelintの使用を推奨する記事が多く出ていますが、
執筆日(7月24日)時点ではCSScombも問題なく使えております。
何より、CSScombの方が設定等が簡単なため、まだプログラムに疎い人や時間のない人はCSScombの使用をお勧めいたします。
CSScombの設定方法
では本記事はCSSconbを使用して、実現する方法を解説いたします。
拡張機能を追加
VScodeで拡張機能を開きます。
コマンド
mac : Command (⌘)+ Shift (⇧) + X
検索窓に「CSScomb」と入力し検索します。
※大文字小文字や、スペースの有無などで出ない場合があるので注意
複数ある場合はバージョンの新しいものや、インストール数などを確認してください。
拡張機能を追加できたら有効化して次のステップへ
設定ファイルの追加
下記のディレクトリに移動して、
/Users/{your_user_name}/.vscode/
mycsscomb.json
というファイルを作成します。
※.vscodeフォルダは隠しフォルダとなっているので注意
隠しフォルダの出現コマンド
mac : Command (⌘)+ Shift (⇧) + .
ファイルを作成できたら次のステップで中身を記述していきます。
設定ファイルの修正
「csscomb.json」ファイルに、CSSプロパティの並び順を記述していきます。
並び順はご自身の自由でも構いませんが、
主に、「アルファベット順」と「視覚順」というのがあり、多くの方が利用している後者を採用しています。
※全文コピーして貼り付けてください。
{
"exclude": [
".git/**",
"node_modules/**",
"bower_components/**"
],
"always-semicolon": true,
"block-indent": " ",
"color-case": "lower",
"color-shorthand": true,
"element-case": "lower",
"eof-newline": true,
"leading-zero": false,
"quotes": "single",
"remove-empty-rulesets": true,
"space-after-colon": " ",
"space-after-combinator": " ",
"space-after-opening-brace": "\n",
"space-after-selector-delimiter": "\n",
"space-before-closing-brace": "\n",
"space-before-colon": "",
"space-before-combinator": " ",
"space-before-opening-brace": "\n",
"space-before-selector-delimiter": "",
"strip-spaces": true,
"unitless-zero": true,
"vendor-prefix-align": true,
"sort-order": [
[
"content",
"position",
"z-index",
"top",
"right",
"bottom",
"left",
"display",
"visibility",
"float",
"clear",
"overflow",
"overflow-x",
"overflow-y",
"-ms-overflow-x",
"-ms-overflow-y",
"-webkit-overflow-scrolling",
"clip",
"zoom",
"-webkit-align-content",
"-ms-flex-line-pack",
"align-content",
"-webkit-box-align",
"-moz-box-align",
"-webkit-align-items",
"align-items",
"-ms-flex-align",
"-webkit-align-self",
"-ms-flex-item-align",
"-ms-grid-row-align",
"align-self",
"-webkit-box-flex",
"-webkit-flex",
"-moz-box-flex",
"-ms-flex",
"flex",
"-webkit-flex-flow",
"-ms-flex-flow",
"flex-flow",
"-webkit-flex-basis",
"-ms-flex-preferred-size",
"flex-basis",
"-webkit-box-orient",
"-webkit-box-direction",
"-webkit-flex-direction",
"-moz-box-orient",
"-moz-box-direction",
"-ms-flex-direction",
"flex-direction",
"-webkit-flex-grow",
"-ms-flex-positive",
"flex-grow",
"-webkit-flex-shrink",
"-ms-flex-negative",
"flex-shrink",
"-webkit-flex-wrap",
"-ms-flex-wrap",
"flex-wrap",
"-webkit-box-pack",
"-moz-box-pack",
"-ms-flex-pack",
"-webkit-justify-content",
"justify-content",
"-webkit-box-ordinal-group",
"-webkit-order",
"-moz-box-ordinal-group",
"-ms-flex-order",
"order",
"-webkit-box-sizing",
"-moz-box-sizing",
"box-sizing",
"width",
"min-width",
"max-width",
"height",
"min-height",
"max-height",
"margin",
"margin-top",
"margin-right",
"margin-bottom",
"margin-left",
"padding",
"padding-top",
"padding-right",
"padding-bottom",
"padding-left",
"gap",
"table-layout",
"empty-cells",
"caption-side",
"border-spacing",
"border-collapse",
"list-style",
"list-style-position",
"list-style-type",
"list-style-image",
"quotes",
"counter-reset",
"counter-increment",
"resize",
"cursor",
"-webkit-user-select",
"-moz-user-select",
"-ms-user-select",
"user-select",
"nav-index",
"nav-up",
"nav-right",
"nav-down",
"nav-left",
"-webkit-transition",
"-moz-transition",
"-ms-transition",
"-o-transition",
"transition",
"-webkit-transition-delay",
"-moz-transition-delay",
"-ms-transition-delay",
"-o-transition-delay",
"transition-delay",
"-webkit-transition-timing-function",
"-moz-transition-timing-function",
"-ms-transition-timing-function",
"-o-transition-timing-function",
"transition-timing-function",
"-webkit-transition-duration",
"-moz-transition-duration",
"-ms-transition-duration",
"-o-transition-duration",
"transition-duration",
"-webkit-transition-property",
"-moz-transition-property",
"-ms-transition-property",
"-o-transition-property",
"transition-property",
"-webkit-transform",
"-moz-transform",
"-ms-transform",
"-o-transform",
"transform",
"-webkit-transform-origin",
"-moz-transform-origin",
"-ms-transform-origin",
"-o-transform-origin",
"transform-origin",
"-webkit-animation",
"-moz-animation",
"-ms-animation",
"-o-animation",
"animation",
"-webkit-animation-name",
"-moz-animation-name",
"-ms-animation-name",
"-o-animation-name",
"animation-name",
"-webkit-animation-duration",
"-moz-animation-duration",
"-ms-animation-duration",
"-o-animation-duration",
"animation-duration",
"-webkit-animation-play-state",
"-moz-animation-play-state",
"-ms-animation-play-state",
"-o-animation-play-state",
"animation-play-state",
"-webkit-animation-timing-function",
"-moz-animation-timing-function",
"-ms-animation-timing-function",
"-o-animation-timing-function",
"animation-timing-function",
"-webkit-animation-delay",
"-moz-animation-delay",
"-ms-animation-delay",
"-o-animation-delay",
"animation-delay",
"-webkit-animation-iteration-count",
"-moz-animation-iteration-count",
"-ms-animation-iteration-count",
"-o-animation-iteration-count",
"animation-iteration-count",
"-webkit-animation-direction",
"-moz-animation-direction",
"-ms-animation-direction",
"-o-animation-direction",
"animation-direction",
"text-align",
"-webkit-text-align-last",
"-moz-text-align-last",
"-ms-text-align-last",
"text-align-last",
"vertical-align",
"white-space",
"text-decoration",
"text-emphasis",
"text-emphasis-color",
"text-emphasis-style",
"text-emphasis-position",
"text-indent",
"-ms-text-justify",
"text-justify",
"text-transform",
"letter-spacing",
"word-spacing",
"-ms-writing-mode",
"text-outline",
"text-transform",
"text-wrap",
"text-overflow",
"-ms-text-overflow",
"text-overflow-ellipsis",
"text-overflow-mode",
"-ms-word-wrap",
"word-wrap",
"word-break",
"-ms-word-break",
"-moz-tab-size",
"-o-tab-size",
"tab-size",
"-webkit-hyphens",
"-moz-hyphens",
"hyphens",
"pointer-events",
"opacity",
"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity",
"-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha",
"-ms-interpolation-mode",
"color",
"border",
"border-collapse",
"border-width",
"border-style",
"border-color",
"border-top",
"border-top-width",
"border-top-style",
"border-top-color",
"border-right",
"border-right-width",
"border-right-style",
"border-right-color",
"border-bottom",
"border-bottom-width",
"border-bottom-style",
"border-bottom-color",
"border-left",
"border-left-width",
"border-left-style",
"border-left-color",
"-webkit-border-radius",
"-moz-border-radius",
"border-radius",
"-webkit-border-top-left-radius",
"-moz-border-radius-topleft",
"border-top-left-radius",
"-webkit-border-top-right-radius",
"-moz-border-radius-topright",
"border-top-right-radius",
"-webkit-border-bottom-right-radius",
"-moz-border-radius-bottomright",
"border-bottom-right-radius",
"-webkit-border-bottom-left-radius",
"-moz-border-radius-bottomleft",
"border-bottom-left-radius",
"-webkit-border-image",
"-moz-border-image",
"-o-border-image",
"border-image",
"-webkit-border-image-source",
"-moz-border-image-source",
"-o-border-image-source",
"border-image-source",
"-webkit-border-image-slice",
"-moz-border-image-slice",
"-o-border-image-slice",
"border-image-slice",
"-webkit-border-image-width",
"-moz-border-image-width",
"-o-border-image-width",
"border-image-width",
"-webkit-border-image-outset",
"-moz-border-image-outset",
"-o-border-image-outset",
"border-image-outset",
"-webkit-border-image-repeat",
"-moz-border-image-repeat",
"-o-border-image-repeat",
"border-image-repeat",
"outline",
"outline-width",
"outline-style",
"outline-color",
"outline-offset",
"background",
"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader",
"background-color",
"background-image",
"background-repeat",
"background-attachment",
"background-position",
"background-position-x",
"-ms-background-position-x",
"background-position-y",
"-ms-background-position-y",
"-webkit-background-clip",
"-moz-background-clip",
"background-clip",
"background-origin",
"-webkit-background-size",
"-moz-background-size",
"-o-background-size",
"background-size",
"box-decoration-break",
"-webkit-box-shadow",
"-moz-box-shadow",
"box-shadow",
"filter:progid:DXImageTransform.Microsoft.gradient",
"-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient",
"text-shadow",
"font",
"font-family",
"font-size",
"font-weight",
"font-style",
"font-variant",
"font-size-adjust",
"font-stretch",
"font-effect",
"font-emphasize",
"font-emphasize-position",
"font-emphasize-style",
"font-smooth",
"line-height"
]
],
"remove-empty-rulesets": true,
"always-semicolon": true,
"color-case": "lower",
"block-indent": " ",
"color-shorthand": true,
"element-case": "lower",
"eof-newline": true,
"leading-zero": false,
"quotes": "double",
"space-before-colon": "",
"space-after-colon": " ",
"space-before-combinator": " ",
"space-after-combinator": " ",
"space-between-declarations": "\n",
"space-before-opening-brace": " ",
"space-after-opening-brace": "\n",
"space-after-selector-delimiter": "\n",
"space-before-selector-delimiter": "",
"space-before-closing-brace": "\n",
"strip-spaces": true,
"tab-size": true,
"unitless-zero": true,
"vendor-prefix-align": true
}
参考 : https://github.com/devmgn/css-property-order
CSScombの使い方
ここまでで、CSScombの設定は終了です。
あとはVScodeでこのフォーマットを使用しましょう。
VScodeのコマンドパレットを開く
まずは適当にテキストエディタを開き、右クリックします。
すると下記のメニューが出てくるので、コマンドパレットを開きます。
コマンド
mac : Command (⌘)+ Shift (⇧) + P
CSScombのショートカット設定
下記の様に検索窓が出てきますので、「csscomb」と検索します。
出てきた「csscob.execute」をクリックすると、この様に、鉛筆マークが出てきますのでクリックします。
ここでショートカットキーが登録できますので、お好きな組み合わせで登録してください。
試してみる
あとはcssファイルを開き、登録したショートカットを実行するだけです。
よくある質問・エラー・うまくいかない時
csscomb.jsonが読み込まれない・反映されない時
※QAがあるたびに追加していきます。
まとめ
コーディングにおいて、自身が作成したコードを他の人が修正することや、複数人で共同作業することもよくあると思います。
そういった時に、Git管理していると作業者によって並び順が違ったりすると大量の差分が出てしまう事もあります。
プロジェクトごとにコーディングルールを決め、メンテナンス性の高いコードを目指してみてください。