以前看过模块化的相关资料以及解释,对模块化有了一个表皮的了解,自己也做了一些相关的实践,由于接触到的项目交小,所以也没能更好的去体现和理解模块化,但总体还是有那么一些感悟,但是如果要说怎么才能算是好的模块化,自己内心还是一个疑问。

前几天接到一个电话面试,谈到了css模块化的问题,觉得自己的回答太模棱两可,自己回答过后对自己的答案也不满意,没有一个周全的思考和考虑。

下面总结一下自己对css模块化的理解,尽可能的表达完善自己的想法以及对所查找到的资料的一个总结。

——————————————————————————————————————————————

1. 什么是模块化

百度词条解释的“ 模块化 ”:

模块化是指解决一个复杂问题时自顶向下逐层把软件系统划分成若干模块的过程。每个模块完成 一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。模块具有以下几种基本属性:接口、功能、逻辑、状态,功能、 状态与接口反映模块的外部特性,逻辑反映它的内部特性。在软件的体系结构中,模块是可组合、分解和更换的单元。”

我们所借鉴的是一种思维的方式。

2. CSS面向对象思想

  封装、继承、多态

封装:表意即包装,要点就是不同的特性抽象到一个基于类的模块里,封装是实现CSS模块化的最基本要求,封装成的各个单元就是基本的CSS模块,可灵活用于组建页面的各种显示样式。

css中的继承:指我们设置上级(父级)的CSS样式,上级(父级)及以下的子级(下级)都具有此属性

多态:多态主要用于同一模块在页面的不同部分或者不同页面之间呈现出不同的样式。

例如:我们可以将按钮这一类型封装成button类,但是会发现这一个button类并不会满足一个网站内所有按钮的样式,这时候我们就要观察按钮的样式,将按钮的公共样式提取出来,然后根据不同的需要再添加另外一个类,比如公共样式的类名为“btn-default”,蓝色的为“btn-info”,绿色的为“btn-successful”(这是借鉴bootstrap中的,也即多态),特殊需要也可以写类覆盖掉公共类中的一些样式,根据他的权值大小,。

但这样写出来的模块化也有弊端,有时候自己想想也都觉得矛盾(前台人员在写页面时挺方便使用,但是在后期维护中,需要调整样式,就不是在css里调整,而是可能需要到html结构中去调代码,甚至需要多处调整,也不便于维护)

2. CSS组织方式

目前见过有几种组织方式

base.css(reset功能,底层) + common.css(组件级的CSS类,中间层) + page.css(提供页面级的样式,高层,page层是页面级的,每个页面都可能会有自己的page层css)

这种第一次尝试写的时候,公共样式提出来放入common中,多态的放到哪?页面都可能会有自己的page层的放入page中,common和page层写着写着自己就完全混乱了,为什么混乱?因为公共样式和多态分开了,多态的放到哪?有时候自己都忘记了自己写的代码都在什么地方,哪一块是怎么样的,多态出来的或许可也把多态的放入一个新的css里,总之归结自己经验还太浅太浅。

header.css+container.css(中间可再细分)+footer.css+print.css+ie.css

此种划分以自己理解就是因为后台人员在处理时,往往是把头部和底部抽出成一个公共结构,然后各个页面都引入这个结构,(对于后期的维护是相当有效的, 因为涉及导航栏的修改仅需修改一次即可)

此种的弊端是什么?自己虽然不是处女座,但是如果一个页面内样式很少,一个超级多,自己内心也是崩溃的,少的你不浪费资源吗?感觉这个,头部和底部可以共用一个css文件,至于container,觉得全都装在这里面,不好找,还容易造成很乱的感觉,感觉可以在此基础上再分出来几个,可以结合第一种的组织方式

3. CSS如何划分模块——单一职责原则

从视觉上进行划分,样式和功能相对独立且稳定的一部分就可以视为模块,将这些相似的部分提取出来,再进一步拆分成更小的模块,模块与模块之间尽量不要包含,相同的部分,如果有相同部分,应将它们提取出来,拆分成一个独立的模块。应将模块拆得尽可能简单,以提高弹性。

第一次尝试这个时候,自以为还行,结果后来客户需求不明确,整个网站各个板块样式布局都要改,那叫一个惨不忍睹,血泪史,最后用继承和多态思想解决掉了。

4. 聚合/组合

这个建议查看http://blog.csdn.net/hacke2/article/details/21707133,很多都是借鉴此博主的,里面加了一些自己的主观感受,现在自己还不太确定,到底是挂多个calss还是新建的好,所以自己选择适当就好(缺少大项目经验啊,缺少对网站优化的经验)

http://blog.csdn.net/hacke2/article/details/21707885

谈 CSS 模块化的更多相关文章

  1. 谈CSS模块化【封装-继承-多态】

    第一次听到“CSS模块化”这个词是在WebReBuild的第四届“重构人生”年会上,当时我还想,“哈,CSS也有模块化,我没听错吧?”事实上,我没听错,你也没看错,早就有CSS模块化这个概念了.之所以 ...

  2. 浅谈CSS模块化

    为什么要CSS模块化? 你是否为class命名而感到苦恼? 你是否有怕跟别人使用同样class名而感到担忧? 你是否因层级结构不清晰而感到烦躁? 你是否因代码难以复用而感到不爽? 你是否因为commo ...

  3. 浅谈CSS的模块化

    一.简介 Web前端模块化:HTML模块化.CSS模块化以及JS模块化三个部分: 二.CSS模块化背景 对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目 ...

  4. 转:浅谈CSS在前端优化中一些值得注意的关键点

    前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...

  5. css模块化思想(一)--------命名是个技术活

    引子: 女孩子都喜欢买衣服,而我也不例外,奈何钱包太瘦,买不起高大上的定制,只能买撞衫率极高的休闲衣,不过对于我来说,我还是开心的,毕竟买衣服买的不仅是衣服,更是一种心情.在web前端的世界里,css ...

  6. css模块化及CSS Modules使用详解

    什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方 ...

  7. React(八)样式及CSS模块化

    (1)内联样式 注:样式要采用驼峰命令发,如果非要使用原生css样式写法,需加引号 缺点:一些动画,伪类不能使用 class App extends Component { constructor(p ...

  8. Vue中CSS模块化最佳实践

    Vue风格指南中介绍了单文件组件中的Style是必须要有作用域的,否则组件之间可能相互影响,造成难以调试. 在Vue Loader Scope CSS和Vue Loader CSS Modules两节 ...

  9. 没那么难,谈CSS的设计模式

    没那么难,谈CSS的设计模式 来源: 灵感的小窝  发布时间: 2016-09-09 16:46  阅读: 8949 次  推荐: 27   原文链接   [收藏]   什么是设计模式? 曾有人调侃, ...

随机推荐

  1. selenium webdriver 建行软键盘输入密码

    driver.get("https://ibsbjstar.ccb.com.cn/app/V5/CN/STY1/login.jsp"); driver.manage().timeo ...

  2. 在WPF中使用变通方法实现枚举类型的XAML绑定

    问题缘起 WPF的分层结构为编程带来了极大便利,XAML绑定是其最主要的特征.在使用绑定的过程中,大家都普遍的发现枚举成员的绑定是个问题.一般来说,枚举绑定多出现于与ComboBox配合的情况,此时我 ...

  3. memcache的内存管理探微

    slab分配器:http://blog.csdn.net/luotuo44/article/details/42737181 hash操作  :http://blog.csdn.net/luotuo4 ...

  4. Apple Pay 初探

    Apple Pay 一.概述 1.支付方式:Touch ID/ Passcode 2.设备要求:iPhone6以上(iphone:线上/线下 ipad:线上 watch:线下) 3.系统要求:iOS8 ...

  5. 常用的java正则表达式

    常用的正则表达式主要有以下几种: 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了哦 获取日期正则表达式:\d{4}[年|\-|\.] ...

  6. 【JavaScript】--ajax

    1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传 ...

  7. AE+C# 版本更新问题 命名空间“ESRI”中不存在类型或命名空间名称“Arcgis”(是缺少程序集引用吗?)

    解决办法: 1 引用 将下图中解决方案->引用中带感叹号的已用移除,然后添加新的.因为不同版本用的.dll不同,因此需要删除,然后重新加载. 如果是系统库文件, 直接在.NET下头添加,如果是自 ...

  8. SQUID常用命令

    Squid日常维护过程中,常用的一些命令: 1,初始化你在 squid.conf 里配置的 cache 目录squid -z如果有错误提示,请检查你的 cache目录的权限.可以使用使用更改目录权限: ...

  9. 用gulp构建你的前端项目

    前言 前端技术发展日新月异,随着模块化.组件化的提出,前端变得越来越复杂,静态资源越来越多,那么对静态资源的处理,如压缩,合并,去掉调试信息.. 如果还是人工去处理,效率非常之低且还容易出错,于是自动 ...

  10. oracle 11.2.0.4单实例文件系统安装与补丁

    [TOC] 一,预安装处理 1.版本准备 操作系统:RHEL 6.5 数据库版本:Oracle 11.2.0.4 相关包:p13390677_112040_Linux-x86-64_1of7.zip  ...