Skip to content

ルールの定義規則

headerコンポーネントの場合を例に解説します。

1階層目のセレクタはコンポーネントの定義となり、CSSファイル内に一度だけ登場するようにします。 ファイルパスは __assets/_libs/style/component/c-header.css となります。

css
.c-header {
	/* declaration */
}
/* EOF */

次にエレメントは、BEM記法に従ってフラットなセレクタで定義します。

css
.c-header {
	/* declaration */
}

.c-header__body {
	/* declaration */
}

.c-header__title {
	/* declaration */
}

.c-header__site-name {
	/* declaration */
}
/* EOF */

こうすることで、このファイルに記述されたスタイルの影響範囲が、コンポーネント内であることを保証します。

状態変化を表す場合もBEM記法に従ってフラットなセレクタで定義します。メディアクエリの定義も含めて、コンポーネント内のすべてのスタイルを明示的に記述します。

css
.c-header {
	--foo-bar: 0; /* カスタムプロパティ */
	--foo-baz: calc(32 / 16 * 1em); /* カスタムプロパティ */

	/* declaration */

	@media (--sm-lte) { /* declaration */ } /* メディアクエリ */
	&:hover { /* declaration */ } /* 疑似クラス */
	&[data-compact-mode="true"] { /* declaration */ } /* data属性 */
	&[aria-hidden="true"] { /* declaration */ } /* aria属性 */

	/* 影響がエレメントを巻き込む場合は、後ろに記述する */
	&[data-fat-mode="true"] {
		/* declaration */

		.c-header__body {
			/* declaration */
		}
	}
}

.c-header--compact-mode {
	/* declaration */
}

.c-header__body {
	/* declaration */
	/* 子孫要素も同様のルールになる */
	@media (--sm-lte) { /* declaration */ } /* メディアクエリ */
	&:hover { /* declaration */ } /* 疑似クラス */
	&[data-compact-mode="true"] { /* declaration */ } /* data属性 */
	&[aria-hidden="true"] { /* declaration */ } /* aria属性 */
}

.c-header__body--compact-mode {
	/* declaration */
}

疑似要素は個別にセレクタを定義し、疑似要素セレクタは::で定義してください。

css
.c-header {
	/* declaration */

	&[data-compact-mode="true"] { /* declaration */ }

	&::before { /* declaration */ }
	&::after { /* declaration */ }
}

.c-header__body {
	/* declaration */
}

BEM記法での記述について

フルのクラス名が検索にヒットしやすく、セレクタが明示的であることから、BEM記法に従ってフラットなセレクタで記述するルールを採用しています。コンポーネントのクラス名とファイル名が一致していることを前提にしています。

👮‍♀️ 自動検知

このルールはStylelintによって警告されます。

Licensed under CC BY-NC-SA 4.0