`

重构: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{background-color: #fff0f8;} 
.data th{color: #000; font-weight:bold}

 

  • 大小: 41.4 KB
分享到:
评论

相关推荐

    CSS网站布局实录 (第二版)PDF版

    本书是一本讲述基于Web标准的应用CSS进行网站布局设计与重构的典范之作。 本书以实例为主,一步步地告诉大家如何进行符合Web 2.0标准的CSS布局设计。具备了知识全面、完美应用(CSS选择器、样式继承、层叠、格式化、...

    前端最全汇总面试题及答案.docx

    JavaScript: 数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。 其他: HTTP、安全、正则、优化、重构、...

    2022前端企业高频问答题

    JavaScript: 数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。 其他: HTTP、安全、正则、优化、重构、...

    javascript 面向对象,实现namespace,class,继承,重载

    但是我前些日子也改过些许客户端的小bug,确实那代码看得让人有些云里雾里,不知身在哪山,轻易不敢动代码,于是就自己动手鼓捣起我曾又爱又恨的javascript来,自己写一个简单的js实现namespace,继承,重载等面向...

    编写高质量代码-Web前端开发修炼之道.azw3

    4.4 模块化CSS——在CSS中引入面向对象编程思想 4.4.1 如何划分模块——单一职责 4.4.2 CSS的命名——命名空间的概念 4.4.3 挂多个class还是新建class——多用组合,少用继承 4.4.4 如何处理上下margin 4.5 低...

    客客威客系统KPPW v2.5 GBK Beta.zip

    新版本程序结构深入改造,面向对象MVC设计模式,模块化挂接。减少重复造轮子,增加了代码的重用性,需要的时可以安装这个模块,不需要时可以卸载这个模块。 用户经验权限体系改造更体贴 新版本重构了用户经验权限...

    CS309-Object-Oriented-Programming:SUSTech课程CS309 OOP的个人回购

    CS309面向对象的程序设计SUSTech课程CS309 OOP的个人回购实验室Lab01:UML Lab02:UML续Lab03:Android Lab04:HTML,CSS,JS Lab05:观察者设计模式Lab06:J2EE mvc(请参见MVCProject文件夹) Lab07:J2EE mvc(请...

    do_something_express_part4:[表示]

    做某事第4部分对于今晚的作业,请将AJAX添加到您的前端以处理请求。 即:尝试将此应用程序转换为单页应用程序。... 从解决方案中获取该代码,然后对其进行重构以使其更加面向对象。选项B 努力实现以下目标。 完

    Telerik:特里里克学院

    ###面向对象编程 定义类-第一部分 定义类-第二部分 扩展方法,代表,Lambda,LINQ 基本原理-第一部分 基本原理-第二部分 普通型系统 游戏重构 团队项目 考试准备 ### HTML HTML简介 HTML表格 HTML表单和框架 语义...

    webfex:网络 fex 研究

    数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。 NodeJS: 对Node的优点和缺点提出了自己的看法? NodeJS...

    【卷一/共两卷】AJAX实战pdf高清版90M

    附录B 面向对象程序员Javascript指南 B.1 JavaScipt不是Java B.2 JavaScript中的对象 B.2.1 创建即时对象 B.2.2 构造函数、类和原型 B.2.3 扩展内建类 B.2.4 原型的继承 B.2.5 JavaScijpt对象的反射 B.2.6 接口和...

    程序员面试刷题的书哪个好-Interview-questions:分享自己整理的前端面试题及答案

    数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。 其他: HTTP、安全、正则、优化、重构、响应式、移动端、...

    ajax验证码异步刷新源码新手java-front-end-face-questions:史上最全前端开发面试问题及答案整理

    数据类型、面向对象、继承、闭包、插件、作用域、跨域、原型链、模块化、自定义事件、内存泄漏、事件机制、异步装载回调、模板引擎、Nodejs、JSON、ajax等。 其他: HTTP、安全、正则、优化、重构、响应式、移动端、...

    微信小程序实战开发视频教程

    面向对象设计实现数据储存5.Action-Sheet实现弹出6.加载默认设置、缓存读取控制Action-Sheet7.ActionSheet事件及占位符正则替换8.CSS环形动画原理及实现9.JS定时器是实现自动动画10.实现数字计时及语音提示

    tic-tac-toe-JS:TOP项目

    主要目的是使用工厂/模块模式练习面向对象的Javascript。 部署不完整,是为了帮助测试。去做已知错误 如果玩家单击速度太快,他们可能会错误地放置标记并软锁定游戏 Firefox上的灯光模式位置错误 绘制横幅不显示 ...

    asp.net知识库

    asp.net的网址重定向方法的比较:面向搜索引擎友好 也谈 ASP.NET 1.1 中 QueryString 的安全获取写法 ASP.NET运行模式:PageHandlerFactory 利用搜索引擎引用来高亮页面关键字 网站首页的自动语言切换 应用系统的多...

    Introducing JavaScript Game Development.pdf

    学习建立一个功能齐全的2D游戏灵感来自1979年Atari经典小行星,只用HTML 5,CSS和JavaScript。开发游戏从来没有像现在这样容易。...让创建面向对象的2D游戏的过程更有趣和更有效率,并开始您的游戏开发之旅。

    ObnoxiousModeSetClone

    或一个完整的重构,可以降低代码的复杂性并将其分解为更多的面向对象的原则-划分并分解为简单,可重用的部分。 但老实说,我希望两者都实现一项全新功能并重构原始代码。 您将采用什么技术/框架/模式? 敏捷/...

    web_project_7

    在项目7中,我们的重点是将JavaScript面向对象的结构,接口和模块应用于现有的对象。 描述 移动优先的自适应设计。 使用BEM方法构建的页面。 技术: HTML , CSS和JavaScript 。 位置: flexbox ,网格容器,...

    bowling-scorecard:Makers Academy 第 5 周挑战 - 使用 JavaScript、JQuery、TDD、OOP 的 10 针保龄球记分卡

    这对于在 JavaScript 中学习面向对象编程是一个巨大的挑战。 虽然获得基本游戏逻辑相对简单,但我的代码最初看起来非常丑陋,最难的部分是学习将代码重构为可管理的功能。 我还投入了大量精力来学习和掌握在我的...

Global site tag (gtag.js) - Google Analytics