Lism Tips

CSS のレイヤーと強さの順番

Lism CSS が使う CSS のレイヤー(@layer)の順番と、それぞれの役割、Set・Primitive・Trait・Block・Custom・Utility・Property Class の違いを説明します。

CSS では、同じ要素に2つのスタイルが当たると、どちらが勝つかで見た目が変わります。Lism は、この「勝ち負けの順番」をレイヤーという段で決めています。このページでは、その段の並びと、クラスの種類ごとの役割を説明します。

@layer とは#

@layer は、CSS を「段」に分けて、段ごとに強さを決める CSS の機能です。

  • 先に名前を宣言した段ほど弱く、あとの段ほど強くなります
  • 段が違えば、セレクタの書き方(詳細度)に関係なく、あとの段が勝ちます
  • どの段にも入っていない CSS は、すべての段より強くなります
css
@layer base, utility;

@layer utility { p { color: blue; } }
@layer base { p { color: red; } }
/* 文字は blue になる(utility の段のほうがあと) */

段を分けておくと、「なぜかこのスタイルが効かない」という詳細度(セレクタの強さ)の取り合いが起きにくくなります。

Lism のレイヤーの順番#

Lism の main.css は、最初に次の順で段を宣言しています。

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 ともある程度一緒に使えるようになっています。

表示例

-p:20
-p:10(内側の余白が小さい)
html
<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 のほうに書いておきます。

css
@layer lism-block {
  .b--btn { /* ... */ }
}

Lism 本体は b-- のクラスを1つも持っていません。lism-block という段を用意しているだけです。

b-- にしてよいのは、次の3つをすべて満たす部品だけです。1つでも当てはまらなければ c-- にします。

  1. いくつものページ・場所でくり返し使う
  2. クラスを1つ付けるだけで、土台の見た目がほぼ決まってほしい
  3. ボタン・バッジ・カードくらいの、それだけで完結する部品

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 を書かずに、「これは何の部品か」を表す名札として付けるだけでもかまいません
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
html
<div class="-p:20 -p_sm -p_md -bd" style="--p_sm: var(--s40); --p_md: var(--s50)">BOX</div>
jsx
<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回続けて強くする
css
@layer lism-base {
  /* 新しく足す */
  .set--hoge { /* ... */ }

  /* 上書き */
  .set--plain.set--plain { /* ... */ }
}

動きのある状態は data 属性で表す#

JavaScript で付けたり外したりする「開いている」「選ばれている」のような状態は、クラスではなく data 属性で表します。例:[data-opened]・[data-active]。

関連するページ#

公式ドキュメント

2026年10月5日時点の内容(lism-css 1.0.1・@lism-css/ui 0.40.1)をもとに、やさしい日本語でまとめています。

ページの一覧