我刚刚找到了this interesting presentation关于“面向对象的CSS”的概念。这似乎是一个好主意,但演示文稿相当简短,并没有提供很多例子。
我的问题:
也许,你认为这个概念并不重要
答案 0 :(得分:13)
我是这么认为的,它基本上是为CSS作者使用的方法命名,与创建styleguides的方式基本相同。它有用吗?是。是否容易继承其他人的OOCSS工作?可能不是。
抽象某个组件的样式属性总是有利于整个站点的样式一致性。假设您想要更改组件的边框样式以获得全新的外观:您通常会更改有关边框样式主样式的几行。
我创建了一个关于我们网络应用中所有“小部件”的UI开发者样式指南(或样式词汇表)。每个小部件将根据其预期内容进行分类。每个小部件可以具有任意数量的预定义框样式,背景样式。每个小部件也可以根据放置在哪个父元素的不同来布置其内容。
这相当于代码:<div class="free bg_neutral form_search">
用于每个包装器/容器,每个类分别为:“Box Style,Background Style,Content”。
然后,处理HTML / Views的开发人员可以轻松切换出任何预定义的样式,并用更合适的样式替换它们。例如将bg_neutral
替换为bg_gradient_fff_eee
代替渐变背景。
我认为我们保存了无数的CSS代码,因为我们可以在几个核心“小部件”上使用可互换的属性,而不是定义每个“小部件”的每个独特的化身。它还使跨浏览器修复变得更加容易,因为您可以独立处理“小部件”样式。 (大多数浏览器错误与框尺寸和位置/布局有关)
在我看来,在设计和实现网站的前端时,更多UI用户需要通过StyleGuide / Style Vocab练习。在站点上使用的可视元素中创建一致性。一致的视觉效果通常会产生一致且高效的CSS!
希望有所帮助, ND
答案 1 :(得分:9)
我认为这个概念没有任何好处,因为CSS的当前定义已经基于面向对象,选择器,通配符等有点面向对象。
他们提到将容器与内容分开,这对我来说就是CSS已经完成的了。
答案 2 :(得分:5)
与问题相关的演示文稿由雅虎的性能工程师Nicole Sullivan提供。
Yahoo Developer Network网站上有video of the original presentation,github上有repository for the OOCSS project。
答案 3 :(得分:1)
幻灯片放映是一套很好的标准和指南。我一直使用它们,在我的设计中寻找模式和重复,然后将它们分解为组件。
导航,面板,网格,中继器,卡等。这些都是我为每个站点设计的常用组件。
我还为Utilities,Page和Content提供了单独的CSS文件。 Utilities存储像我的clearfix或margin normalizer,Page存储整体网站布局(页眉,页脚,主页),内容是一整套规则,用于标题,段落,链接,列表等。网站范围内。
答案 4 :(得分:0)
“面向对象”在这里有点用词不当,至少在严格的意义上是这样。但他提出的设计指南是合理而有用的,并且在某种程度上可以减轻CSS标准的“破碎性”。
他指出的问题 - 脆弱的设计,大文件,低可维护性等等,都是标准的结果,这种标准过于宽松,过于临时性,并且基于不再有效的原始设计目标。他正确地指出,成功的设计需要明确的头脑和大量的纪律。
答案 5 :(得分:0)
听起来像流行语跟我说话。正如John Rasch所说的那样 - CSS已经分类了。
答案 6 :(得分:0)
答案 7 :(得分:0)
我会爱在css中看到某种形式的继承。全面吹嘘?这可能是过度杀伤,但继承会以规模的方式缩小我的样式表的大小。
答案 8 :(得分:0)
好处是能够扩展对象并保持代码干燥和可读。那些反对它的人通常要么a)讨厌这个名字,要么b)从不使用它。我们这样说吧......
每个网站都有不同类型的导航。您可以在侧边栏中的标题正文中进行导航。也许,你甚至在页面上有标签或面包屑?您甚至可能需要一个页面上的富文本编辑器工具栏。这就是.nav抽象将发挥作用的地方。
.nav
{
margin-bottom: 24px;
margin-left: 0;
padding-left: 0;
list-style: none;
}
.nav--right
{
float: right;
}
.nav--stack .nav__item
{
float: none;
}
.nav__item
{
float: left;
}
.nav__item--active .nav__link
{
font-weight: bold;
}
.nav__link
{
display: block;
color: inherit;
text-decoration: none;
}
.nav__link:hover
{
text-decoration: underline;
}
这与我的所有控件中显示的代码相同。现在,我所要做的就是为它创建一些皮肤。
.side .nav__item
{
border-bottom: 1px dotted rgba(0, 0, 0, 0.2);
}
.side .nav__link
{
padding: 12px 0;
}
.tabs
{
border-bottom: 1px solid #aaa;
}
.tabs .nav__item
{
margin-right: 8px;
}
.tabs .nav__item--active .nav__link
{
margin-top: -2px;
position: relative;
border-bottom: 1px solid #fff;
bottom: -1px;
color: #000;
}
.menu .nav__item--active .nav__link
{
border-radius: 2px;
color: #fff;
background-color: #007bc3;
}
.menu .nav__link
{
padding: 12px 8px;
}
我正在做的就是为class属性编写对象的名称和外观的名称。这包括两者的属性。
<ul class="side nav nav--stack">
<li class="nav__item nav__item--active">
<a class="nav__link" href="#">
Item
</a>
</li>
<li class="nav__item nav__item--active">
<a class="nav__link" href="#">
Item
</a>
</li>
<li class="nav__item nav__item--active">
<a class="nav__link" href="#">
Item
</a>
</li>
不要惊慌地看到.nav_ 项目和.nav _link。大多数人使用li和a,但我想让它与标签无关。
答案 9 :(得分:0)
正如Tor Haugen指出的那样,术语“面向对象的CSS”#34;用词不当。
&#34;面向对象的CSS&#34;实际上只是一个如何充分利用CSS的设计模式,基本上与Jonathan Snooks调用SMACSS的方法相同。
无论您将其称为OOCSS还是SMACSS,该方法的关键是您创建通用UI元素,如nav abstraction。然后,通过向元素和/或容器元素添加额外的类,可以使用更具体的功能来增强这些UI元素。或者,您也可以使用元素的ID或语义类添加自己的自定义CSS规则。
对于OOCSS的真实世界示例,请查看Cascade Framework,Scally和InuitCSS等框架。
进一步阅读: