BEM — Block Element Modifier is a methodology that helps you to create reusable components and code sharing in front-end development. BEM 是一种命名方法,能够帮助你在前端开发中实现可复用的组件和代码共享。
BEM(Block-Element-Modifier)是一种 CSS 模块化方法,旨在简化 CSS 编写并提高代码的可读性和可维护性,它将 HTML 元素划分为三个部分: 块
(block)、元素
(element) 和 修饰符
(modifier)。
块
(block)是 BEM 的核心部分,它定义了一个 HTML 元素的基本结构和行为。块可以使用大写字母命名,例如 .Header
、.Main
、.Footer
等。
元素
(element)是块的一个组成部分,它定义了块中特定内容的样式。元素可以使用小写字母命名,例如 .header
、.main
、.footer
等。
修饰符
(modifier)是针对块或元素的特定状态或行为进行配置的方法。修饰符可以使用中划线(_)或破折号(-)进行命名,例如 .header--large
、.main--centered
、.footer--light
等。
<nav class="breadcrumb" aria-label="Breadcrumb">
<ol class="breadcrumb__list">
<li class="breadcrumb__item"><a class="breadcrumb__link" href="#">Home</a></li>
<li class="breadcrumb__item"><a class="breadcrumb__link" href="#">About</a></li>
</ol>
</nav>
<a href="#" class="button">
<span class="button__prepend">
🚀
</span>
<span class="button__body">My Button</span>
<span class="button__append">
👨🚀
</span>
</a>
<article class="card">
<aside class="card__aside">
<figure class="card__figure">
<img src="xxx" alt="Dummy Image" class="card__image">
</figure>
</aside>
<header class="card__header">
<h2 class="card__title">Card Title</h2>
<h3 class="card__subtitle">
Card Subtitle
</h3>
</header>
<div class="card__body">
<p class="card__copy">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Reiciendis sint perspiciatis
deleniti ab possimus ut? Ducimus fugiat hic velit necessitatibus. Lorem ipsum dolor
sit amet consectetur adipisicing elit. Repellendus sapiente harum soluta excepturi ut
temporibus, at amet corporis id asperiores.
</p>
</div>
<footer class="card__footer">
<div class="card__actions">
<button class="button">
Button
</button>
</div>
</footer>
</article>
优点:
缺点:
OOCSS(Object-Oriented CSS)即面向对象的 CSS,它借鉴了 OOP(面向对象编程,OOP 已在 JavaScript 和 后端语言中得到广泛使用,不止是 JS 才会有 OOP面向对象模式,CSS 中的 OO写法 到现在已经不是一个新概念,2008年由 Nicole Sullivan 提出,目标是通过应用 Java 和 Ruby 等变成语言普及的面向对象设计原则,是动态CSS更易于管理)的抽象思维,主张将元素的样式抽象成多个独立的小型样式类,来提高样式的灵活性和可重用性。
两个基本原则:
<div class="box"></div>
<style>
.box {
width: 25%;
margin: 5px 10px 10px;
background: blue;
border: 1px solid #ccc;
}
</style>
像上面这个 box
的样式,使用 OOCSS
的话,需要创建更多的 “原子类”,并且每个样式对应一个类,这样可以重复使用这些样式,避免写相同的样式。代码如下:
<div class="size1of4 bgBlue solidGray mt-5 ml-10 mr-10 mb-10"></div>
<style>
.size1of4 { width: 25%; }
.bgBlue { background: blue; }
.solidGray { border: 1px solid #ccc; }
.mt-5 { margin-top: 5px; }
.mr-10 { margin-right: 10px }
.mb-10 { margin-bottom: 10px; }
.ml-10 { margin-left: 10px; }
</style>
优点:
缺点:
SMACSS(Scalable and Modular Architecture for CSS)是一种面向模块的 CSS 架构方法,它提倡将 CSS 代码分解为几个模块化的部分,以便更好地组织和管理样式。
SMACSS 将 CSS 代码分为五个主要类别:
reset.css
、normailze.css
之类的格式化元素样式 CSS。左右分栏
、栅格系统
等。导航栏
、产品列表
等。隐藏
、激活
等。链接颜色
、布局方式
等。SMACSS 推荐使用前缀来区分不同部件:
class
、ID
、!important
等。l-
或 layout-
,例如 .l-table
、.layout-grid
等。m-
或模块自身的命名,例如 .m-nav
、.card
、.field
等。is-
,例如 .is-active
、.is-current
等。theme-
,例如 .theme-light
、.theme-dark
等。<form class="layout-grid">
<div class="field">
<input type="search" id="searchbox" />
<span class="msg is-error">There is an error!</span>
</div>
</form>
优点:
缺点:
ITCSS(Inverted Triangle Cascading Style Sheets,「倒三角 CSS」)是一套方便扩展和管理的 CSS 体系架构,它兼容 BEM、OOCSS、SMACSS 等 CSS 命名方法论。由 Harry Roberts 创建,它基于分层的概念把我们项目中的样式分为七层。
根据 ITCSS 的思想,你可以这样组织你的 CSS 样式文件:
stylesheets/
├── settings/
│ ├── colors.scss
│ ├── z-layers.scss
│ └── breakpoints.scss
├── tools/
│ ├── mixins.scss
│ └── functions.scss
├── generic/
│ ├── box-sizing.scss
│ └── normalize.scss
├── base/
│ ├── img.scss
│ └── list.scss
├── objects/
│ ├── grid.scss
│ └── media.scss
├── components/
│ ├── buttons.scss
│ └── slider.scss
├── trumps/
│ ├── widths.scss
│ └── gaps.scss
└── index.scss
优点:
缺点: