皮肤开发过程中遇到的3个问题

昨晚在公司没回去,心血来潮想做完皮肤的需求,发现晚上效率真的是挺高的。

皮肤就是一部分样式和资源。我的思路是先在原来的组件里修改对应的样式,然后把这部分样式抽出来,单独管理,同时抽取一些可以配置的变量。

经过一晚上的折腾,现在除了皮肤样式的单独打包外,都做完了。做的过程中主要遇到了3个问题:

1. vue的scoped私有模块里无法覆盖全局样式

vue自带了scoped的模块化方案,会自动在元素上添加一个随机的唯一id,然后在选择器上加上这个id,使得该样式不会影响其他模块,

这样是避免了样式影响别的地方,css modules也是类似的思路,不过css modules是改的class名字,

在改登录页的时候发现那个elementui的dropdown样式怎么也改不了,通过查看dom发现他是全局的,在body下,并不在组件里,而组件的样式被私有化了,没法覆盖全局。

于是,我在vue单文件组件里加了两个style标签,一个加scoped,一个不加scoped,这样可以在一个less里写私有样式,一个less里写一些可以覆盖全局样式的样式。

<style lang='less' src='./global-login.less'></style>
<style lang='less' src='./login.less' scoped></style>

这样就解决了scoped里面无法覆盖全局样式的问题。

其实这也是scoped方案不完善的地方,css modules里是可以在私有模块里通过 :global(.className)来声明全局样式的,而scoped没有处理这一点。

2. 图片的显示使用背景图还是图片标签

写样式遇到图片的时候,大多数情况下背景图片和图片标签都能解决问题,但两种方式并不都是合适的。

我觉得如果不需要用js去操作,或者本身只是辅助性的装饰或说明的图片,从意义上就是样式的一部分,应该用背景图片来做。只有当图片需要使用js去操作或者有一定的业务含义的时候才有必要用图片标签。

此外,这里要做的皮肤的切换,只是样式的切换,如果使用图片标签来显示的话,那么也就没法只通过样式来切换皮肤了。

之前的实现都是通过img标签来做的,无论从代码功能用作装饰还是有业务含义的角度或从皮肤开发只应该修改的角度都得把这里的标签改成背景图的方式。

我把img标签替换成了div标签,然后通过不同的class来区分图标。前后的装饰图片使用伪元素 + 背景图来做的。

把这些无意义的img标签抽出来之后,html代码清爽了很多,而且抽出来的icon样式复用性也很强。

.icon-suijidianming {
  background-image: url('@{iconsDirPath}/suijidianming.png');
}
.icon-dadishu {
  background-image: url('@{iconsDirPath}/dadishu.png');
}
.icon-fahongbao {
  background-image: url('@{iconsDirPath}/fahongbao.png');
}

3.皮肤资源的管理

皮肤相关的样式和资源抽取出来之后,接下来就是如何管理这些样式和资源了。

皮肤相关的样式资源应该独立出来,于是我在assets下单独建了一个文件夹来存放皮肤相关的东西。

icons存小图标,images放一些大图片,less下面是样式,以后还可能会有字体等资源。

因为皮肤主要涉及到登录页、考勤页、顶部菜单三部分,于是我把images和less分成了这三部分,样式因为有一些是全局的,所以多了一个global.less文件。

这些页面的样式,我只抽出了一些颜色变量,通用的东西并不是很多。

在common.less里面引入variable.less,然后3个页面皮肤的less文件都引入common.less

其中@imagesDirPath和@iconsDirPath是两个资源文件的根路径,所有的图片资源的路径基于这俩变量来写,路径变动的时候也很方便的调整。

还有一些通用的mixin,主要有两个,一个是四个角的背景图片,通过mixin的方式来简化了代码

第二是icon的样式,这里使用了less 的 数组 + 循环来批量生成

scss的语法比较接近类c语法,理解容易,less的语法看着稍微奇怪一些。而且less的function需要使用mixin来模拟。感觉没有scss强大和易用。还有less的mixin并不能通过@import导入,只能每个文件都写一遍,而sass可以。

总结

皮肤开发的过程中主要遇到了 scoped样式模块化方案的坑图片的存在形态less的一些坑这3个问题。

scoped样式模块化方案的坑:样式无法覆盖的问题,是因为scoped方案没有提供类似css modules在模块样式里面写全局样式的语法,只能通过分开写来解决。

图片的存在形态:装饰用的图片应该作为背景图片而存在,使用img标签除了会使得dom结构不清晰外,也不容易修改显示的内容。

less的一些坑:样式整体使用less来管理,mixin和变量还有import和逻辑控制的语法,遇到一些不方便的地方比如mixin不支持导入、没有函数的功能,只能用mixin模拟、逻辑控制语法有些怪异等。感觉不如sass强大易用。

其他

皮肤的开发、抽取、单独管理都做完了,下一步就是单独打包了。 看了下时间,快6点了。晚上写代码效率会比较高呢,算了下从开始做到现在,大概花了12小时,也就是不到2个工作日,还算正常。

后续优化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容