suchen
HeimWeb-FrontendCSS-TutorialLassen Sie uns darüber sprechen, warum CSS modularisiert werden muss. Wie implementiert man die Modularisierung?

css „lokaler“ Stil

sass und weniger teilweise das Problem der CSS-Modularisierung durch @import lösen. @import ,部分解决的 css 模块化的问题。

由于 css 是全局的,在被引入的文件和当前文件出现重名的情况下,前者样式就会被后者覆盖。
在引入一些公用组件,或者多人协作开发同一页面的时候,就需要考虑样式会不会被覆盖,这很麻烦。

// file A
.name {
    color: red
}

// file B
@import "A.scss";
.name {
    color: green
}

css 全局样式的特点,导致 css 难以维护,所以需要一种 css “局部”样式的解决方案。
也就是彻底的 css 模块化,@import 进来的 css 模块,需要隐藏自己的内部作用域。

CSS Modules 原理

通过在每个 class 名后带一个独一无二 hash 值,这样就不有存在全局命名冲突的问题了。这样就相当于伪造了“局部”样式。

// 原始样式 styles.css
.title {
  color: red;
}

// 原始模板 demo.html
import styles from 'styles.css';

<h1>
  Hello World
</h1>


// 编译后的 styles.css
.title_3zyde {
  color: red;
}

// 编译后的 demo.html
<h1>
  Hello World
</h1>

webpack 与 CSS Modules

webpack 自带的 css-loader 组件,自带了 CSS Modules,通过简单的配置即可使用。

{
    test: /\.css$/,
    loader: "css?modules&localIdentName=[name]__[local]--[hash:base64:5]"
}

命名规范是从 BEM 扩展而来。

  • Block: 对应模块名 [name]

  • Element: 对应节点名 [local]

  • Modifier: 对应节点状态 [hash:base64:5]

使用 __ 和 -- 是为了区块内单词的分割节点区分开来。
最终 class 名为 styles__title--3zyde

在生产环境中使用

在实际生产中,结合 sass 使用会更加便利。以下是结合 sass 使用的 webpack 的配置文件。

{
    test: /\.scss$/,
    loader: "style!css?modules&importLoaders=1&localIdentName=[name]__[local]--[hash:base64:5]!sass?sourceMap=true&sourceMapContents=true"
}

通常除了局部样式,还需要全局样式,比如 base.css 等基础文件。
将公用样式文件和组件样式文件分别放入到两个不同的目标下。如下。

.
├── app                      
│   ├── styles               # 公用样式
│   │     ├── app.scss       
│   │     └── base.scss      
│   │
│   └── components           # 组件
          ├── Component.jsx  # 组件模板
          └── Component.scss # 组件样式

然后通过 webpack 配置,将在 app/styles 文件夹的外的(exclude) scss 文件"局部"化。

{
    test: /\.scss$/,
    exclude: path.resolve(__dirname, 'app/styles'),
    loader: "style!css?modules&importLoaders=1&localIdentName=[name]__[local]--[hash:base64:5]!sass?sourceMap=true&sourceMapContents=true"
},
{
    test: /\.scss$/,
    include: path.resolve(__dirname, 'app/styles'),
    loader: "style!css?sass?sourceMap=true&sourceMapContents=true"
}

有时候,一个元素有多个 class 名,可以通过  join(" ")  或字符串模版的方式来给元素添加多个 class 名。

// join-react.jsx
<h1>
  Hello World
</h1>

// stringTemp-react.jsx
<h1>
  Hello World
</h1>

如果只写一个 class 就能把样式定义好,那么最好把所有样式写在一个 class 中。
所以,如果我们使用了多个 class 定义样式,通常会带一些一些逻辑判断。这个时候写起来就会麻烦不少。

引入 classnames ,即可以解决给元素写多个 class 名的问题,也可以解决写逻辑判断的麻烦问题。

classNames('foo', 'bar'); // => 'foo bar'
classNames('foo', { bar: true }); // => 'foo bar'
classNames({ 'foo-bar': true }); // => 'foo-bar'
classNames({ 'foo-bar': false }); // => ''
classNames({ foo: true }, { bar: true }); // => 'foo bar'
classNames({ foo: true, bar: true }); // => 'foo bar'

// lots of arguments of various types
classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'

// other falsy values are just ignored
classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'

引入 CSS Modules 的样式模块,每个 class 每次都要写 styles.xxx 也是很麻烦,在《深入React技术栈》提到了 react-css-modules

Da CSS global ist, wird der erstere Stil durch den letzteren überschrieben, wenn die importierte Datei und die aktuelle Datei denselben Namen haben.
Wenn Sie einige öffentliche Komponenten einführen oder wenn mehrere Personen zusammenarbeiten, um dieselbe Seite zu entwickeln, müssen Sie berücksichtigen, ob der Stil überschrieben wird, was sehr problematisch ist.

rrreeeDie Eigenschaften globaler CSS-Stile erschweren die Wartung von CSS. Daher ist eine Lösung für „lokale“ CSS-Stile erforderlich.
Das heißt, die CSS-Modularisierung muss vollständig sein. Das von @import importierte CSS-Modul muss seinen eigenen internen Bereich verbergen.

Das Prinzip der CSS-Module
🎜Durch das Hinzufügen eines eindeutigen Hash-Werts nach jedem Klassennamen entsteht kein globales Namenskonfliktproblem. Dies kommt der Fälschung eines „lokalen“ Stils gleich. 🎜rrreee🎜Webpack und CSS-Module🎜🎜Webpacks eigene css-loader-Komponente enthält CSS-Module, die durch einfache Konfiguration verwendet werden können. 🎜rrreee🎜Die Namenskonvention wurde von BEM erweitert. 🎜
  • 🎜Block: Entsprechender Modulname [name]🎜
  • 🎜Element: Entsprechender Knotenname [local]🎜 li>
  • 🎜Modifikator: Entsprechender Knotenstatus [hash:base64:5]🎜
🎜Die Verwendung von __ und -- dient zum Aufteilen von Knoten von Wörtern in der Blockdifferenzierung .
Der endgültige Klassenname lautet styles__title--3zyde. 🎜🎜Wird in einer Produktionsumgebung verwendet🎜🎜In der tatsächlichen Produktion ist es bequemer, es in Kombination mit Sass zu verwenden. Das Folgende ist die Konfigurationsdatei für Webpack, die mit Sass verwendet wird. 🎜rrreee🎜Normalerweise werden zusätzlich zu lokalen Stilen auch globale Stile benötigt, wie z. B. base.css und andere Basisdateien.
Legen Sie die öffentlichen Stildateien und Komponentenstildateien in zwei verschiedene Ziele. wie folgt. 🎜rrreee🎜Dann verwenden Sie die Webpack-Konfiguration, um die SCSS-Dateien außerhalb des Ordners app/styles zu „lokalisieren“. 🎜rrreee🎜Manchmal hat ein Element mehrere Klassennamen. Sie können dem Element über join(" ") oder eine Zeichenfolgenvorlage mehrere Klassennamen hinzufügen. 🎜rrreee🎜Wenn der Stil durch das Schreiben nur einer Klasse definiert werden kann, ist es am besten, alle Stile in einer Klasse zu schreiben.
Wenn wir also mehrere Klassen zum Definieren von Stilen verwenden, haben wir normalerweise einige logische Urteile. Das Schreiben wird zu diesem Zeitpunkt viel schwieriger sein. 🎜🎜Die Einführung von Klassennamen kann das Problem des Schreibens mehrerer Klassennamen für Elemente und das lästige Problem des Schreibens logischer Urteile lösen. 🎜rrreee🎜Bei der Einführung des Stilmoduls von CSS-Modulen ist es auch sehr mühsam, jedes Mal styles.xxx für jede Klasse zu schreiben. Im „Ausführlichen React Technology Stack“ wird react-css erwähnt -modules-Bibliothek, um das Schreiben von Code zu reduzieren. 🎜🎜Empfohlenes Lernen: „🎜CSS-Video-Tutorial🎜“🎜🎜

Das obige ist der detaillierte Inhalt vonLassen Sie uns darüber sprechen, warum CSS modularisiert werden muss. Wie implementiert man die Modularisierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Dieser Artikel ist reproduziert unter:segmentfault. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Die verlorenen CSS -Tricks von cohost.orgDie verlorenen CSS -Tricks von cohost.orgApr 25, 2025 am 09:51 AM

In diesem Beitrag zeigt Blackle Mori Ihnen einige der Hacks, die gefunden wurden, während Sie versuchen, die Grenzen der HTML -Unterstützung von Cohost zu überschreiten. Verwenden Sie diese, wenn Sie es wagen, damit auch Sie als CSS -Verbrecher bezeichnet werden.

Nächstes Level CSS -Styling für CursorNächstes Level CSS -Styling für CursorApr 23, 2025 am 11:04 AM

Benutzerdefinierte Cursoren mit CSS sind großartig, aber wir können die Dinge mit JavaScript auf die nächste Stufe bringen. Mit JavaScript können wir zwischen Cursorzuständen wechseln, dynamischen Text in den Cursor platzieren, komplexe Animationen anwenden und Filter anwenden.

Worlds Collide: Keyframe -Kollisionserkennung mit Style -AbfragenWorlds Collide: Keyframe -Kollisionserkennung mit Style -AbfragenApr 23, 2025 am 10:42 AM

Interaktive CSS -Animationen mit Elementen, die sich gegenseitig abprallen, scheinen im Jahr 2025 plausibler zu sein. Obwohl es unnötig ist, eine Pong in CSS zu implementieren

Verwendung von CSS-Hintergrund-Filter für UI-EffekteVerwendung von CSS-Hintergrund-Filter für UI-EffekteApr 23, 2025 am 10:20 AM

Tipps und Tricks zur Verwendung der CSS Backdrop-Filter-Eigenschaft, um Benutzeroberflächen zu stylen. Sie lernen, wie Sie Hintergrundfilter zwischen mehreren Elementen schichten, und integrieren sie in andere grafische CSS -Effekte, um aufwändige Designs zu erstellen.

Lächeln?Lächeln?Apr 23, 2025 am 09:57 AM

Nun, es stellt sich heraus, dass die integrierten Animationsfunktionen von SVG nie wie geplant veraltet waren. Sicher, CSS und JavaScript sind mehr als in der Lage, die Ladung zu tragen, aber es ist gut zu wissen, dass Smil nicht wie zuvor im Wasser tot ist

'Hübsch' ist im Auge des Betrachters'Hübsch' ist im Auge des BetrachtersApr 23, 2025 am 09:40 AM

Yay, let ' S sprung für Textschreiber: Pretty Landing in Safari Technology Preview! Aber achten Sie darauf, dass es sich von der Art und Weise unterscheidet, wie es in Chrombrowsern funktioniert.

CSS-Tricks Chronicles xliiiCSS-Tricks Chronicles xliiiApr 23, 2025 am 09:35 AM

Dieses CSS-Tricks-Update zeigt erhebliche Fortschritte im Almanac, den neuesten Podcast-Auftritten, einem neuen CSS-Leitfaden und der Hinzufügung mehrerer neuer Autoren, die wertvolle Inhalte beitragen.

Die @Apply -Funktion von Rückenwind ist besser als es klingtDie @Apply -Funktion von Rückenwind ist besser als es klingtApr 23, 2025 am 09:23 AM

Meistens präsentieren die Leute die @Apply-Funktion mit einer der einzelnen Properschafts-Dienstprogramme von Rückenwind (die eine einzelne CSS-Deklaration ändert). Wenn @Apply auf diese Weise präsentiert wird, klingt er überhaupt nicht vielversprechend. Also obvio

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Leistungsstarke integrierte PHP-Entwicklungsumgebung

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

SublimeText3 Linux neue Version

SublimeText3 Linux neue Version

SublimeText3 Linux neueste Version