oocss(Object Oriented CSS)

59 阅读3分钟

oocss(Object Oriented CSS)

  • 什么是 OOCSS?

    • 分离结构和皮肤
    • 分离容器和内容
  • 优点和缺点

核心内容:

一个思想:面向对象编程;

两个原则:

1.分离结构(structure )和外观(skin )。 您应该在基础对象中保留结构和位置,并在扩展类中保留视觉特征(如 backgroundborder)。这样您就不必覆盖视觉属性。

2.分离容器(container )和内容(content )。 永远不要在 CSS 中模仿 HTML 的结构。换句话说,实际上就是要求所有样式尽可能脱离它的内容,不管一开始它是为谁而服务的。

什么是 OOCSS

<div class="box-border box-2">Learn CSS</div>
<div class="box-border box-1">Learn OOP</div> 
​
/* 重复的代码 */
.box-border{
  border: 1px solid #CCC;
  border-radius: 10px;
}
​
.box-1 {
  width: 200px;
  height: 200px;
}
​
.box-2 {
  width: 120px;
  height: 120px;
}

如果我们想让两个 div 的样式达到理想的效果,没有 box-border 这个公共类名,本身 box-1 和 box-2 单独作用是达不到理想的样式效果,换句话说 box-border 是基类 box-1 和 box-2 就是子类。

这就是在 CSS 中硬抽象出来的 OOP 概念,叫 OOCSS。

分离结构和皮肤

皮肤是我们可见的视觉属性,例如:

  • Colors 颜色
  • Fonts 字体
  • Shadows 阴影
  • Gradients 渐变
  • BackgroundColos 背景

结构当然就是我们不可见的视觉属性,例如:

  • Height 高度
  • Width 宽度
  • Position 位置
  • Margin
  • Padding
  • Overflow

Eg:

/* 结构 */
.card {
    border: 1px solid #ddd;
    padding: 16px;
    margin: 16px;
}
​
/* 外观 */
.card--primary
{
    background-color: #007bff;
    color: white;
}
​
.card--secondary
{ 
    background-color: #6c757d;
    color: white;
}

分离容器和内容

  • 不使用继承选择符(形如.container li{...}的结构),以达到子元素即使离开了容器也应该能正确显示的效果。
  • 尽量不给样式限定用途 以让样式具有可复用性。

Eg:

<ul class="list">
  <li class="list-item">Item 1</li>
  <li class="list-item">Item 2</li>
</ul>
.list {
    padding: 0;
    list-style: none;
}
​
.list-item {
    padding: 8px;
    border-bottom: 1px solid #ddd;
}

优点与缺点

优点:

扩展性: OOCSS 允许您在不同元素上自由混合和重新应用类,而无需过多考虑它们的上下文。一个项目的新手可以重用他们的前辈已经抽象出来的东西,而不是堆积在 CSS 上。

维护性: 添加或重新排列 HTML 标记不再需要您重新考虑整个 CSS 流程。这对于正在进行的大型项目尤其有用。

提高网站速度。 减少重复有助于应用程序运行得更快。CSS 文件习惯于随着网站的复杂性增加而呈指数级扩展,从而增加网页大小。

可读性: 当其他程序员看到您的 CSS 时,他们将能够快速理解其结构。

快速上手: 尤其是对了解面向对象编程的新手来说。

缺点:
  • 不适合小项目: 小型项目不一定需要可扩展性、可读性和可维护性。
  • 增加元素类的数量: 您可能需要将多个类添加到一个元素以说明所有样式元素。这可能会给不熟悉 OOCSS 的人带来一些困惑,并且会使您的标记变得混乱。
  • 有一个学习曲线: 如果您正在使用 OOCSS 而您的同事不熟悉它,这将需要他们在继续之前学习如何使用它,这需要时间。
  • 无语义化的类名: 根据两个核心的分离原则,我们代码中不可能会出现 .btn 这样一个类名搞定样式的情况,我们只会拆分的很细,但同时我们又需要 .btn 这样的业务类名。所以我们需要一种机制来解决这个问题。

参考

juejin.cn/post/702400…

juejin.cn/post/737801…