不同预处理器less、scss等下如何写样式穿透

不同预处理器less、scss等下如何写样式穿透,第1张

在Vue项目中,当我们引入第三方组件库时(如使用element-ui),需要在局部组件中修改第三方组件库样式,而又不想去除scoped属性造成组件之间的样式覆盖。这时候我们就需要样式穿透来实现我们想要的效果。

" 在vue组件中,在style标签上添加scoped属性,以表示它的样式作用于当下的模块,很好的实现了样式私有化的目的,这是一个非常好的机制。"

在scoped的情况下实现样式穿透:

饿了么的Element组件库,我打算的是一个一个的尽量分析吧,因为只是分析,架构上可能会不太一样。官方的架构方法可以看 这篇文章 。

首先,我 不会使用lerna ,来管理多个独立的项目。只会类似于平时开发常用组件一样,把一个组件放在一个文件夹里面,这个组件需要的 scss, images 啊什么的,都放在一起。

其次,应该 不会使用postcss-salad,我会翻译成相同功能的scss 吧。分析的主要目的还是学习,所以怎么方便怎么来,只是看它实现的思路,不用太过于在意细节。

Button组件的分析,可以了解一些新的东西
1 对于SCSS中mixin的使用,以及工具方法mix()
2 对于loading字体图标的动画,animation, 无限次上下翻转
3 line-height设置没有单位的数值,会怎样计算行高
4 对slot的使用,怎么利用$slotsdefault等
5 pointer-events的作用
6 接口的设计思想,为什么字体图标和loading要分开写

首先声明一些常用的css属性值,归纳下有以下几类:
colors:
设定常见的颜色

border:

剩下的就是不同类型的按钮的color, fill, border颜色值了。

这两个值会在hover, focus等状态时,设置颜色使用。

首先看下Button组件的模板template

通用的css样式

好了,下面就来进入正题,Button组件的几个设计要点

1 button的尺寸大小

和Bootstrap一样,实现方法其实都是不同的尺寸大小,有不同的类名,设定不同的尺寸。对于Bootstrap,你可能需要显示的把类名写完整,而对于Vue组件,给props传入值就好了,会动态的生成不同的类名,相比更简单点。

我们仔细看button的公共样式,并没有设置宽高,对于大小有关的,就是line-height了,至于为什么是设置为 1,可以看 这篇

一句话总结就是,当line-height设没有单位的值的时候,就根据button的font-size,来计算高度,font-size有多大,button的行高就有多高。

接下来, button就给不同的大小,设定不同的上下左右padding 。这里就有一个需要注意的了,我们需要重复写很多相同的css吗,每个尺寸的类名下面都重新写一次padding, font-size, 当然不是!!!既然都用SCSS了,为什么不用 mixin 呢???

所以,写一个font-size的mixin:

但是,后面我就犯傻了,还是scss用的不熟练的原因,我想,既然large, small, mini都是差不多的,只是改变一点不同的地方,为什么不用循环呢???但是尝试了过后发现,好像并不可以,在循环的时候,通过循环的变量,动态改变css选择器可以,动态改变属性值也是可以的,但是对于已经定义好的变量,不能这样拼接。。。

2 button类型(颜色倾向)

同样,还是写一个mixin, 不过这里面有一个就是,在设置hover, focus状态的样式时,通过mix()函数来混合颜色,这个以前倒是没有用过。

3 图标按钮和loading状态

这里面涉及了一个设计的问题,开始的时候我在考虑,为什么要加一个loading的prop呢?直接通过设置icon为loading也可以啊。

但是,想一下,在实际的应用中的使用场景,常常时点击后,ajax请求数据,完成后结束loading状态,所以,试想,到底是在这期间改变icon的值好呢,还是直接通过一个computed属性,动态设置loading的boolean值好呢??对吧,虽然只是很小的细节,但对于后面的使用来说,易用性完全不一样呐

还有一点,对于loading按钮,设置了css3属性,pointer-events: none,相当于直接去除了onclick点击效果。

4内容分发slot

注意模板中的内容分发这句,其实 写的非常的漂亮!!!
想一想,我们要实现一个按钮组件,是不是需要一个slot来放外部环境传入的按钮文字。

接着,我们要实现图标按钮,图标和按钮文字之间肯定要隔一段距离啊,但是slot,css选择器没办法查找到啊,没办法,加个span标签包裹slot吧

看着好像差不多了,但是,如果图标按钮只有图标没有文字呢???图标按钮i后面接着的span标签还是会产生5px距离啊,button莫名就给撑开了。

所以啊,v-if 判断的用处就来了,通过判断$slotsdefault来判断有没有传入按钮文字,有,才添加span节点。。。。

6啊,对内容分发的理解又加深了很多啊!!!!

5按钮组
其实,按钮组已经是一个新的组件了,相当于是组件之间的嵌套。

对于button-group组件中的button子组件,左浮动,清除圆角,再首尾按钮添加圆角。

对于button边框的间隔,首节点设置右边框,尾节点设置左边框,中间的margin-right: -1px, 就实现了按钮组中按钮间的1px白色边框间隔了。

通常情况下,很多后台管理界面需要有好几套颜色的主题,我们的Vue项目已经集成了ElementUI,本来也支持主题定制,ElementUI使用了Sass开发样式,因此自定义样式也是很方便的。

参考: >

安装COMPASS。方法:gem install compass

Compass有五个模块reset、 css3、 layout、 typography、 utilities,要导入指定模块的话,在scss文件中使用如下语法:

@import "compass/reset";

原因:因为使用了less或scss的原因
解决方法:使用::v-/deep/ 来替换/deep/ 或者不使用less或scss
但是会不能使用scss嵌套写法的问题,不然样式嵌套的子元素样式不会生效

Element Plus 默认提供一套主题,CSS 命名采用 BEM 的风格,方便使用者覆盖样式。 但是如果需要大规模替换样式,例如: 将主题颜色从蓝色改为橙色或绿色,也许一个个将其覆盖起来不是一个好主意。
如果您的项目也使用了 SCSS,可以直接修改 Element Plus 的样式变量。 新建一个样式文件,例如 styles/element/indexscss:
您应该使用 @use ‘xxxscss’ as ; 代替 @import ‘xxxscss’;。

使用npm安装less

安装less-loader

注意使用高版本run serve会有问题 这里使用的7x版本

安装 style-resources-loader 和 vue-cli-plugin-style-resources-loader

在vueconfigjs文件中配置

注意目录配置方式 /src/assets/css/baseless 修改你全局less文件所在的位置 目录不可使用简写方式 例如 @/assets 方式

使用方式

注:不需要在任何地方导入less文件就可以使用了

使用npm安装less和less-loader

注意:此处也可以合并指令

在 viteconfigts 文件中配置

使用npm安装less和less-loader

注意:此处也可以合并指令,也可以简写

在 viteconfigts 文件中配置

样式的使用方式是跟之前的一样,文中也有提到,可以翻看记录。

点赞加关注,永远不迷路


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13392082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存