看起来在Web开发领域中出现了一个新的流行语:面向对象CSS。
表面上看,这似乎只是将最佳实践打包成一个 catchy 的口号。我理解并完全尊重该运动背后的意图,但它是否有更多深层含义?
是否有人有更深入的见解,将此方法与其他方法区分开来,使其更加可信,还是我应该将其视为提醒自己确保正确地继承和级联我的类?
看起来在Web开发领域中出现了一个新的流行语:面向对象CSS。
表面上看,这似乎只是将最佳实践打包成一个 catchy 的口号。我理解并完全尊重该运动背后的意图,但它是否有更多深层含义?
是否有人有更深入的见解,将此方法与其他方法区分开来,使其更加可信,还是我应该将其视为提醒自己确保正确地继承和级联我的类?
我们可以说,层叠样式表在某种程度上是面向对象的,因为它们允许定义类,创建实例/对象(通过将类分配给元素),类的继承(甚至支持多重继承),抽象化(例如,通过为纯元素定义样式)和多态性(通过为不同的元素定义相同的类名)。当然,由于CSS的静态特性,方法/消息传递是不可能的。
因此,总体而言,我认为以面向对象的方式开发CSS是一种有效的方法,但我不会真正称其为面向对象的CSS,因为至少对我来说,这是CSS固有的特性。这有点像说“我正在做面向对象的Java…”
吸引眼球的流行语和合法的设计方法。
尽管我认为其中一些想法有点幼稚,它们倾向于忘记“客户随着开发而不断更改”的网络开发范例。
/* Nav
=================================================*/
/* B
---------------------------------------------*/
.nav
{
margin-left: 0;
padding-left: 0;
list-style: none;
}
/* E
---------------------------------------------*/
.nav__item
{
float: left;
}
.nav__link
{
display: block;
color: inherit;
text-decoration: none;
}
/* M
---------------------------------------------*/
.nav--right
{
float: right;
}
.nav--stack .nav__item
{
float: none;
}
Nav是应用于块元素的基本对象
子元素以nav_为前缀
修饰符以nav--为前缀
修饰符是更改行为的选项。例如,--right使导航向右浮动。
/* Nav
=================================================*/
/* E
---------------------------------------------*/
.pivot .nav__item
{
margin-left: 24px;
color: #aaa;
font-size: 36px;
}
.pivot .nav__item--active, .pivot .nav__item:hover
{
color: #000;
}
<ul class="pivot nav">
<li class="nav__item">
<a class="nav__link"> Item 1 </a>
</li>
<li class="nav__item">
<a class="nav__link"> Item 2 </a>
</li>
</ul>
<nav class="pivot nav">
<div class="nav__item">
<a class="nav__link"> Item 1 </a>
</li>
<div class="nav__item">
<a class="nav__link"> Item 2 </a>
</div>
</nav>
最终,您正在将容器与皮肤分离。我建议从Nicole Sullivan的Media Object开始更小地开始。查看Twiter Bootstrap和Inuit.css以获取更多灵感。
nav--<modifier>
,而不是为选择器#annoying_section_2chng .nav > <some element>
编写属性定义呢? - Erik ReppenOOCSS的最终目标是DRY。当您实际上正在创建类似事物的变体时,不应编写成千上万行的CSS。
Nicole在这个主题上做了一些好的演讲 - 她还写了一些文章,扩展了一些有用的技术并避免了一些不良实践。
'OOCSS'也是她编写的框架的名称,该框架提供了可扩展CSS布局的样板代码。为什么这个框架如此出色(网格模块几乎在我使用的所有地方都被使用)并不完全自证不疑,阅读她关于背后思想的博客文章肯定有助于更好地使用它和CSS。
我已经说了这个观点多年了。
CSS选择器基于实例ID和类。它甚至支持多重继承。这还能更明显吗?
将CSS视为对象的美妙之处在于,开始“转换”您的标记元素变得非常简单。需要让那个div突然变成INotRenderedAnymore吗?只需让JS扩展其类属性以匹配.removed
,不要玩弄样式属性。
显然,这是一个相当平凡的例子,但好处应该是清楚的 - 特别是在JS操作的情况下。您可以将JS与其必须修改的实际样式分离开来,这既是维护和抽象的优势,而且还有像不直接设置非常高特异性样式(CSS无法覆盖)等附加好处。
CSS在许多方面类似于面向对象编程语言:编写
p { color: red }
p span { color: blue }
而你基本上就有了继承。以下是更复杂的例子,将看门狗(terrier)继承自狗(dog),再由狗继承自动物类:
.animal { font-weight:bold; color: blue; }
.dog:before, .terrier:before { content: "GRRR"; }
.animal, .dog, .terrier { color: brown }
现在你可以以面向对象的方式使用动物、狗和梗类。
需要记住的是,CSS非常擅长解决它所设计用来解决的问题:以透明的方式指定元素的样式。如果加入更多面向对象的概念会更好吗?我不确定。假设有人说:如果CSS文件看起来像这样,那么它会更简单:
@class dog @derives_from animal /* the syntax i just invented */
@class terrier @derives_from dog
.animal { font-weight:bold; color: blue; }
.dog:before { content: "GRRR"; }
.terrier { color: brown }
这看起来更简单,但更简单的解决方案是在服务器端删除@class thing,同时将“dog”添加到任何“terrier”和“animal”添加到任何“dog”(使用简单的替换语句)或使用JavaScript。
CSS最好的一点是它很简单,并且很容易回退,这意味着浏览器不需要解释他们不理解的CSS,事情可以相对顺利地进行。由于您必须打破与主要新CSS结构的向后兼容性,我认为这使面向对象的CSS更像是一个流行词汇。
我认为这不是什么难事。
OOCSS 面向对象的层叠样式表
它减少了重复编写的代码量,你可以设置foocontainer
的全局CSS,然后在任何地方重复使用并为header
、body
和footer
设置自定义样式。
<div class="foocontainer header"> Your header </div> <!-- two classes -->
<div class="foocontainer body"> Your body </div> <!-- two classes -->
<div class="foocontainer footer> Some footer </div> <!-- two classes -->
BEM 块--元素__修饰符
这使得代码易于阅读但难以书写,您可以轻松地识别它们的子元素和父元素。
<div class="foocontainer--header"> Your header </div> <!-- one class -->
<div class="foocontainer--body"> Your body </div> <!-- one class -->
<div class="foocontainer--footer> Some footer </div> <!-- one class -->
这确实是像表格 VS div等等那些争议性的事情之一。
在我看来,有很多开发者太过于沉迷于面向对象编程(OO)以至于他们试图将其用于任何东西,首先是JavaScript,现在是CSS。别误会,JavaScript也有OO的元素,但我们不谈论这个。
由于CSS本身已经是一个热门词汇(所有雇主都想要Web 2.0的CSS方法),所以许多新开发人员正在发现它。这不是件坏事,但是作为开发者,他们会尽力改进CSS。在开发者的想法中(我是一名开发者),按照面向对象的原则组织CSS非常合理 - 因此出现了新的热门词汇。
最终我想说的是,面向对象的CSS只是某些人采取的一种方法,因为它似乎更合乎逻辑。如果您编写的CSS将由开发人员维护,那么这种方法很适合。它真的取决于你如何编写CSS和你自己的个人风格...
就我个人而言,我不在意人们如何编写他们的CSS - 如果我需要维护它,Firebug可以轻松完成这项工作。