CSS のレイヤーと強さの順番
Lism CSS が使う CSS のレイヤー(@layer)の順番と、それぞれの役割、Set・Primitive・Trait・Block・Custom・Utility・Property Class の違いを説明します。
CSS では、同じ要素に2つのスタイルが当たると、どちらが勝つかで見た目が変わります。Lism は、この「勝ち負けの順番」をレイヤーという段で決めています。このページでは、その段の並びと、クラスの種類ごとの役割を説明します。
@layer とは#
@layer は、CSS を「段」に分けて、段ごとに強さを決める CSS の機能です。
- 先に名前を宣言した段ほど弱く、あとの段ほど強くなります
- 段が違えば、セレクタの書き方(詳細度)に関係なく、あとの段が勝ちます
- どの段にも入っていない CSS は、すべての段より強くなります
@layer base, utility;
@layer utility { p { color: blue; } }
@layer base { p { color: red; } }
/* 文字は blue になる(utility の段のほうがあと) */
段を分けておくと、「なぜかこのスタイルが効かない」という詳細度(セレクタの強さ)の取り合いが起きにくくなります。
Lism のレイヤーの順番#
Lism の main.css は、最初に次の順で段を宣言しています。
@layer lism-base, lism-block, lism-trait, lism-primitive, lism-custom, lism-utility;
上の表ほど弱く、下ほど強くなります。
| 段 | 入るもの | 役割 |
|---|---|---|
| Settings | SCSS の設定 | SCSS の変数や mixin など。CSS としては出力されない |
lism-base |
Reset CSS・トークン・set-- |
ブラウザのくせをそろえ、トークンを決め、HTML の要素に最初の見た目を付ける |
lism-block |
b-- |
自分で作る共通部品の土台。Lism 本体は段を用意するだけ |
lism-trait |
is--・has-- |
要素に役割や機能を付ける |
lism-primitive |
l--・a-- |
レイアウトを組み立てる部品 |
lism-custom |
c-- |
自分で作るクラスや、Lism のクラスの上書き |
lism-utility |
u-- |
用途がはっきりした飾りや機能 |
| (段の外) | -{prop}:{value} |
Property Class。いちばん強い |
いちばん強いのは Property Class#
-p:20 のような Property Class だけは、どの段にも入っていません。段の外の CSS はすべての段より強いので、Property Class は Lism のほかのクラスに必ず勝ちます。
段の外にあるので、Lism を使っていない CSS ともある程度一緒に使えるようになっています。
表示例
<div class="l--stack -g:10 -p:20 -bd">
<div class="-p:20 -bgc:base-2">-p:20</div>
<div class="-p:10 -bgc:base-2">-p:10(内側の余白が小さい)</div>
</div>
lism-block がわざと弱い理由#
lism-block は lism-base のすぐ上の、弱い段にあります。そのため、同じ要素に is--・has--・l-- などのクラスを付けると、b-- の土台のスタイルは必ずそちらに負けます。付けた順番は関係なく、段の位置で決まります。部品の見た目を、その場でクラスを足して変えられるようにするためです。
クラスの種類#
Lism のクラスは、名前の頭(プレフィックス)で種類が分かります。名前の付け方は 名前のルール、見分け方の早見表は クラスの種類と見分け方 にもあります。
Set Class(set--)#
lism-base の段に入るクラスです。HTML の要素の基本の見た目を整えたり、CSS 変数をまとめてセットしたりします。
| 種類 | 形 | 例 |
|---|---|---|
| Set Class | set--{name} |
set--plain・set--hov・set--bxsh |
くわしくは Set Class(set--*)。
Primitive Class(l--・a--)#
レイアウトを組み立てる小さな積み木です。2種類あります。
| 種類 | 形 | 例 |
|---|---|---|
| Layout Primitive(レイアウトのひとかたまり) | l--{name} |
l--grid・l--columns |
| Atomic Primitive(レイアウトのいちばん小さい部品) | a--{name} |
a--divider・a--icon |
Primitive Class は1つで役目を果たすクラスです。種類違い(バリエーション)や、子要素用のクラスは持ちません。
同じ要素に付けるときは、次の決まりがあります。
| 組み合わせ | よいか | わけ |
|---|---|---|
l-- と l-- |
だめ | 同じ種類どうしは一緒に付けない |
a-- と a-- |
だめ | 同じ種類どうしは一緒に付けない |
l-- と a-- |
おすすめしない | ふつうは同じ要素に付けない |
くわしくは Primitive ってなに?。
Trait Class(is--・has--)#
要素に「役割」を名乗らせたり、「機能」を足したりするクラスです。
| 種類 | 形 | 例 |
|---|---|---|
is--(〜である) |
is--{name} |
is--container・is--wrapper・is--layer・is--boxLink |
has--(〜を持つ) |
has--{name} |
has--transition・has--gutter・has--snap |
2つの違いは次のとおりです。
is-- |
has-- |
|
|---|---|---|
| 意味 | 役割や存在を名乗る | 機能を足す |
| CSS 変数 | なくてもよい | 必ずある(値を変えて調整できる) |
くわしくは Trait Class ってなに?。
Block Class(b--)#
ボタン・バッジ・カードくらいの大きさの、サイトのあちこちで使う部品のためのクラスです。土台の見た目は CSS のほうに書いておきます。
@layer lism-block {
.b--btn { /* ... */ }
}
Lism 本体は b-- のクラスを1つも持っていません。lism-block という段を用意しているだけです。
b-- にしてよいのは、次の3つをすべて満たす部品だけです。1つでも当てはまらなければ c-- にします。
- いくつものページ・場所でくり返し使う
- クラスを1つ付けるだけで、土台の見た目がほぼ決まってほしい
- ボタン・バッジ・カードくらいの、それだけで完結する部品
b-- は BEM(Block・Modifier・Element に分けて名前を付けるやり方)の形を持てます。
| 種類 | 形 | 例 |
|---|---|---|
| Block(部品そのもの) | b--{name} |
b--btn・b--card |
| Modifier(種類違い) | b--{name}--{modifier} |
b--btn--outline |
| Element(中の部品) | b--{name}_{element} |
b--card_header・b--card_body |
Modifier は、.b--btn.b--btn--outline のように部品そのもののクラスと並べて付けます。Element の区切りは _(アンダースコア)1つです。
部品そのもののクラスどうし(b--xxx と b--yyy)を同じ要素に付けるのは、基本的にだめです。
b-- は、ほかのクラスと一緒に使えます。全部を CSS に書かなくてもかまいません。レイアウトを CSS に持たせても、l-- と組み合わせて組んでもよいです。画面の幅での切り替え(-p_sm など)、マウスを乗せたときの見た目、ちょっとした調整は、Property Class で済ませると手軽です。
Custom Class(c--)#
Lism に入っていない、自分で自由に作るクラスです。lism-custom の段に対応しています。ページの部品・ヘッダーやサイドバーのような場所・そのページだけの要素など、大きさを問わず使えます。
- 見た目は、Lism のほかのクラスを組み合わせて作るのが基本です
- Property Class などでは作れない込み入ったスタイルは、
@layer lism-customの中に書きます - CSS を書かずに、「これは何の部品か」を表す名札として付けるだけでもかまいません
@layer lism-custom {
.c--header { /* ... */ }
.c--pricing { /* ... */ }
}
名前は c-- のあとを camelCase(myComponent のように、2語目から頭を大文字にする書き方)にします。そのページだけの要素は、c--landingHero のようにページの名前を入れると、どこの要素かすぐ分かります。
c-- も、b-- と同じ BEM の書き方と、一緒に付けるときの決まりで使えます。
Utility Class(u--)#
飾りや機能として、用途がはっきりしたクラスです。
| 種類 | 形 | 例 |
|---|---|---|
| Utility Class | u--{name} |
u--cbox・u--trim |
くわしくは Utility Class(u--*)。
Property Class(-{prop}:{value})#
CSS のプロパティ1つに対応するクラスです。よく使う値やトークンの値ごとにクラスがあり、画面の幅での切り替えにも使えます。形は3つあります。
| 形 | 何をする? | 例 |
|---|---|---|
-{prop}:{value} |
よく使う値やトークンの値を当てる | -fz:l・-d:none |
-{prop} |
CSS 変数 --{prop} の値を当てる |
-p・-fz |
-{prop}_{bp} |
CSS 変数 --{prop}_{bp} の値を、その幅から当てる |
-p_sm・-p_md |
<div class="-p:20 -p_sm -p_md -bd" style="--p_sm: var(--s40); --p_md: var(--s50)">BOX</div>
<Lism p={[20, 40, 50]} bd>
BOX
</Lism>
すべての CSS プロパティにクラスがあるわけではありません。画面の幅で切り替えるクラスも、よく使う一部のプロパティにしか最初から用意されていません。
くわしくは Property Class の書き方 と 画面の幅で切り替える(レスポンシブ)。
自分のクラスを足す・上書きする#
set--・is--・has--・l--・a--・u--・-{prop}:{value} と同じ種類のクラスを自分で足すときは、同じ頭の文字を使い、その種類の段の中に書きます。
Lism のクラスを上書きするときも、そのクラスがある段の中で書きます。たとえば set-- を書き直すなら @layer lism-base の中です。そのうえで、次のどちらかで強くします。
main.cssよりあとに読み込む CSS に書く.set--plain.set--plainのように、同じクラス名を2回続けて強くする
@layer lism-base {
/* 新しく足す */
.set--hoge { /* ... */ }
/* 上書き */
.set--plain.set--plain { /* ... */ }
}
動きのある状態は data 属性で表す#
JavaScript で付けたり外したりする「開いている」「選ばれている」のような状態は、クラスではなく data 属性で表します。例:[data-opened]・[data-active]。
関連するページ#
- Lism CSS の特長
- 名前のルール(省略のしかた)
- クラスの種類と見分け方
- CSS ファイルの種類:
@layerを使わない CSS ファイル
公式ドキュメント
2026年10月5日時点の内容(lism-css 1.0.1・@lism-css/ui 0.40.1)をもとに、やさしい日本語でまとめています。