このCSSは難読すぎる! 絵文字をclass名に使用したBEMメソッドの本番環境レベルで使えるCSSフレームワーク -BEMoji
Post on:2026年6月10日
sponsorsr
ぱっと見、なんじゃこりゃ! と思ったのですが、よく見ると絵文字をclass名としてしっかりとしたBEMメソッドで実装された、本番環境レベルで使えるCSSのフレームワークを紹介します。
完全なデザイントークンシステム、プリビルドコンポーネント、レスポンシブユーティリティ、さらにビルドツールチェーンも付属しています。

BEMojiは、絵文字をclass名として使用するBEM(Block–Element–Modifier)メソッドで実装された、本番環境レベルのCSSフレームワークです。デザイントークンシステム、プリビルドコンポーネント、レスポンシブユーティリティ、ビルドツールチェーンも付属しています。

BEMojiの主な特徴は、下記の通り。
-
- 難読化機能
- 絵文字で記述されたclass名は競合他社にとって意味をなさないでしょう。複雑なビルド作業なしに、CSSモジュールのような難読化を実現できます。
-
- 語彙の強制
- すべてのUIコンセプトは、1つの標準的な絵文字に対応付けられます。
-
- 入力時間の短縮
- 絵文字ピッカーを使用すると、2つのキーストロークで入力できます。
-
- これは実際に機能します
- モダンブラウザはCSSセレクタ内の絵文字をネイティブに処理します。コンパイラは古い環境向けにエスケープされたUnicodeフォールバックを処理します。
BEMojiではBEMの3層アーキテクチャをそのまま継承しています。唯一の違いはすべての識別子が絵文字になっていることです。
|
1 2 3 4 |
🃏 __ 🖼️ -- 🌟 │ │ └─ Modifier (state or variant) │ └───────── Element (part of the block) └───────────────── Block (standalone component) |
ブロック(Block)は独立した自己完結型のコンポーネントで、再利用が可能です。継承されたコンテキストは持ちません。
|
1 2 3 |
.🃏 {/* card */} .🧭 {/* navbar */} .📋 {/* form */} |
エレメント(Element)はブロックの一部で、単独では意味を持ちません。常にblock__elementの形式で表現されます。ブロックの外には存在できません。
|
1 2 3 |
.🃏__🖼️ {/* card image */} .🃏__🔠 {/* card title */} .🃏__📝 {/* card body */} |
修飾子(modifier)は外観や動作を変更するフラグで、基本クラスと併用して適用されます(block--modifier, block__element--modifier)。
|
1 2 3 |
.🔘--🌟 {/* button primary */} .🔘--🔴 {/* button danger */} .🔘--👻 {/* button disabled */} |
BEMojiで使用されるclass名はすべて厳密で、解析可能な構造に従っています。二重アンダースコアと二重ハイフンの区切り文字はBEMから引き継がれており、人間には読みにくい形式であっても、機械にとっては読みやすい形式となっています

BEMojiの基本となるclass名
主なclass名は、下記のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
blocks: { card: '🃏', navbar: '🧭', modal: '🪟', alert: '🔔', form: '📋', table: '📊', badge: '🏷️', tooltip: '💬', tabs: '📑', carousel: '🎠', breadcrumb: '🍞', footer: '🦶', }, elements: { image: '🖼️', title: '🔠', body: '📝', footer: '🦶', button: '🔘', input: '📥', link: '🔗', label: '🏷️', icon: '🎭', item: '📄', divider: '🖇️', }, modifiers: { primary: '🌟', danger: '🔴', success: '🟢', warning: '🟡', info: '🔵', disabled: '👻', active: '✅', loading: '⏳', locked: '🔒', premium: '💎', new: '🆕', dark: '🕶️', xs: '🔬', sm: '🤏', md: '⚖️', lg: '🏋️', xl: '🏔️', }, breakpoints: { sm: { prefix: '📟', minWidth: '640px' }, md: { prefix: '📲', minWidth: '768px' }, lg: { prefix: '💻', minWidth: '1024px' }, xl: { prefix: '🖥️', minWidth: '1280px' }, } |

Webサイトやスマホアプリでよく使用される絵文字のclass名も揃っています。BEMojiの仕様では、ブロック、要素、修飾子、状態、デザイントークン全体で143個の予約済み絵文字トークンが定義されています。

他にユーティリティでよく使用されるclassは、下記のようになります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
:root { /* Colors */ --⬛: #0d0d0f; --⬜: #ffffff; --🔴: #dc2626; --🟢: #16a34a; --🟡: #d97706; --🔵: #2563eb; --🟣: #7c3aed; /* Spacing scale */ --📏-1: 0.25rem; /* 4px */ --📏-2: 0.5rem; /* 8px */ --📏-4: 1rem; /* 16px */ --📏-6: 1.5rem; /* 24px */ --📏-8: 2rem; /* 32px */ --📏-12: 3rem; /* 48px */ --📏-16: 4rem; /* 64px */ /* Typography */ --✍️-xs: 0.75rem; --✍️-sm: 0.875rem; --✍️-base: 1rem; --✍️-lg: 1.125rem; --✍️-xl: 1.25rem; /* Shadows */ --🌑-sm: 0 1px 3px rgba(0,0,0,.12); --🌑-md: 0 4px 12px rgba(0,0,0,.15); --🌑-lg: 0 8px 24px rgba(0,0,0,.2); /* Border radius */ --⭕-sm: 4px; --⭕-md: 8px; --⭕-lg: 16px; --⭕-full: 9999px; } |
メディアクエリも絵文字のclass名でCSSを記述できます。

BEMojiによるメディアクエリのCSSは、下記の通り。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
@media (min-width: 640px) { .\01F4DF \01F4D0 \01F532 { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 1024px) { .\01F4BB \01F4D0 \01F533 { grid-template-columns: repeat(3, 1fr); } } /* Or with modern emoji CSS (most environments) */ @media (min-width: 640px) { .📟📐🔲 { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 1024px) { .💻📐🔳 { grid-template-columns: repeat(3, 1fr); } } |
BEMojiは、PostCSSのプラグインやVS Codeのエクステンション、ESLintのプラグイン、React / JSX Helpersなど、さまざまなツールとともに利用できます。

sponsors












