CSS の学習は、敷居が低く、ボトルネックが大きい典型的なプロセスです。私が初めて CSS に触れたとき、後から学べば学ぶほど、自分が何も知らなかったことに気づきました。 Zhang Xinxu 先生の「CSS 学習のボトルネックについて話しましょう」を読みました。この記事では、スケーラブルで保守可能な CSS コードを作成する方法を 4 つの側面から説明します:
合理的なセマンティック命名を使用する
モジュール化
命名規則に従う
単一責任原則に従う
<!-- bad --><div class=”footer”></div><!-- good --><footer></footer>
ここでは、Medium の CSS を使用して説明します:
<div class="stream"> <div class="streamItem"> <article class="postArticle"> <div class="postArticle-content"> <!-- content --> </div> </article> </div></div>
モジュール化: Modularize
上の図の各青いブロックはコンポーネントを表します:
<div class="stream"> <div class="streamItem"> <!-- product info --> </div></div>
各ストリーム項目にはサムネイルと機能情報が含まれます:
<!-- STREAM COMPONENT --><div class="stream"> <div class="streamItem"> <!-- POST COMPONENT --> <div class="post"> <img src="thumbnail.png" class="postThumbnail"/> <div class="content"> <!-- product info --> </div> </div> </div></div>
さらに読む:
BEM は最も単純ですが、最も厳密な命名規則でもあります:
.block {}.block__element {}.block--modifier {}
<div class="search"><input type="search__btn search__btn--active" /></div>
Intro to BEM
OOCSS, ACSS, BEM, SMACSS: what are they? What should I use?
SRP原则即只每个模块或者类只应承担软件系统中的某个单一功能,并且该职责应该完整地封装在类的内部,即对外屏蔽内部实现。而具体到CSS的领域里,SRP意味着某个代码片、类或者模块只应该做一件事。而在CSS的文件组织上,意味着像Carousels、Navigation Bar这样的组件应该有自己独立的CSS文件。
/components |- carousel |- |- carousel.css |- |- carousel.partial.html |- |- carousel.js |- nav |- |- nav.css |- |- nav.partial.html |- |- nav.js
另一个常见的文件组织方式就是按照功能进行文件组织,举例而言,在上述的代码片中,所有关于Carousel的文件都应该被放到同一个文件夹中。通过这种方式可以将文件索引变得更加容易。同样地,对于常见的全局样式而言,也需要适用于独立地全局样式:
/base |- application.css |- typography.css |- colors.css |- grid.css
在上述例子里,不同类型的全局样式需要分割到不同的文件中,这样的话如果你需要去更改你的颜色等等样式,那就很容易找到修改哪个文件。无论哪种文件组织方式比较顺眼,你都应该遵循统一的SRP原则。如果某个文件变得冗余臃肿,你应该考虑根据逻辑或者其他东西对内容进行切分。关于文件组织结构与CSS结构方面地深入阅读:
Aesthetic Sass 1: Architecture and Style Organization
Scalable and Maintainable CSS Architecture .
对于每个独立的CSS类而言,都应该只包含一个功能。换言之,应该根据关注点的差异将样式切分到不同的类中,这里有个小例子:
.splash { background: #f2f2f2; color: #fffff; margin: 20px; padding: 30px; border-radius: 4px; position: absolute; top: 0; right: 0; bottom: 0; left: 0;}
在上面这个例子里,我们搞错了某些关注点, splash 类不仅包含了其自己的展示的样式与逻辑,还定义了部分关于其子元素的样式,因此需要切分到两个单独类中:
.splash { position: absolute; top: 0; right: 0; bottom: 0; left: 0;}
.splash__content { background: #f2f2f2; color: #fffff; padding: 30px; border-radius: 4px;}
深入阅读:
The single responsibility principle applied to CSS
Single Responsibility .