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

前几天接到一个电话面试,谈到了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. sql server报:名称 不是有效的标识符

    可能出现的几种情况: 1.执行sql提示 名称***不是有效的标识符 --添加括号 sql exec(sql) 注意exec的时候要到括号 exec  (@sql) 2.sql中的单引号嵌套采用两个单 ...

  2. JS脚本语言是什么意思?

    javascript,Javascript是一种浏览器端的脚本语言,用来在网页客户端处理与用户的交互,以及实现页面特效.比如提交表单前先验证数据合法性,减少服务器错误和压力.根据客户操作,给出一些提升 ...

  3. access基本操作(c#操作,远程连接,执行sql,加密,备份)

    前言 最近项目用到了access,是的就是access,工作在桌面型的小数据库应用还是会用到的,如果你确定永远不会遇到access的操作,请忽略此篇文章 1.vs配置access 既然是数据库,就少不 ...

  4. PHPCMS v9 安全防范教程

    一.目录权限设置很重要:可以有效防范黑客上传木马文件.如果通过 chmod 644 * -R 的话,php文件就没有权限访问了.如果通过chmod 755 * -R 的话,php文件的权限就高了. 所 ...

  5. linux学习日记之鸟哥

    2016年10月11日星期二 df命令解释:用于显示磁盘分区上可以使用的磁盘空间.默认显示单位为KB,可以用该命令来获取硬盘被占用了多少空间,目前还剩多少空间等信息.用法:df 选项 参数例:df – ...

  6. PhoneGap配置笔记

    关于PhoneGap简介: PhoneGap是一个用基于HTML,CSS和JavaScript的,创建移动跨平台移动应用程序的快速开发平台.它使开发者能够利用iPhone,Android,Palm,S ...

  7. 友盟推送 .NET (C#) 服务端 SDK rest api 调用库

    友盟推送 .NET SDK rest api 介绍 该版本是基于友盟推送2.3版本封装的,网上查询了下发现没有.NET版本的调用库,官方也没有封装.NET的版本,只有python.java.php版本 ...

  8. 自用VS Code 上的Markdown 编辑器css

    目标效果如下: 主题使用:Markdown Yellow 主题[https://marketplace.visualstudio.com/items?itemName=ms-vscode.Theme- ...

  9. HashMap源码阅读笔记(基于jdk1.8)

    1.HashMap概述: HashMap是基于Map接口的一个非同步实现,此实现提供key-value形式的数据映射,支持null值. HashMap的常量和重要变量如下: DEFAULT_INITI ...

  10. Swift -运算符和循环结构

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #4dbf56 } p.p2 { margin: 0.0px 0. ...