谈 CSS 模块化
以前看过模块化的相关资料以及解释,对模块化有了一个表皮的了解,自己也做了一些相关的实践,由于接触到的项目交小,所以也没能更好的去体现和理解模块化,但总体还是有那么一些感悟,但是如果要说怎么才能算是好的模块化,自己内心还是一个疑问。
前几天接到一个电话面试,谈到了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 模块化的更多相关文章
- 谈CSS模块化【封装-继承-多态】
第一次听到“CSS模块化”这个词是在WebReBuild的第四届“重构人生”年会上,当时我还想,“哈,CSS也有模块化,我没听错吧?”事实上,我没听错,你也没看错,早就有CSS模块化这个概念了.之所以 ...
- 浅谈CSS模块化
为什么要CSS模块化? 你是否为class命名而感到苦恼? 你是否有怕跟别人使用同样class名而感到担忧? 你是否因层级结构不清晰而感到烦躁? 你是否因代码难以复用而感到不爽? 你是否因为commo ...
- 浅谈CSS的模块化
一.简介 Web前端模块化:HTML模块化.CSS模块化以及JS模块化三个部分: 二.CSS模块化背景 对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目 ...
- 转:浅谈CSS在前端优化中一些值得注意的关键点
前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加 ...
- css模块化思想(一)--------命名是个技术活
引子: 女孩子都喜欢买衣服,而我也不例外,奈何钱包太瘦,买不起高大上的定制,只能买撞衫率极高的休闲衣,不过对于我来说,我还是开心的,毕竟买衣服买的不仅是衣服,更是一种心情.在web前端的世界里,css ...
- css模块化及CSS Modules使用详解
什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方 ...
- React(八)样式及CSS模块化
(1)内联样式 注:样式要采用驼峰命令发,如果非要使用原生css样式写法,需加引号 缺点:一些动画,伪类不能使用 class App extends Component { constructor(p ...
- Vue中CSS模块化最佳实践
Vue风格指南中介绍了单文件组件中的Style是必须要有作用域的,否则组件之间可能相互影响,造成难以调试. 在Vue Loader Scope CSS和Vue Loader CSS Modules两节 ...
- 没那么难,谈CSS的设计模式
没那么难,谈CSS的设计模式 来源: 灵感的小窝 发布时间: 2016-09-09 16:46 阅读: 8949 次 推荐: 27 原文链接 [收藏] 什么是设计模式? 曾有人调侃, ...
随机推荐
- shell:遍历目录和子目录的所有文件
#!/bin/bash function getdir(){ ` do dir_or_file=$"/"$element if [ -d $dir_or_file ] then g ...
- ajax循环读取json多维数组
test.json: { "one": [ { "name": "黑默丁格", "car": "鲁LLL608 ...
- EChart数据的异步加载和更新
ECharts是国内开发一款图标插件,在网页中我们经常要用到图标显示,直接引用十分方便. 直接到ECharts主页调用插件 <!DOCTYPE html> <html style=& ...
- 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)
信鸽推送 .NET 服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...
- F#之旅7 - 图片处理入门
首先,隆重介绍今天的主角:ImageProcessor(http://imageprocessor.org/).虽然我并没有在实际工作中用到这个库,但是它干净利索的使用方式打动了我,很久以前就存了下来 ...
- windows 物理内存获取
由于我一般使用的虚拟内存, 有时我们需要获取到物理内存中的数据(也就是内存条中的真实数据), 按理说是很简单,打开物理内存,读取就可以了.但似乎没这么简单: #include "window ...
- DOM事件
在慕课网上学习了DOM事件探秘课程,特此整理了一下笔记. 慕课网DOM事件探秘课程地址:http://www.imooc.com/learn/138 事件 是文档或浏览器窗口中发生的特定的交互瞬间.[ ...
- SilverLight CheckBox 控件 DataContext属性与DataContextChanged事件
当CheckBox对象创建时,会触发一次DataContextChanged事件,默认值待定,销毁时不会触发,代码修改DataContext时也会触发
- POJ 3415 Common Substrings ——后缀数组
[题目分析] 判断有多少个长度不小于k的相同子串的数目. N^2显然是可以做到的. 其实可以维护一个关于height的单调栈,统计一下贡献,就可以了. 其实还是挺难写的OTZ. [代码] #inclu ...
- 最详细易懂的CRC-16校验原理(附源程序)(转)
最详细易懂的CRC-16校验原理(附源程序) from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CR ...