HTML、CSS都是简单的描述性语言,本身并没有逻辑。当页面变得越来越复杂多变,就需要一种有效的开发方式来让事情变得有条理一些。
Classtyle就是这样一种开发方法,它借鉴了“面向对象”的思想,结合HTML和CSS语言的特点,将其运用到HTML&CSS开发中。
顾名思义,Classtyle是基于“类(class)”来开发“样式(style)”。
“类”是一类内容块(比如导航条、列表等)的抽象定义,这类内容块有可能被开发者放置在页面中的任何地方,它们具有一些自身的外观表现,内部可能有一些特定的内容(比如左侧有图片、右侧有文字等),甚至它们还可能有一些特殊的状态和功能(比如处于鼠标划过的状态、处于禁用状态、显示/不显示图片等)。
“类”是在CSS中定义:
CSS
/**
* 一个Classtly类定义的示例
* @class classtyleClass
*/
.classtyleClass{...}
...
在CSS中将“类”定义好后,就可以在HTML文档中使用它们了。这时,就产生了一个属于这个“类”的具体的东西,我们把它称为“对象”。
HTML
<div class="classtyleClass">...</div>
“对象”通常应该有一个名字以便与其他同属一类的“对象”区分,但在Classtyle中“对象”名并不是必须的。
“对象”名建议用HTML元素的id属性来命名,也可以使用class属性:
HTML
<div id="classtyleObject" class="classtyleClass">...</div>
<div class="classtyleObject classtyleClass">...</div>
同属一类的不同“对象”可以拥有不同的外观表现,将这些CSS属性写在“类”定义之后即可覆盖“类”的默认值:
CSS
/**
* Classtly类
* @class classtyleClass
*/
.classtyleClass{...}
...
/**
* Classtly类的一个对象
* @object classtyleObject
* @new classtyleClass
*/
#classtyleObject{...}
...
Classtyle中,“类”只能对其内部内容的外观表现进行定义,同时具有保护其内部内容不受其他CSS定义干扰的特性,我们称为“封装”。
“类”的内部内容,我们称为“成员”。Classtyle中所有“成员”都是其所属的“类”私有的,不可直接在某个“类”中调用其他不相关的“类”的“成员”。
建议使用下划线“_”连接“类”名和“成员”名,来为“成员”命名:
CSS
/**
* 一个拥有_member1和_member2成员的Classtly类
* @class classtyleClass
* @member _member1
* @member _member2
*/
.classtyleClass{...}
...
/* member1成员 */
.classtyleClass_member1{...}
...
/* member2成员 */
.classtyleClass_member2{...}
...
Classtyle中,“类”的“成员”仍然是一个“类”,它们在CSS中定义。当HTML中调用时,才成为一个“对象”。
HTML
<div class="classtyleClass">
...
<div class="classtyleClass_member1">...</div>
<div class="classtyleClass_member2">...</div>
...
</div>
“成员”的“对象”名需要用下划线“_”与调用它的“对象”名连接:
HTML
<div id="classtyleObject" class="classtyleClass">
...
<div id="classtyleObject_x" class="classtyleClass_member1">...</div>
<div id="classtyleObject_y" class="classtyleClass_member1">...</div>
<div id="classtyleObject_z" class="classtyleClass_member2">...</div>
...
</div>
<div class="classtyleObject classtyleClass">
...
<div class="classtyleObject_x classtyleClass_member1">...</div>
<div class="classtyleObject_y classtyleClass_member1">...</div>
<div class="classtyleObject_z classtyleClass_member2">...</div>
...
</div>
下面是一些 错误 的使用“成员”的示例:
HTML
<div class="man">
<div class="man_head">
<div class="woman_body"> /*错误地在“man”类的对象中调用了“woman”类的成员“_body”*/
...
</div>
...
</div>
<div class="objZhang man">
<div class="objZhang_head man_head">
<div class="objLi_body man_body"> /*错误的“对象”名*/
...
</div>
...
</div>
CSS
/**
* 一个在classtyleClass类中修改otherClass类的错误示例
* @class classtyleClass
*/
.classtyleClass{...}
.classtyleClass_members{...}
.otherClass{...} /*不能在classtyleClass类的定义中直接修改otherClass类的外观表现*/
在创建一个“类”的时候,如果这个“类”是以某个已存在的“类”为基础进行扩展,这个过程我们称为“继承”。从已存在的“类”的角度来看,如果需要在这个已存在的“类”的基础上创建一个新“类”,我们称为“派生”。
被当作基础的“类”和新创建的“类”,我们分别称为“基类”(或“父类”)和“继承类”(或“子类”、“派生类”)。“继承类”拥有“基类”的所有“成员”和外观表现,同时拥有自己的“成员”和外观表现。“继承类”可以任意使用、重写“基类”的“成员”和外观表现,但“基类”不能反过来使用、重写“继承类”的成员和外观表现。
“继承”和“派生”本是同一个过程的不同说法,但在Classtyle中,“继承”和“派生”出来的新“类”在命名上有不同的规则:
建议使用中划线“-”连接“基类”名和“派生”出来的“继承类”名来为“继承类”命名,在HTML中,需要在class属性中同时写上“基类”和“继承类”的类名:
CSS
/**
* 基类
* @class classtyleClass
* @member _member
*/
.classtyleClass{...}
...
/**
* 继承类
* @class classtyleClass-new
* @base classtyleClass
* @member _member
*/
.classtyleClass-new{...}
.classtyleClass-new_member{...}
.classtyleClass-new .classtyleClass_member{...} /*重写基类classtyleClass的成员_member*/
HTML
<div class="classtyleClass classtyleClass-new">
<div class="classtyleClass_member"></div> <!--classtyleClass类的成员_member-->
<div class="classtyleClass-new_member"></div> <!--classtyleClass-new类的成员_member-->
</div>
至于“继承”,只需在HTML中同时写上“基类”和“继承类”的类名即可,无需使用“-”连接来命名“继承类”。
HTML
<!--myClass类的成员myClass_member类“继承”classtyleClass类-->
<div class="myClass">
<div class="myClass_member classtyleClass">
<div class="classtyleClass_member">...</div>
</div>
</div>
CSS
/**
* myClass类
* @class myClass
* @member _member
* @requires classtyleClass
*/
.myClass{...}
...
区分“继承”和“派生”的目的在于,“派生”的情况相对稳定,开发者从“基类”派生出“继承类”后,一般不会轻易调整它们的继承关系。“继承”则更灵活,即使调整继承关系,也不用更改类名。“派生”更适合可预见的情况,“继承”更适合不可预见的情况。
Classtyle中,“继承类”可以同时继承多个不同的“基类”来达到目的:
HTML
<!--myClass类的成员myClass_member类“继承”class1类和class2类-->
<div class="myClass">
<div class="myClass_member class1 class2">
<div class="class1_member">...</div>
<div class="class2_member">...</div>
</div>
</div>
CSS
/**
* myClass类
* @class myClass
* @member _member
* @requires class1,class2
*/
.myClass{...}
...
下面是一些 错误 的使用“继承”或“派生”的示例:
HTML
<div class="classtyleClass-new"> <!--class属性中缺少“基类”的类名-->
...
</div>
<div class="classtyleClass classtyleClass-new classtyleClass-newer">
<!--
如果classtyleClass-newer是classtyleClass-new的“继承类”,
类名应该为“classtyleClass-new-newer”;
如果是“继承”多个“基类”,那缺少“继承类”的类名。
-->
...
</div>
CSS
/**
* classtyleClass类
* @class classtyleClass
* @member _member
*/
.classtyleClass{...}
.classtyleClass .classtyleClass-new_member{...} /*“基类”不能重写“继承类”的成员。*/
...
/**
* classtyleClass-new类
* @class classtyleClass-new
* @base classtyleClass
* @member _member
*/
.classtyleClass-new{...}
.classtyleClass-new_member{...}
...
如果开发者想让某些“类”在不同项目中使用,为了避免与项目中的类名重名冲突,可以使用“命名空间”。
建议“命名空间”使用中划线“-”与类名连接:
CSS
/**
* cs-classtyleClass类
* @class cs-classtyleClass
* @namespace cs
*/
.cs-classtyleClass{...}
...
Classtyle框架的CSS库提供的“类”,都在“cs”命名空间下。
Classtyle框架的CSS库提供了必要的功能,它包含了CSS Reset以及一些实用的“类”供开发者使用。
非必要的功能由扩展提供,由开发者自行选择。
我们示意图为例,演示如何使用Classtyle框架开发页面。

我们略去html、head、body等标签的说明,从body标签内部开始演示。
Classtyle页面的根节点是“cs-page”,所有页面内容都应该出现在根节点中。页头、主体和页脚是根节点的子节点,类名分别为“cs-header”、“cs-body”和“cs-footer”。
<div class="cs-page">
<div class="cs-header"></div>
<div class="cs-body"></div>
<div class="cs-footer"></div>
</div>
在CSS中重写“cs-page”类,设置合适的页面宽度。
/**
* 整体
* @class cs-page
*/
.cs-page{width:950px}
在CSS中重写“cs-header”类,设置合适的页头高度。
/**
* 页头
* @class cs-header
*/
.cs-header{height:90px}
在CSS中创建“logo”和“nav”类。
/**
* 标识
* @class logo
*/
.logo{width:...;height:...}
/**
* 导航条
* @class nav
* @member _item
*/
.nav{width:...;height:...}
.nav_item{float:left;width:...}
.nav_item:hover{...}
“cs-header”的两个匿名成员(也可以命名为“cs-header_logo”和“cs-header_nav”)分别继承“logo”和“nav”。
<div class="cs-page">
<div class="cs-header">
<h1 class="logo">Demo</h1>
<ul class="nav">
<li class="nav_item">Nav1</li>
<li class="nav_item">Nav2</li>
<li class="nav_item">Nav3</li>
</ul>
</div>
<div class="cs-body"></div>
<div class="cs-footer"></div>
</div>
如为cs-header的成员命名,则为:
<div class="cs-page">
<div class="cs-header">
<h1 class="cs-header_logo logo">Demo</h1>
<ul class="cs-header_nav nav">
<li class="nav_item">Nav1</li>
<li class="nav_item">Nav2</li>
<li class="nav_item">Nav3</li>
</ul>
</div>
<div class="cs-body"></div>
<div class="cs-footer"></div>
</div>
在“cs-header”类中设定“logo”和“nav”成员的位置。
/**
* 页头
* @class cs-header
*/
.cs-header{...}
.cs-header .logo{float:left}
.cs-header .nav{float:right}
如为cs-header的成员命名,则为:
/**
* 页头
* @class cs-header
* @member _logo
* @member _nav
*/
.cs-header{...}
.cs-header_logo{float:left}
.cs-header_nav{float:right}
在"cs-body"中创建两个匿名成员,继承“cs-part”的派生类“cs-part-1”和“cs-part-2”来实现左右栏布局。
<div class="cs-page">
<div class="cs-header">
<h1 class="logo">Demo</h1>
<ul class="nav">
<li class="nav_item">Nav1</li>
<li class="nav_item">Nav2</li>
<li class="nav_item">Nav3</li>
</ul>
</div>
<div class="cs-body">
<div class="cs-part cs-part-1"></div>
<div class="cs-part cs-part-2"></div>
</div>
<div class="cs-footer"></div>
</div>
在CSS中重写“cs-part-1”和“cs-part-2”类。
/**
* 主栏
* @class cs-part-1
* @base cs-part
*/
.cs-part-1{float:left;width:...}
/**
* 侧栏
* @class cs-part-2
* @base cs-part
*/
.cs-part-2{float:right;width:...}
在CSS中创建“box”类来实现侧栏的模块。
/**
* 模块
* @class box
* @member box_hd
* @member box_hd_title
* @member box_bd
* @member box_ft
*/
.box{border:...;padding:...}
.box_hd{background:...}
.box_hd_title{font-size:...}
.box-bd{padding:...}
.box-ft{}
未完待续 2011-5-13