CSS module_html/css_WEB-ITnose

WBOY
リリース: 2016-06-21 09:07:59
オリジナル
1045 人が閲覧しました

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 */}
ログイン後にコピー

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート