当前位置: 首页 > 编程日记 > 正文

[转载] CSS模块化【封装-继承-多态】

第一次听到“CSS模块化”这个词是在WebReBuild的第四届“重构人生”年会上,当时我还想,“哈,CSS也有模块化,我没听错吧?”事实上,我没听错,你也没看错,早就有CSS模块化这个概念了。之所以我把这个拿出来讨论,是因为一个算是比较大的项目出现了一些重构上的危机,因此引发了我们对页面重构中的CSS进行模块化的思考。

首先,什么是CSS模块化?在谈CSS模块化之前我们先看一下百度百科对模块化的解释:

“模块化是指解决一个复杂问题时自顶向下逐层把系统划分成若干模块的过程。每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。在系统的结构中,模块是可组合、分解和更换的单元。”

我对上面一段话的理解是,模块化就像我们玩乐高积木一样,一个积木就是一个单元,可以通过组合不同的积木来搭建一个玩具模型。对于一个玩具模型,也 可以更换部分积木而迅速变成另一个模型。而CSS模块化的关键,就是如何合适地构建这些单元,也就是一个一个的class,以及如何灵活运用这些单元来达 到我们所要的呈现效果。

说了一堆繁杂的话,连我自己都觉得乏味。作为一个热爱编程的页面仔,我想借用面向对象的三大特性来说明CSS模块化——封装、继承、多态。

一、 封装

封装

HTML代码

1
2
3
4
5
6
7
8
9
10
11
12
<div class=”module-a”>
  <h3>标题1</h3>
  <p>描述文字</p>
</div>
<div class=”module-b”>
  <h3>标题2</h3>
  <ul>
<li>列表</li>
<li>列表</li>
<li>列表</li>
  </ul>
</div>

CSS代码

1
2
3
4
5
6
7
8
9
.module-a{.....}
.module-a h3{.....}
.module-a p{.....}
.module-b{.....}
.module-b h3{.....}
.module-b ul{.....}
.module-b ul li{.....}
.module-b ul li{.....}
.module-b ul li{.....}

封装是实现CSS模块化的最基本要求,封装成的各个单元就是基本的CSS模块,可灵活用于组建页面的各种显示样式。

二、 继承

继承

HTML代码

1
2
<div class=” module module-A module-A-a”></div>
<div class=” module module-A module-A-b”></div>

CSS代码

1
2
3
4
5
6
7
.module {.....}
.module-A {.....}
.module-A-a {.....}
.module-A-b {.....}
.module-B {.....}
.module-B-a {.....}
.module-B-b {.....}

继承可谓是CSS模块化的关键所在,由于html元素可以拥有多个类,而且根据优先级,后面定义的属性可以覆盖前面的,正因为这样,继承这个特性发 挥了巨大的作用。对于某些多数样式属性相同,仅有几个不同样式属性的定义,可以用这个方法来实现。也可以在不改变某个通用样式类的同时,用HTML调用复 合类,突出局部特例。

三、 多态

HTML代码

1
2
3
4
5
6
7
8
9
10
<div class=”module-A”></div>
<div class=”part-A ”>
<div class=”module-A”></div>
</div>
<div class=”part-B ”>
<div class=”module-A”></div>
</div>
<div class=”part-C ”>
<div class=”module-A”></div>
</div>

CSS代码

1
2
3
4
.module-A {.....}
.part-A .module-A {.....}
.part-B .module-A {.....}
.part-C .module-A {.....}

多态主要用于同一模块在页面的不同部分或者不同页面之间呈现出不同的样式。对于CSS的多态,一个很经典而且常用的例子就是导航栏。我们知道,导航 栏往往需要标识出当前页面所在的导航链接。也就是说,对于导航栏的链接,通常有两种形态,一种是常态,一种是高亮态,比如处于主页时,主页的链接就是高亮 态的,其他导航链接是常态的。这个时候,很多人喜欢在li上加上一个current类,用来把该导航链接设置为高亮态,但是我觉得这种方式并不理想。

为什么呢?因为对于结构一样的导航栏,后台人员在处理时,往往是抽出成一个公共结构,然后各个页面都引入这个结构。这对于后期的维护是相当有效的, 因为涉及导航栏的修改仅需修改一次即可,如果不这么做,那么修改的次数将会等于页面的个数,而且容易出错。对于这种情况,多态就可以很好地解决,因为我们 可以在每个页面的body(或者其他地方)加上一个类来标识不同的页面(此类可以不定义任何样式)。那么,根据多态的特性,我们就可以为不同页面的导航设 置不同的形态,同时又保持了导航链接的结构一致性。举例如下:

HTML代码

主页:

1
2
3
4
5
6
7
<body class=”index”>
  <ul class=”nav”>
<li class=”index”><a href=”#”>主页</a></li>
<li class=”page1”><a href=”#”>内页1</a></li>
<li class=”page2”><a href=”#”>内页2</a></li>
  </ul>
</body>

内页1:

1
2
3
4
5
6
7
<body class=”page1”>
  <ul class=”nav”>
<li class=”index”><a href=”#”>主页</a></li>
<li class=”page1”><a href=”#”>内页1</a></li>
<li class=”page2”><a href=”#”>内页2</a></li>
  </ul>
</body>

CSS代码

1
2
3
4
5
6
7
8
9
/*定义常态*/
.nav{.....}
.nav .index{.....}
.nav .page1{.....}
.nav .page2{.....}
/*定义高亮态*/
.index .nav .index{.....}
.page1 .nav .page1{.....}
.page2 .nav .page2{.....}

这个就是多态的经典应用之一。

补充部分

joe哥指正,以上的这种对导航的处理办法不太好,因为导航是一个公用组件,所谓公用,就是应该结构和样式都是公用的,上面的那种方法没有做到样式上公 用,因为很明显定义高亮态那里需要用到其他页面的样式类,而且joe哥提到可移植性的问题,如果这个导航搬到其他地方,那么就需要为新的页面的body全 部都添加一个类(这个我真没想过导航还可以给多个网站重用,我眼光太短浅了)。那么,究竟什么做才是比较主流的呢?加current,没错,就是加 current,这个被我一开始就否决的方法。那么又回到原来的问题,既然我们是引入同一个导航文件,那么current能加到哪里呢?joe哥提出一个 被我们都忽略了的方法,脚本!可以是js,可以是php,原来我们可以动态添加current类到导航去,惊讶吧!

好吧,我承认我有点过于兴奋了,大伙儿看例子吧~

HTML代码

1
2
3
4
5
<ul class=”nav”>
  <li class=”index” id="index"><a href=”#”>主页</a></li>
  <li class=”page1” id="page1"><a href=”#”>内页1</a></li>
  <li class=”page2” id="page2"><a href=”#”>内页2</a></li>
</ul>

CSS代码

1
2
3
4
5
6
7
/*定义导航的样式*/
.nav{.....}
.nav li.index{.....}
.nav li.page1{.....}
.nav li.page2{.....}
/*定义高亮态*/
.nav li.current{.....}

JS代码

1
2
3
4
function addCurrent(class,html_id){
  //class为增加的样式类名,html_id为需要增加样式类的html元素的id
  document.getElementById(html_id).addClass(class); //这里的class就是‘current’,addClass方法的实现我这里就不多说了,你可以用jquery或者别的,甚至自己写
}

这种做法对于不同的页面,或者新增的页面,只需改js的一个参数即可,做到了把导航部分真正实现模块化、组件化,公用的部分就应该公用到底,不留一 点余地。不过我还想说一点是,如果你的current(高亮态)不是单独的换个背景颜色之类的,而是用雪碧图这类的方法,每个导航链接的current类 都是不同的,那么以上的这种方法,貌似还有待改进。

补充部分结束

事实上应该指出,我这里讨论的只是CSS模块化的一部分,可以说是比较微观的一部分。还有一些对CSS进行比较宏观地划分模块的说法,比如按页面来划分,一个页面或者说一个区域为一个模块,比如像“幸福收藏夹”上所说的划分方法:

网站的划分标准更大一些,是以网站的专题为模块,不幸的是,很多专题的页面风格都是类似的,导致各个模块间存在大量的冗余代码,这意味着对样式的改动将会相当麻烦,一个地方的改动需要同时修改多个css文件。

表面上看,虽然对CSS模块划分得细是一个不错的想法,但并不是越细越好。现在的一些开源系统,如dedecms,甚至说YUI框架的1.0版本, 都流行一种做法,就是把CSS模块细分成单属性,比如把宽度960px定义为.w960,把清除浮动定义.clear,把字体绿色定义为.green等 等。

这样做的好处是可以对页面元素的样式进行快速组装,通过引入多个类便可以达到我们想要的效果。但是,这样的做法会导致另外一个问题。大家想,这么做 与内联样式有什么区别?如果有一天,我们想要把多个地方的字体颜色由绿色改为红色,那么我们要做的不是改动css的color属性,而是把这些html元 素的class都由green改为red。请注意,我们的初衷是改变的页面表现,但最终我们需要改变结构来达到我们的目的,这样就做不到结构与表现的分离 了。

究竟怎么样划分CSS模块,又怎么来用这些模块来组建页面元素才是合适,其实很难找到一个标准,这不仅需要结合具体的页面要求,还需要一定的经验

转载于:https://www.cnblogs.com/crab/archive/2012/09/27/2706424.html

相关文章:

用jQuery写的一个翻页,并封装为插件,

用jQuery写的一个翻页&#xff0c;并封装为插件&#xff0c; 1 *{2 margin:0;3 padding: 0;4 list-style: none;5 text-decoration: none;6 }7 .page{8 width:500px;9 margin:100px auto; 10 color: #ccc; 11 } 12 .page a{ 13 display: inlin…

Ubuntu 将 /home 或 /var 目录挂载到新的分区

背景 在使用 docker 的过程中&#xff0c;docker 会将某些产物放到 /var/lib/docker/volumes 这会占用很大的跟目录磁盘空间&#xff0c;于是想办法将 /var 目录挂载到另一个一个单独的磁盘上面。 参考链接如下&#xff1a;Ubuntu将var目录挂载到新硬盘 步骤 1. 查看当前磁…

php 500 内部服务器错误,php 500 - 内部服务器错误的解决方法

php 500 - 内部服务器错误的解决方法发布时间&#xff1a;2020-11-04 09:55:31来源&#xff1a;亿速云阅读&#xff1a;71作者&#xff1a;小新小编给大家分享一下php 500 - 内部服务器错误的解决方法&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家…

网游生命周期在百度指数曲线上呈“M”形分布,各阶段搜索行为呈一定特征

&#xff08;本文转载自&#xff1a;http://data.baidu.com/youxi3/part1.html&#xff09; 产品生命周期就是一种新产品从开始进入市场到被市场淘汰的整个过程&#xff0c;进人和退出市场分别标志着周期的开始和结束。网络游戏的生命周期一般可以划分成测试期、成长期、成熟期…

配置Open***使用User/Pass方式验证登录

Open***和PPTP ***相比存在诸多的优势&#xff0c;最明显的是Open***支持NAT穿越&#xff0c;也就是说在nat环境下使用open***只需要一个在路由器上做一个端口映射即可&#xff01;不需要其他路由的支持&#xff0c;要知道不是所有的路由器都支持配置NAT穿越&#xff0c;只有高…

常惠琢 201771010102《面向对象程序设计(java)》第七周学习总结

实验七 继承附加实验 实验时间 2018-10-11 1、实验目的与要求 &#xff08;1&#xff09;进一步理解4个成员访问权限修饰符的用途&#xff1b; &#xff08;2&#xff09;掌握Object类的常用API用法&#xff1b; &#xff08;3&#xff09;掌握ArrayList类用法与常用API&#…

nginx php站点配置文件,php网站修改默认访问文件的nginx配置

搭建好lnmp后&#xff0c;有时候并不需要直接访问index.php&#xff0c;配置其他的默认访问文件比如index.html这时候需要配置一下nginx才能访问到你想要设置的文件直接上代码&#xff0c;如下是我的配置的一份简单的nginx到php-fpm的站点&#xff0c;该站点默认访问目录/ecmob…

CMake 打包已经存在的动态库生成 target

一. 背景 在 CMakeLists.txt 中&#xff0c;某模块 A 通过 add_subdirectory 引入模块 B &#xff0c;模块 B 通过 add_subdirectory 引入模块 C。模块 C 里面本身就是一个开源的动态库&#xff0c;比如 libtask。目的想要将 C 模块打包成一个 Target &#xff0c;以便在 A 模…

Ruby: Ruby脚本在测试中的使用

如果存在以下的场景&#xff1a;1. 放置在公司的读报机服务器&#xff0c;每天都是开启的&#xff1b;2. 读报机每天下载报纸&#xff0c;一旦成功/失败&#xff0c;就会有相应的记录生成在某个xml文件中&#xff1b;3. 现在有过去一年的读报机下载xml&#xff0c;大约有200多份…

cocos2d-xna for win8源代码轻松移植cocos-xna for wp游戏

无意间看到杨哥弄了一个cocos2d-xna for win8出来可惜没有放出源代码&#xff0c;我试着要了一下结果他没理我&#xff0c;各种画圈圈。 那我只好自己弄一个了&#xff0c;源代码放出大家供交流学习使用&#xff0c;像杨哥说的一样就是一点小bug很容易该成把wp改成win8版的&…

Oct 2018

Tasks motion planning code in Autonomous DrivingUdacity RoboticsNDCoursera RoboticsMotion PlanningEstimationF1/10 racecarProject Overview 1. Mooc Udacity RoboticsND: project 3 Coursera Robotics Motion Planning HomeworkNote --> Post  2. Leetcode ☆☆ …

Springboot+mybatisplus搭建新闻管理系统

模块化实现&#xff0c;一周轻松搭建 前端 后端 项目源码及其教程回复已三连备注邮箱领取

SQL Server存储过程输入参数使用表值

在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的&#xff0c;可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入。 在2008中提供了表值参数。使用表值参数&#xff0c;可以不必创建临时表或许多参数&#xff0c;即可向 Transact-SQL 语句…

ef core mysql 字符集,EF Core 基础知识

数据库连接字符串在 ASP.NET Core 添加配置片段&#xff1a;{"ConnectionStrings": {"BloggingDatabase": "Server(localdb)\\mssqllocaldb;DatabaseEFGetStarted.ConsoleApp.NewDb;Trusted_ConnectionTrue;"}}然后&#xff0c;配置对应的DbCont…

模板特化,全特化,偏特化,全部特化,部分特化的含义

模板特化&#xff0c;任何针对模板参数进一步进行条件限制设计的特化版本。《泛型思维》 全特化就是全部特化&#xff0c;即针对所有的模板参数进行特化。《c primer》偏特化就是部分特化&#xff0c;即针对部分模板参数进行特化。《c primer》全特化和偏特化的定义不是很严格&…

PHP中单例模式:三私一公是什么?

PHP中单例模式&#xff1a;三私一公是什么&#xff1f; 三私一公 私有化静态属性 私有化构造方法 私有化克隆方法 公有化静态方法 ​​​​ 转载于:https://www.cnblogs.com/phpisfirst/p/9792545.html

php 缓存模块,PHP缓存之模块缓存(APC)_PHP教程

PHP缓存之模块缓存(APC)APC是Alternative PHP Cache的简称&#xff0c;是 PHP 的一个免费公开的优化代码缓存。它用来提供免费&#xff0c;公开并且强健的架构来缓存和优化 PHP 的中间代码。1、PHP配置APC开启APC模块&#xff0c;需要将 extensionphp_apc.dll 前面的注释去掉即…

pta 考试座位

L1-005 考试座位号 (15 分) 每个 PAT 考生在参加考试时都会被分配两个座位号&#xff0c;一个是试机座位&#xff0c;一个是考试座位。正常情况下&#xff0c;考生在入场时先得到试机座位号码&#xff0c;入座进入试机状态后&#xff0c;系统会显示该考生的考试座位号码&#…

JSDoc那些事

几天工作上需要文档化一些Javascript东西&#xff0c;所以在找一些JS文档化工具&#xff0c;以下分析几种工具。 1.JSDoc-toolkit 一开始还想用这个工具&#xff0c;但后来在解析生成文档时候&#xff0c;出现了很严重的错误&#xff0c;还存在其他问题。 问题1&#xff1a;闭包…

WindowType 属性

WindowType 属性 指定一个表单集或表单在显示或用DO FORM来运行时的行为.在设计和运行时可供使用. Object.WindowType[ nType] 返回值 nType对于表单集&#xff0c;WindowType 属性的设置如下&#xff1a; 设置说明 0 无模式。 1 模式。其它表单(非该表单集中的)不能变为活动…

Excel VBA附合导线平差自动计算表

这是6,7年前做的一个excel vba自动计算附合导线平差的表格。 对于做测绘的朋友来说&#xff0c;附合导线平差是最基础的技能&#xff0c;目前来说&#xff0c;能平差的软件和工具也很多&#xff0c;像南方的平差易&#xff0c;科傻平差、清华三维平差等&#xff0c;但这些软件操…

结构体解决念数字问题

L1-007 念数字 (10 分) 输入一个整数&#xff0c;输出每个数字对应的拼音。当整数为负数时&#xff0c;先输出fu字。十个数字对应的拼音如下&#xff1a; 0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu输入格式&#xff1a; 输入在一行中给出一个整数&…

Eclipse NDK 配置,无需安装Cygwin

Eclipse NDK 配置&#xff0c;无需安装Cygwin Eclipse NDK 配置&#xff0c;不用安装Cygwin 文章转自http://www.cnblogs.com/chenjiajin/archive/2012/04/12/2444188.html一、关于NDK: NDK全称&#xff1a;Native Development Kit。 1、NDK是一系列工具的集合。 NDK提供了一系…

php裁剪图片白边,php生成缩略图填充白边(等比缩略图方案)

网站上传图片后生成缩略图应该是非常常用的功能了&#xff0c;通常来讲为了网站显示美观&#xff0c;缩略图会是同样尺寸&#xff0c;比如最近笔者做的一个站点&#xff0c;缩略图规格要求都是160120。但是如果上传的图片比例和缩略图不一致&#xff0c;直接缩放的话就会导致图…

PHP 平分数组

1 <?php2 /**3 *一个整数数组&#xff0c;长度为n&#xff0c;将其分为m 份&#xff0c;使各份的和相等&#xff0c;求m 的最大值4 *比如{3&#xff0c;2&#xff0c;4&#xff0c;3&#xff0c;6} 可以分成{3&#xff0c;2&#xff0c;4&#xff0c;3&#xf…

Shoot the Bullet(ZOJ3229)(有源汇上下界最大流)

描述 ensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utopia where humans and other beings such as fairies, youkai(phantoms), and gods live peacefully together. Shameimaru Aya is a crow tengu with the ability to …

深入理解jQuery插件开发【转】

如果你看到这篇文章&#xff0c;我确信你毫无疑问会认为jQuery是一个使用简便的库。jQuery可能使用起来很简单&#xff0c;但是它仍然有一些奇怪的地方&#xff0c;对它基本功能和概念不熟悉的人可能会难以掌握。但是不用担心&#xff0c;我下面已经把代码划分成小部分&#xf…

L1-008 求整数段和 (C++)

给定两个整数A和B&#xff0c;输出从A到B的所有整数以及这些数的和。 输入格式&#xff1a; 输入在一行中给出2个整数A和B&#xff0c;其中−100≤A≤B≤100&#xff0c;其间以空格分隔。 输出格式&#xff1a; 首先顺序输出从A到B的所有整数&#xff0c;每5个数字占一行&a…

matlab 迭代 混沌与分形实验报告,实验四 函数的迭代混沌与分形.doc

实验四 函数的迭代混沌与分形.doc 实验四函数的迭代、混沌与分形实验目的1认识函数的迭代&#xff1b;2了解混沌和分形迭代在数值计算中占有很重要的地位,了解和掌握它是很有必要的本实验将讨论用NEWTON迭代求方程根的问题,以及迭代本身一些有趣的现象1基本理论11迭代的概念给定…

小霸王双核/四核手机最新参数曝光

2019独角兽企业重金招聘Python工程师标准>>> 此前爆料出小霸王出手机&#xff0c;今天又有新消息啦。 现在又有消息人士给出了小霸王手机最新的参数情况&#xff0c;其厚度为9.8mm&#xff0c;配备的是4.5寸夏普IPS材质触摸屏&#xff0c;分辨率为960x540像素&#…