目次
ステップ 1: ローカルの競合のようにグローバルな競合を考慮する必要はありません
CSS モジュールの前に行ったこと
CSS モジュールの登場後に私たちが行ったこと
命名規則
React の例
ステップ 2: コンポーネントがすべてです
Sass
CSS 模块
第三步:文件间共享
第四步:功能单一模块
翻滚吧!CSS 模块!
最后的最后,祝大家开心写样式,幸福每一天!

CSS module_html/css_WEB-ITnose

Jun 21, 2016 am 09:07 AM

CSS の最近の開発のターニングポイントを知りたい場合は、2010 年に Christopher Chedeau によって提案されたコンセプトを見ることを選択する必要があります)、その後、Christopher は多くの可能性を近づけました (翻訳者注: 上記の 3 つと、この 2 つのインスピレーションは、ツールは彼の共有から生まれました)。

上の図は、多くの大規模な CSS コード ベースに存在する問題をリストしています。 Christopher 氏は、JS を使用してスタイルを管理している限り、これらの問題はうまく解決できると指摘しました。これは理にかなっていると言わざるを得ませんが、このアプローチには複雑さがあり、関連する他の問題も引き起こします。実際、ブラウザが :hover 疑似クラス状態をどのように処理するかを観察するだけでも、いくつかのことは CSS の**非常に早い段階*** で実際に解決されていることがわかります。

CSS モジュール チームは、より合理的な方法で問題を解決できると感じています。CSS を現状のまま維持し、styles-in-JS コミュニティを基盤にして、より合理的な改善を行うことができます。私たちは CSS 本来の美しさを保ちながら解決策を見つけましたが、この結果に私たちを後押ししてくれた方々には今でも感謝の気持ちを持っています。皆ありがとう!

CSS モジュールとは何か、そしてなぜ CSS モジュールが未来であるのかを説明しましょう。

ステップ 1: ローカルの競合のようにグローバルな競合を考慮する必要はありません

CSS モジュールでは、各ファイルは独立したファイルにコンパイルされます。この方法では、一般的で単純なクラス セレクター名を使用するだけで済みます。グローバル変数を汚染することを心配する必要はありません。次に、この機能を説明するために 4 つの状態を持つボタンを作成します。

https://jsfiddle.net/pqnot81c/embedded/result/

CSS モジュールの前に行ったこと

スタイルの命名にはスーツの命名規則を使用して、HTML と CSS コードは次のようになります。

/* components/submit-button.css */.Button { /* all styles for Normal */ }.Button--disabled { /* overrides for Disabled */ }.Button--error { /* overrides for Error */ }.Button--in-progress { /* overrides for In Progress */
ログイン後にコピー
<button class="Button Button--in-progress">Processing...</button>
ログイン後にコピー

こうやって書くとなかなか良さそうです。 BEM コマンド モードを使用すると 4 つのスタイル変数が得られるため、ネストされたセレクターを使用する必要がありません。 Button の最初の文字を大文字にする方法を使用すると、前のコードや他の依存コードとの競合を効果的に回避できます。さらに、依存関係クラスを明確に示すために -- 構文を使用します。

一般に、これを行うとコードの保守が容易になりますが、命名規則を学ぶのに多大な労力を費やす必要があります。しかし、これはすでに CSS が現在提供できる最良のソリューションです。

CSS モジュールの登場後に私たちが行ったこと

CSS モジュールを使用すると、自分の名前が人気になりすぎることを心配する必要がなくなり、最も意味があると思われる名前を使用するだけで済みます:

/* components/submit-button.css */.normal { /* all styles for Normal */ }.disabled { /* all styles for Disabled */ }.error { /* all styles for Error */ }.inProgress { /* all styles for In Progress */
ログイン後にコピー
ログイン後にコピー

ご注意ください。ここでは単語ボタンを使用しないでください。しかし、逆に考えてみましょう。なぜそれを使用する必要があるのでしょうか?このファイルの名前は submit-button.css です。他の言語ではローカル変数にプレフィックスを付ける必要がないため、CSS にこの面倒な機能を追加する必要がある理由はありません。

require または import を使用して JS からファイルをインポートすることで、CSS モジュールをコンパイルすることができます。

そうですか

実際、コンパイル後、クラス名は自動的に生成され、一意であることが保証されます。 CSS モジュールはすべてを行い、最終的には JS と対話する ICSS サフィックス ファイルにコンパイルします (詳細については、ここをお読みください)。したがって、プログラムは最終的に次のようになります:

/* components/submit-button.js */import styles from './submit-button.css';buttonElem.outerHTML = `<button class=${styles.normal}>Submit</button>`
ログイン後にコピー

クラス名が上記の例のように変更された場合、成功おめでとうございます!

命名規則

さて、戻ってサンプルコードを詳しく見てみましょう:

<button class="components_submit_button__normal__abc5436">  Processing...</button>
ログイン後にコピー

すべてのクラスは互いに独立しており、「基本クラス」と他のクラスは存在しないことに注意してください。クラスは統合され、「この場合、そのプロパティをオーバーライドします。 CSS モジュールの各クラスには、この要素に必要なすべてのスタイルが含まれている必要があります (これについては後で詳しく説明します)。これは、JS でスタイルを使用する場合に大きな違いを生みます:

/* components/submit-button.css */.normal { /* all styles for Normal */ }.disabled { /* all styles for Disabled */ }.error { /* all styles for Error */ }.inProgress { /* all styles for In Progress */
ログイン後にコピー
ログイン後にコピー

もちろん、給与が文字列の長さに基づいて計算されるのであれば、好きなようにすることができます。

React の例

CSS モジュールは React 固有の機能ではありませんが、React で CSS モジュールを使用するとより楽しいと言わざるを得ません。このため、次のような楽しくスムーズな例を示す必要があると感じます:

/* Don't do this */`class=${[styles.normal, styles['in-progress']].join(" ")}`/* Using a single name makes a big difference */`class=${styles['in-progress']}`/* camelCase makes it even better */`class=${styles.inProgress}`
ログイン後にコピー

クラスの名前がグローバル スタイル シートの名前と競合することを心配する必要はありません。これにより、より注意を集中させることができます。スタイルではなくコンポーネントです。一度使ったら元のモードには戻れなくなること請け合いです。

しかし、これはすべての始まりにすぎません。 CSS モジュール性は基礎ですが、スタイルをまとめる方法を考えるときが来ました。

ステップ 2: コンポーネントがすべてです

各クラスには、さまざまな状態のボタンの**すべて** スタイルが含まれている必要があると前述しましたが、BEM 命名方法と比較すると、コードは次のように異なる場合があります。

/* BEM Style */innerHTML = `<button class="Button Button--in-progress">`/* CSS Modules */innerHTML = `<button class="${styles.inProgress}">`
ログイン後にコピー

那么问题来了,你怎么在所有的状态样式中**共享**你的样式呢?这个答案就是 CSS 模块的强力武器 - **组件**:

.common {  /* all the common styles you want */}.normal {  composes: common;  /* anything that only applies to Normal */}.disabled {  composes: common;  /* anything that only applies to Disabled */}.error {  composes: common;  /* anything that only applies to Error */}.inProgress {  composes: common;  /* anything that only applies to In Progress */}
ログイン後にコピー

composes这个关键词将会使.normal类将.common内的所有样式包含进来,这个有点像 Sass 的 @extends 语法。但是 Sass 依赖重写你的 CSS 文件达到效果,而 **CSS 模块最后会通过 JS 编译导出,不需要修改文件**(译者注:下面会有例子详细说明)。

Sass

按照 BEM 的命名规范,我用 Sass 的 @extends 写的话可能会像如下的代码:

.Button--common { /* font-sizes, padding, border-radius */ }.Button--normal {  @extends .Button--common;  /* blue color, light blue background */}.Button--error {  @extends .Button--common;  /* red color, light red background */}
ログイン後にコピー

编译后的 CSS 文件如下:

.Button--common, .Button--normal, .Button--error {  /* font-sizes, padding, border-radius */}.Button--normal {  /* blue color, light blue background */}.Button--error {  /* red color, light red background */}
ログイン後にコピー

你可以只需要**一**个类来标记你的元素

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

&lt; Progress&gt;の目的は何ですか 要素? &lt; Progress&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML&lt; Progress&gt;について説明します。要素、その目的、スタイリング、および&lt; meter&gt;との違い要素。主な焦点は、&lt; Progress&gt;を使用することです。タスクの完了と&lt; Meter&gt; statiの場合

HTMLは初心者のために簡単に学ぶことができますか? HTMLは初心者のために簡単に学ぶことができますか? Apr 07, 2025 am 12:11 AM

HTMLは、簡単に学習しやすく、結果をすばやく見ることができるため、初心者に適しています。 1)HTMLの学習曲線はスムーズで簡単に開始できます。 2)基本タグをマスターして、Webページの作成を開始します。 3)柔軟性が高く、CSSおよびJavaScriptと組み合わせて使用​​できます。 4)豊富な学習リソースと最新のツールは、学習プロセスをサポートしています。

&lt; datalist&gt;の目的は何ですか 要素? &lt; datalist&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML&lt; Datalist&GT;について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

&lt; meter&gt;の目的は何ですか 要素? &lt; meter&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html&lt; meter&gt;について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化&lt; Meter&gt; &lt; Progress&gt;およびex

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

&lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? &lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、&lt; iframe&gt;外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

HTML、CSS、およびJavaScriptの役割:コアの責任 HTML、CSS、およびJavaScriptの役割:コアの責任 Apr 08, 2025 pm 07:05 PM

HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

HTMLでの開始タグの例は何ですか? HTMLでの開始タグの例は何ですか? Apr 06, 2025 am 12:04 AM

Anexampleapalofastartingtaginhtmlis、それはaperginsaparagraph.startingtagsaresentionentientiontheyinitiateelements、definetheirtypes、およびarecrucialforurturingwebpagesandcontingthomedomを構築します。

See all articles