`
hax
  • 浏览: 950659 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于样式类(Style Class)

    博客分类:
  • CSS
阅读更多
我们知道HTML和CSS是正交的。这意味着可以分离内容结构(html文档)与外观样式(stylesheet)。

尽管是分离,但是最终页面的呈现需要把两者结合起来。这个结合机制就是selector。在基本selector中,tag和id是天然语义化的。问题在于class。很多时候我们发现添加class只是为了为html文档增加一个钩子,通过这个钩子,我们可以对文档的这个部分应用样式。有时候我们可以很容易将这个钩子语义化,即作为tag语义的细化或者补充。但是有时候也会无法语义化,从而出现纯粹的样式类(Style Class)。举例:.left、.red这样的,是典型的样式类,.style1,.style2则很可能是由工具产生的样式类。

样式类,有三种典型原因。

第一是语义归纳能力不足或者语义化的动力不足。比如你可能很容易识别出表格行的交错背景色,并用.row-even和.row-odd来细化语义。但是你可能却不能识别出交错浮动(一张图片左浮动,下一张图片右浮动,以此类推)。又如“同样风格的一段文字,有些要红色,有些却要绿色”。基本上颜色背后很可能暗藏着语义(比如两种不同的醒目标示),但是客户只告诉你,这里要红色,这里要绿色,他不会告诉你语义,就好像导演给女演员hotel的房间号但是通常不会明确告诉她要干啥,此乃潜规则。对此的解决之道,一是靠猜(看你对潜规则有多少经验),二是直接问导演你究竟想干嘛(当然需要点沟通技巧),三,对于一些你确定是ONS的(One occurreNce Style,一次性样式,也就是只适用于这个特殊页面的特殊部分),也可以考虑直接用inline style。ONS的需求是存在的(尽管有些同志BS它),比如在一篇文章中对不同图片的左右浮动定义可能仅仅是因为设计者觉得这样排版最sexy。

第二是缺乏对selector的认识。还是以交错对齐为例,同样是float:left对float:right,img.odd/img.even与img.left/img.right有什么区别?如果说前者就是语义化的,有些同志就不服气,因为你还是要返回去改html加上odd/even的钩子,而且它们貌似只是为了样式而存在。但是img:nth-of-type(2n+1){float:right} 和 img:nth-of-type(2n){float:left} 如何呢?高级selector的组合具有极强的描述能力。即使我们现在为兼容性仍然要用odd/even作为钩子,但是你确实知道这是一个高级selector的替代品,而不是附加的样式缩写。

第三是CSS本身的不足。最典型的例子是layout。layout通常要用一组rules来设定,而且常牵涉复杂的trick。当前CSS较缺乏高级布局能力,再加上布局本身的复杂性,所以我们有重用布局的需求。而布局所需的钩子就是预先设定的。虽然这些钩子仍然能被语义化(比如在多栏布局中不是写.top-bar、.left-col、.right-col,而可以写做.header、.main、.sidebar),甚至保持文档内容顺序独立于布局位置,但不可避免的,确实是由样式表预先决定了部分文档结构和类名。对于这个问题,我们要承认CSS不是完美的,而且布局有其内在复杂性。除了接受这个不完美,以及等待它变得更完美之外,另一个方式是引入像lesscss那样的CSS预编译,来管理样式的复杂性。lesscss的mixins机制可以把rules与语义钩子解耦,比如你可以定义两栏布局的.left-col和.right-col的样式,但是不直接使用这两个样式类,而是通过mixin方式将样式类内的rules混入到.main这样的语义类中(当然我更希望把.left-col写成@ruleset left-col {...},从而完全标明left-col是一个样式组合)。

BTW,对CSS进行增强是个有趣的话题,Bert Bos(CSS规范的主要编辑)有个著名的反对意见:Why “variables” in CSS are harmful ,但是Bert不会反对lesscss,因为它工作在正确的层次上。事实上,也因为有了lesscss类似的预编译手段,试图将style class正当化的Meta CSS更显得是个糟糕的主意。因为lesscss做的是对样式进行更高层级的抽象,Meta CSS却反其道而行。

总之,样式类虽然不至于罪大恶极,但还是应该,也可以尽量避免的。
3
2
分享到:
评论
1 楼 penciltim 2009-11-10  
写的很好,支持一下~


BTW~ONS:one night stand?呵呵,其实意思也差不多

相关推荐

    javascript动态设置样式style实例分析

    本文实例讲述了javascript动态设置样式style的方法。分享给大家供大家参考。具体分析如下: 动态修改style 1.易错:修改元素的样式不是设置class属性,而是className属性. 2.易错:单独修改样式的属性使用”style.属性...

    vue.js绑定class和style样式(6)

    数据绑定一个常见需求是操作元素的 class 列表和它的内联样式。因为它们都是 attribute,我们可以用 v-bind 处理它们:只需要计算出表达式最终的字符串。不过,字符串拼接麻烦又易错。因此,在 v-bind 用于 class 和...

    getComputedStyle与currentStyle获取样式(style/class)

    通过document.getElementById(element).style.xxx可以获取元素的样式信息但是对于通过class属性引用的外部样式表就获取不到了,感兴趣的朋友可以了解下

    vuejs绑定class和style样式

    本文主要介绍了vue.js实现绑定class和style样式的方法。具有很好的参考价值。下面跟着小编一起来看下吧

    vue通过style或者class改变样式的实例代码

    主要介绍了vue通过style或者class改变样式的实例代码,在文中给大家提到了vue的一些样式(class/style)绑定,需要的朋友可以参考下

    学习vue.js中class与style绑定

    关于vue.js中class与style绑定的练习代码,分享给大家,供大家参考: html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vuejs中Class与Style 绑定</...

    微信小程序动态添加class样式

    尺寸单位: rpx(responsive pixel): 可以根据...框架组件上支持使用 style、class 属性来控制组件的样式。 style:静态的样式统一写到 class 中。style 接收动态的样式,在运行时会进行解析,请尽量避免将静态的样式

    vue.js入门教程之绑定class和style样式

    小编之前介绍了通过vue.js计算属性,不知道大家都学会了吗。那这篇文章中我们将一起学习vue.js实现绑定class和style样式,有需要的朋友们可以参考借鉴。

    vue绑定class与行间样式style详解

    一、绑定class属性的方式 1、通过数组的方式,为元素绑定多个class <style> .red { color:red; /*color:#ff8800;*/ } .bg { background: #000; /*background: green;*/ } </style> [removed]...

    JavaScript操作class和style样式代码详解

    废话不多说了,直接给大家贴js代码了,具体代码如下所示: <!doctype html> <... <head>...style>.../style>...<div id=div class=fontSize xss=removed>div实例文本 <button onclick=changeStyle

    CSS对象教程检索下载

    如果class和style属性指定了两个相同的样式,那么使用style属性定义的样式取代class属性定义的样式 使用JavaScript可以动态改变style属性,从而改变标签的样式,也就是改变标签的显示方式 style属性-语法: ...

    vue.js学习笔记之绑定style样式和class列表

    数据绑定一个常见需求是操作元素的 class 列表和它的内联样式。因为它们都是 attribute,我们可以用 v-bind 处理它们:只需要计算出表达式最终的字符串。不过,字符串拼接麻烦又易错。因此,在 v-bind 用于 class 和...

    Javascript通过控制类名更改样式

    2. 为网页内的某个元素指定一个css样式来更改该元素的外观 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>className...

Global site tag (gtag.js) - Google Analytics