重构:CSS也面向对象
最初接触到面向对象的CSS还是因为项目中的CSS已经超过八千行,缺乏约束和管理,在近期或者是不远的将来,有迫切的要求需要重构。在前端重构中,我们已经讨论过了JavaScript面向对象的重构,在这个时候再看一看CSS面向对象和模块化,这给我的工作提供了非常好的思路。
首先,我要说的是,在这个概念翻飞的年代里,固执地追求某些概念和涵义,并不能带来更优秀的设计和更高的生产力,面向对象是一种思路,或者说是一种方法论,给CSS重构带来一些启示,这就足够了,没有必要去纠结OO CSS的定义和严谨性。
我们的CSS代码遇到了什么问题?
重用性差,看着一个CSS的名称,很难说出哪些模块可能引用到了它,这个CSS是用作网页的哪些部分的;
结果谁也不敢修改和删除,后面的样式只能往上面堆积;
怕CSS重名,s1、s2、t1、t2这样的命名开始出现了,这无异于饮鸩止渴,没有人知道这些样式是做什么的;
于是,CSS越来越大了;
做高保真的美工和业务开发人员思路是完全不同的,我们看到各种风格的CSS定义和命名;
有时候,也会遇到CSS冲突的问题,这一切,还是归结为那一句话:复杂是一切软件问题的根源。
CSS重构的原则:
纵向模块化:由大到小建立CSS模块文件,比如:公用 -> 门户 -> 频道 -> 栏目 -> 内容;
横向模块化:适用于一些独立性高的组件,比如播放器模块、弹出层模块;
提供指导性CSS:例如,准备几套list类型展示的样式,把整个系统中的list展示全部收拢到这一处来,未来皮肤的更换、比较和修改,相当程度上便利了美工;
CSS的拇指原则:如果同一功能区域的两个样式很相近,只保留一个!
框架(栏目)用网格来控制宽度,而内容控制高度,当页面上由若干个栏目组成,每个栏目的宽度可以固定或者被频道按比例固定,但是高度需要取决于内容。
CSS的规则定下来以后,需要开源和节流两个角度去控制与管理,一方面,新加入的CSS必须按照规则行事,这点需要给高保真设计人员和业务开发人员提要求;另一方面,原有CSS需要进行逐步的重构。
CSS本身是支持继承和模块化的,另外在HTML页面上,也可以比较容易地做到样式和扩展样式的使用,比如:《div class="player wmpPlayer"》。
如果有一天,项目的前端复杂到了需要对HTML也做UML建模的时候,那么把CSS也放进去吧。DOM和其附属、关联模型,本身就是很适合做建模的。

最后以http://oocss.org/的例子结尾:
- /* **************** TEMPLATE ***************** */
- /* ====== Page Head, Body, and Foot ====== */
- body{/*_text-align:center;*/}/* IE5.5 */
- .body{overflow:hidden; _overflow:visible; _zoom:1;}
- .page{margin: 0 auto; width: 950px;/*_text-align:left;*/} /* wraps other template elems to set width */ /* text-align IE5.5 */
- /* "old school" and "liquid" extend page to allow for different page widths */
- .oldSchool{width:750px;}
- .gs960{width:960px;}
- .liquid{extends:.page; width: auto;margin:0;}
- /* ====== Columns ====== */
- .main{overflow: hidden;_overflow:visible;_zoom:1;}
- .leftCol{float:left; width:250px;_margin-right:-3px;}
- .rightCol{float:right; width: 300px;_margin-left:-3px;}
- /* extend columns to allow for common column widths */
- .gMail{width:160px;}
- .gCal{width:180px;}
- .yahoo{width:240px;}
- .myYahoo{width:300px;}
- /* **************** CONTENT OBJECTS ***************** */
- /* ====== Default spacing ====== */
- h1, h2, h3, h4, h5, h6, ul, ol,dl, p,blockquote {padding:10px;}
- h1, h2, h3, h4, h5, h6,img{padding-bottom:0px;}
- pre{margin: 10px;}
- table h1,table h2,table h3, table h4, table h5, table h6, table p, table ul, table ol, table dl{padding:0;}
- /* ====== Elements ====== */
- img{display:block;}
- em{font-style: italic;}
- strong{font-weight:bold;}
- hr{border: 5px solid #e2e2e2; border-width: 0 0 5px 0; margin: 20px 10px 10px 10px;}
- code{color:#0B8C8F;}
- /* ====== Headings ====== */
- /* .h1-.h6 classes should be used to maintain the semantically appropriate heading levels - NOT for use on non-headings */
- h1, .h1{font-size:196%; font-weight:normal; font-style: normal; color:#AE0345;}
- h2, .h2{font-size:167%; font-weight:normal; font-style: normal; color:#AE0345;}
- h3, .h3{font-size:146.5%; font-weight:normal; font-style: normal; color:#DF2B72;}
- h4, .h4{font-size:123.1%; font-weight:normal; font-style: normal; color: #333;}
- h5, .h5{font-size:108%; font-weight:bold; font-style: normal; color:#AE0345;}
- h6, .h6{font-size:108%; font-weight:normal; font-style: italic; color:#333;}
- /* if additional headings are needed they should be created via additional classes, never via location dependant styling */
- .category{font-size:108%; font-weight:normal; font-style: normal; text-transform:uppercase; color: #333;}
- .category a{color: #333;}
- .important a{font-weight:bold;}
- /* links */
- a { color: #036; font-weight:bold;text-decoration: none }
- a:focus, a:hover { text-decoration: underline }
- a:visited { color:#005a9c; }
- /* ====== Lists ======*/
- /* numbered list */
- ol.simpleList li{list-style-type: decimal; margin-left:40px;}
- /* standard list */
- ul.simpleList li{list-style-type:disc; margin-left:40px;}
- /* ====== Tables ====== */
- .data{padding: 20px; position:relative; zoom:1;vertical-align: top;border-right:solid 1px transparent;/* border fixes a FF2 bug which causes the data table to overlay its borders*/}
- .data table {width:100%;border:1px solid #AE0345;}
- th, td{vertical-align:top;border:1px solid #AE0345;}
- .txtC, .data .txtC td, .data .txtC th{text-align:center;}
- .txtL, .data .txtL td, .data .txtL th{text-align:left;}
- .txtR, .data .txtR td, .data .txtR th{text-align:right;}
- .txtT, .data .txtT td, .data .txtT th{vertical-align:top;}
- .txtB, .data .txtB td, .data .txtB th{vertical-align:bottom;}
- .txtM, .data .txtM td, .data .txtM th{vertical-align:middle;}
- .data th,.data td{padding:3px 20px}
- .data thead tr{#fff0f8;}
- .data th{color: #000; font-weight:bold}
重构:CSS也面向对象的更多相关文章
- CSS代码重构与优化之路
作者:@狼狼的蓝胖子 网址:http://www.cnblogs.com/lrzw32/p/5100745.html 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多, ...
- CSS代码重构
CSS代码重构的目的 我们写CSS代码时,不仅仅只是完成页面设计的效果,还应该让CSS代码易于管理,维护.我们对CSS代码重构主要有两个目的:1.提高代码性能2.提高代码的可维护性 提高代码性能 提高 ...
- CSS代码重构与优化
CSS代码重构的基本方法 前面说到了CSS代码重构的目的,现在我们来说说一些如何达到这些目的的一些基本方法,这些方法都是易于理解,容易实施的一些手段,大家平时可能也不知不觉地在使用它. 提高CSS性能 ...
- CSS代码重构与优化之路(转)
CSS代码重构与优化之路 阅读目录 CSS代码重构的目的 CSS代码重构的基本方法 CSS方法论 我自己总结的方法 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多 ...
- 面向对象CSS (OOCSS)
新版 OOCSS 请关注 http://www.oocss.cc/ 时下流行面向对象,那么有没有可能把样式表也面向对象一下呢,将现在的CSS(Cascading Style Sheets层叠样式表)进 ...
- CSS重构:样式表性能调优
这两天窝在家里又看了本CSS相关的书:<CSS重构:样式表性能调优>.重构是指在不改变代码行为的前提下,重写代码,使其更加简洁.易于复用. 这本书读起来比较快,可挑自己感兴趣的读,前面三章 ...
- 编写可维护的CSS
在参与规模庞大.历时漫长且参与人数众多的项目时,所有开发者遵守如下规则极为重要: 保持 CSS 便于维护 保持代码清晰易懂 保持代码的可拓展性 为了实现这一目标,我们要采用诸多方法. 本文档第一部分将 ...
- CSS编写指导规范和建议
在参与规模庞大.历时漫长且参与人数众多的项目时,所有开发者遵守如下规则极为重要: 保持 CSS 易于维护 保持代码清晰易懂 保持 CSS 的可拓展性 为了实现这一目标,我们要采用诸多方法. 本文档第一 ...
- 通用 CSS 笔记、建议与指导
在参与规模庞大.历时漫长且人手众多的项目时,所有开发者遵守如下规则极为重要: + **保持 CSS 的可维护性** + **保持代码清晰易懂** + **保持代码的可拓展性** 为了实现这一目标,我们 ...
随机推荐
- 【转】Delphi的消息对话框
Delphi的消息对话框 输入输出inputBox()函数MessageBox()ShowMessage 对话框是Windows操作系统中程序与用户沟通的一种常见的交互方式,对话框可以向用户提供当前程 ...
- js验证表单大全
js验证表单大全 1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert(" ...
- MongoDB工具简要说明
[mongodb@hadoop1 bin]$ pwd /usr/local/mongodb/bin [mongodb@hadoop1 bin]$ ls -l total 207696 -rwxr-xr ...
- Kafka入门学习随记(二)
====Kafka消费者模型 参考博客:http://www.tuicool.com/articles/fI7J3m --分区消费模型 分区消费架构图 图中kafka集群有两台服务器(Server), ...
- kettle过滤、生成随机数、改变开始复制数量
下面是一个用Kettle实现数据过滤.生成随机数.改变开始复制数量的连贯示意图. 首先,我们将控件一一建立,通过hop建立连接 下面对每一个控件进行设置 1.生成随机数控件(随机取一个数字与字符串) ...
- 如何快速重置OUTLOOK2013,2016到初始配置状态,outlook 修改数据文件位置
适用范围: 安装OUTLOOK的机器 知识点分析: 快速清除当前OUTLOOK所有账户,回归到初始配置状态. 操作步骤: WIN+R调出运行 输入: C:\Program Files (x86)\Mi ...
- 基于perl的网络爬虫
use Mojo::UserAgent; use Bloom::Filter; use Smart::Comments; use DBI; my $dbname = "bbs_url&quo ...
- Python学习——struct模块的pack、unpack示例
he struct module includes functions for converting between strings of bytes and native Python data t ...
- 在DNS管理器——用局域网IP指定你所起的域名名称
在服务器上面,进行以下相关的操作: 第一步:打开DNS管理器; 第二步:在“正向查找区域”添加域名为:icanyin.net; 第三步:添加主机pm,将域名pm.icanyin.net解析为IP地址: ...
- R语言 如何为图片添加文字说明(转载)
转载:(中文翻译者)[http://blog.csdn.net/chen790646223/article/details/49766659] (原文链接)[http://datascienceplu ...