分享更有价值
被信任是一种快乐

如何进行CSS预处理语言的模块化

文章页正文上

这篇文章给大家介绍如何进行CSS预处理语言的模块化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。编写css是前端工作中,一项普通而又频繁的劳动,由于css并不是一门语言,所以在程序设计上显得有些简陋。对于小型项目来说,css的量还不至于庞大,问题没有凸显,而如果要开发和持续维护一个较为大型的项目,那就需要对css进行管理和规范了,否则会发生不可挽回的后果。背景冗余。虽然我们通过定义公共模块和私有模块,来委婉地分担common的体积,但common的体积还是太大了,而且从设计上考虑,我们应该尽量多地提炼公共模块,以便更好地实现复用。最理想的情况是,所有的模块都寄存在一个公共的库里,哪里需要用到就从库中直接调过来。这个美好的愿望不是不可实现的,借助预处理语言,我们可以很轻易地完成这事情。预处理语言是一种类css的语言,我们知道css本身不是语言,而预处理语言的诞生,就是为填补这一部分语言功能。它实现了变量、函数、混合的定义,以及文件的引用、合并、压缩功能,使得css也能面向对象,应付复杂庞大的业务。目前流行的预处理语言主要有两种:less和sass。作为学习,两者都可以入门一下,而作为工作,尽量熟悉一种。我比较常用sass,所以以下内容都是以sass为基本语言做介绍,两者在特性上有很多相似的地方,所以大家不必担心实现上有什么千差万别。sass基本语法可以到官网(英语)或者w3cplus sass guide(中文)查看学习,我们这里只简单地过一遍,讲一些我们需要用到的内容,不会面面俱到。sass有两种后缀名文件:一种后缀名为sass,不使用大括号和分号;另一种就是我们这里使用的scss文件,这种和我们平时写的css文件格式差不多,使用大括号和分号。而本教程中所说的所有sass文件都指后缀名为scss的文件。在此也建议使用后缀名为scss的文件,以避免sass后缀名的严格格式要求报错。 ——摘自w3cplus sass guide1、嵌套(非常重要的特性)sass的嵌套包括两种:一种是选择器的嵌套;另一种是属性的嵌套。我们一般说起或用到的都是选择器的嵌套。 ——摘自w3cplus sass guide选择器嵌套 所谓选择器嵌套指的是在一个选择器中嵌套另一个选择器来实现继承,从而增强了sass文件的结构性和可读性。在选择器嵌套中,可以使用&表示父元素选择器。 ——摘自w3cplus sass guide编译后:是不是爽歪歪?再也不用一遍一遍地去复制和修改一大堆的选择器,也不需要去整理它们之间的关系,只需要嵌套一下,所有的关系就如同直接看dom一样简单明了了!解放双手,解放双眼,同时还提高效率。值得留意的是,我们书写sass的时候,应该尽量保持sass的嵌套顺序与dom一致,注意,是嵌套顺序一致,而不是层次一致,因为并不是dom里的所有元素都需要写样式。我们再来提一个场景,说明sass的嵌套写法利于维护,假设g-bd下原本有个模块m-article_box,现在我们要把m-article_boxg-bd迁移到g-hd中(当然这个需求有些不合理~),我们来看原始代码:按照css的方式,我们就要把所有跟m-article_box有关的部分,从g-bd全部复制到g-hd里去。这还是在模块的书写符合规范的情况下,如果这个模块书写不符合规范,没有把全部结构都挂在m-article_box类下,那真的就是灾难了~而现在使用sass的话,我们只需要把m-article_box的区块整个从g-bd剪切到g-hd就完事了(这里为了突出修改的工作量大,我特地把整个模块结构都写全了——才不是为了凑字数。。。):非常方便,而且不容易出错。2、变量(variable)咱们直接上代码:编译结果:写过代码的人都熟悉参数的用法吧,太简单太直白了不想说太多,自己意会吧。3、函数(function)太简单了直白了不想说太多,自己意会吧。4、混合(mixin)混合,顾名思义,就是混合的意思。。。也就是我们可以事先定义一段代码块,在需要使用到的地方,直接引用(include),而在引用之前,这段代码都不会出现在编译文件中,也就是不会生成任何内容。这也是非常重要的一个特性!我们知道common的体积非常大,而体积大的根本原因是它存放了许许多多的模块。我们设想一下,如果将每一个模块都打包成mixin,那common不就减肥成功了?!多年的顽疾终于看到希望,没有比这更让人惊喜的了!我们这就上车:改造后5、import这个属性很眼熟?没错,事实上,css本身就有这个属性实现,我们可以在css文件中直接使用import来引入其他文件。那么css的import和sass的import有什么区别?从含义和用法上来说,没有区别,区别在于工作原理。css的import是阻塞的,而sass的import在编译后,其实是合并文件,***只产出一个css文件,而css则没有合并,该多少个文件就还是多少个文件。注意:只有import一个.sass/.scss文件的时候,才可以省去后缀名,如果是直接import一个.css文件,要补全文件名;import之后的分号;不要漏写,会报错;sass如果import的是一个.css文件的话,那它的作用就跟css原生的import作用一样,只有import一个sass文件的时候,才是合并文件。如下:
编译结果:css的import之所以没有被普遍使用是有原因的。我们可以大概猜到它的工作原理:a.css import b.css以后,当浏览器加载到页面中的a.css的时候,已经准备按照a.css的内容来渲染页面了,刚解析到***行,发现a.css居然还import了一个b.css,于是它不得不先放下a.css(既免费云主机、域名阻塞a.css),去加载b.css,直到b.css加载完,并且优先解析它,然后才开始回来解析a.css——鬼知道b.css会不会又import了c.css……这直接导致了渲染工作滞后,引发性能问题。说实话我还不如直接用两个link标签去同步加载a.css和b.css,效率会高一些。所以css的import基本是被抛弃了的属性。sass的import主要的好处就是把文件合并了,减少了请求。原本需要link好几个css文件的页面,现在只需要一个。模块化终于要开始干点正事了,首先我们来回顾一下,上一节我们以规范为基础构建的模块化项目,遗留了一些什么问题。冗余 体积庞大的common;使用cm-模块区别m-模块,使得后期开发过程中,m-模块向cm-模块转变过程比较繁琐;……好像,问题也不是特别多,我们一个一个解决。为了方便,在这里我们把每个页面所对应的scss文件叫做 页面scss;把变量、函数、混合等(没有被引用或者执行的情况下)编译后不产生实际内容的代码叫做 定义类代码 ,那么相对应的其他内容就是 实际内容代码1、mixin.scss我们知道,一方面,在common中过多地添加模块最终会导致common的体积过大,使得资源冗余,另一方面,为了方便维护,我们又希望尽量多地把模块公有化。这是一对矛盾,仅靠css本身是无法解决的,但sass可以!如果我们使用mixin来代替直接书写模块,由于mixin并不直接生成代码,而是通过主动引用,才能生成对应内容,那么理论上,common就可以***多地存放模块而不必占用一点空间!(注意,这里说的是理论上,实际应用中,文件太过庞大的话,免不了还是要受到命名冲突的限制的,不过这问题不大。)说干就干,我们把common中的模块全部打包成mixin:改造后调用方式如下:原本我们会在每个需要用到公共模块的页面中,先引用common,然后再引用页面css,而现在,我们只需要在页面scss中直接@import common;就可以了。使用common:改造后:很***,
——至少目前为止是这样。我们思考一个问题,common除了存放模块之外,还有没有其他内容?答案是肯定的,大家一定知道有个东西叫做css reset(或者normalize.css),这肯定是全局的;另外,如果是做后台管理系统的话,可能还会有Bootstrap。当然,还有一些自定义的全局的样式,比如常见的.clearfix,等等。这些东西目前我们也堆积在common当中,而且合情合理,因为它们都是全局的样式。但是对比起mixin来说,这些实际内容代码显得很少量,有种被淹没的感觉,使得整个common看上去就像只有mixin。但是这些实际内容代码的作用却又非常重要。为了使common的构成更加直观,我们把mixin全部都抽离出来,单独存放一个叫做mixin.scss的文件中,然后在common引用它,这样,mixin的管理更加的规范,而且common的结构也更加清晰了。抽离mixin还有另外一个重要原因,后面会讲到的,我们希望mixin作为一个纯粹定义类代码文件,随处可以引用而不会生成多余的代码。原本我们会在每个需要用到公共模块的页面中,先引用common,然后再引用页面css,而现在,我们只需要在页面scss中直接@import mixin;就可以了。使用mixin:2、common.scss好,抽离了mixin之后,我们现在来重新看回common,common里应该是些什么样的内容。上面的内容我们稍稍提到了一点,我们来展开一下。2.1、css reset(normalize)我们知道浏览器千差万别,各浏览器的默认样式也是不尽相同,最常见的比如body的默认内边距,p标签的默认内边距,以及ul/ol等等。这些不统一的默认样式经常让我们感到头疼,所以就有人提出一开始写样式就先把它们消除的想法,于是就催生了后来非常流行的reset.css。起初的reset.css很简单,大概是这样的:没错,就是把几乎所有会用到的标签都给去了内边距和外边距,简单粗暴,这样所有的标签就都统一了,而且在不同的浏览器下也是统一的。其他的部分每个人有各自的补充,比如有人会把h2~h7的所有字号给定义一遍,以保证在不同浏览器下他们有统一的大小;有人会给a标签设置统一的字体颜色和hover效果,诸如此类等等。很好,没毛病。我们把这些统称为css reset,然后再统一封装到一个叫做reset.css的文件中,然后每个页面都引用。这种方式一直以来都挺实用,而且大家也都这么用,没出过什么问题。只是后来有人提出,这种方式太过粗暴(居然还心疼浏览器了)。。。而且会降低页面渲染的性能,最重要的是,这使得我们原本设计出来的表达各种含义的标签儿们,变得毫无特点了。。。说的好有道理,如果你家里所有人名字不一样但是都长一个样,还有啥意思。于是,就出现了normalize.css,normalize的目的同样是为了统一各个浏览器下各不相同的默认样式,不过它并不是简单粗暴地全部抹平,而是根据规范,来人为地把那些不符合规范的默认样式“扶正”,从而达到统一各个浏览器默认样式,同时保留各个标签原有特点的目的。我们不能说reset与normalize这两种思想孰好孰坏,只能说各有各的特点和作用,它们的存在都是为了解决同样的问题。2.2、插件一般来说,一个ui插件都会至少包括一个css文件,像bootstrap、datepicker等等。假设我们项目中需要以bootstrap为基础框架,实现快速开发,那么这时候我们就需要在项目中全局引入bootstrap.min.css,当然,还有bootstrap.min.js。说到全局暴露,我们***时间想到的是common,没错,我们可以在common中引入。有人问,插件的.css文件怎么import?额,改一下扩展名为.scss就可以了,scss是兼容原生css语法的~所以最终,我们的common大概是这样子的:事实上,如果我们不需要使用到mixin.scss中的变量和mixin的话,我们可以不引用它。那么我们的页面scss应该是这样的:干净,整洁。3、mixin编写规范每添加一个新角色,我们就要及时给它设置规范,好让它按照我们的期望工作别添乱。我们接下来来归纳一下mixin的书写规范。场景一:项目里有mixin.scss、a.scss(假设这是某个功能文件)、index.scss三个文件,mixin中定义了一个变量$fontSize: 16px;,a中定义了一个变量$color: #ccc;,我们在index中同时引用这两个文件,那么我们在index中是可以直接使用$fontSize$color这两个变量的——我的意思是,尽管在index中我们并没有看到这两个变量的声明和定义,但它们就这么存在了。这是好事还是坏事呢?直觉告诉我,这可能有问题。没错,这是不是跟我们之前讨论过的 污染 很像?只不过我们之前是引用了common之后,index什么都还没写就已经被占用了很多模块名,而现在是因为引用了其他文件,而占用了index的很多变量名。另外,就维护的角度来看,这也是有问题的,如果我不事先告诉你,或者你不事先看过一遍mixin和a,你知道index中的$color是哪里来的吗?假设我们需要字体大小,你知道去哪个文件修改吗?另外,你怎么保证同时引用mixin与a的时候,他们之间有没有可能存在同名的变量?那谁覆盖谁呢?这些问题看起来很小,但是当你项目规模大的时候,这可能是无法挽回的灾难(吓唬谁呢???)。场景二:假设我们的项目有一个主题色,边框、tab背景、导航栏背景,以及字体颜色等等,都是这个主题色,为了方便使用,不想总是用取色器去取值,于是我们在mixin中定义了一个全局变量$color: #ff9900,然后就可以愉快地到处使用了!整个网站开发完了,一个月后,设计师突然过来跟你说:“老板说,这个主题色要改改,有点土,咱们换个大红。”,于是你一脸不情愿然而内心却窃喜地打开mixin,把$color的值改成了大红,然后得瑟地对设计师说:“幸好我早有准备,搞定了,你看看吧。”,保存,打开页面一看,设计师和你的脸都绿了,页面怎么这么丑,有些字原本是主题色,但背景是红色,而现在一改,整块都变成红的,内容都看不清了,有些边框原本就是红色的,但是字体是原本

相关推荐: 如何给HTML标签中的文本添加修饰线

本篇内容介绍了“如何给HTML标签中的文本添加修饰线”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   text-decoration属性介绍   text-d…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册