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

前几天接到一个电话面试,谈到了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. Windows 网络编程

    网络编程 API ,失败返回 -,错误代码 WSASYSNOTREADY 表示基础网络子系统没有准备好网络通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPRO ...

  2. InstallSheild的一些常量

    在用InstallShield制作安装包的时候,我们经常需要用到一些常量,弄清楚这些常量的具体含义,可以方便我们灵活使用脚本. TARGETDIR  默认安装路径,在安装过程中用户可手动更改.如:安装 ...

  3. yii小细节

    1.main.php增加导航栏严格区分大小写,否则会出现404错误 2.增加'分页'功能---前后台的models里面的search.php 添加 public function search($pa ...

  4. MongoDB学习笔记

    MongoDB的学习目标(v.3.4.0) 1.MongoDB的概念,非关系型数据库NOSQL 2.学会MongoDB的搭建 3.熟悉MongoDB使用 最基本的文档的读写更新删除 各种不同类型的索引 ...

  5. MySql触发器语法总结

    经过昨天多次失败,今天终于将我要实现的触发器功能写成功了,触发器代码如下: -- use dbfortest; drop trigger if exists tg_before_insert_on_d ...

  6. 鼠标右击.exe的程序出现闪退(桌面重启)怎么办

    桌面鼠标右击,然后点NVIDIA控制面板(或者按windows+S组合键,在底下输入NVIDIA,然后点NVIDIA控制面板)   好了,然后任意找个文件试试...如图,问题完美解决  

  7. 三、线程同步之Sysnchronized关键字

    线程同步 问题引入 观察一面一段小程序: public class Main { private static int amount = 0; public static void main(Stri ...

  8. PHP 判断点是否在多边形内

    如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...

  9. 使用sublimehighlight 将文本 转化html

    a = "aaa" b = "bbb" c = "ccc" final = a + b + c print final import sys ...

  10. [原创]Centos7 从零编译配置Memcached

    序言 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. Memca ...