样式配置
主要介绍如何在项目中使用和规划样式文件。
前言
默认使用 sass 作为预处理语言,建议在使用前或者遇到疑问时学习一下 sass 的相关特性。
项目中使用的通用样式,都存放于 src/styles
下面。
src/styles/index.scss
文件已在main.ts中全局引入。
ts
// main.ts
import '@/styles/index.scss'; // hive-plus主题
全局注入
src/styles/index.scss 文件会被全局注入到所有文件,所以在页面内可以直接使用变量而不需要手动引入。
vue
<style lang="scss" scoped>
// 这里已经隐式注入了 variables.scss
.foo {
color: var($--color-blue);
}
</style>
为什么使用sass
习惯sass作为样式语言,如果习惯使用less或者其他的,自行切换一下,不难。
开启scoped
没有加 scoped
属性,默认会编译成全局样式,可能会造成全局污染
温馨提示
使用 scoped 后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件的 scoped CSS 和子组件的 scoped CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。
深度选择器
有时我们可能想明确地制定一个针对子组件的规则。
如果你希望 scoped
样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>>
操作符。有些像 Sass 之类的预处理器无法正确解析 >>>
。这种情况下你可以使用 /deep/
或 :deep()
操作符取而代之——两者都是 >>>
的别名,同样可以正常工作。
使用 scoped 后,父组件的样式将不会渗透到子组件中,所以可以使用以下方式解决:
vue
<style lang="scss" scoped>
/* shorthand */
:deep(.foo) {
}
</style>
CSS Modules
针对样式覆盖问题,还有一种方案是使用 CSS Modules 模块化方案。使用方式如下。
vue
<template>
<span :class="$style.span1">hello</span>
</template>
<script>
import { useCSSModule } from 'vue';
export default {
setup(props, context) {
const $style = useCSSModule();
const moduleAStyle = useCSSModule('moduleA');
return {
$style,
moduleAStyle,
};
},
};
</script>
<style lang="scss" module>
.span1 {
color: green;
font-size: 30px;
}
</style>
<style lang="scss" module="moduleA">
.span1 {
color: green;
font-size: 30px;
}
</style>
自定义主题
温馨提示
模板使用的是自己开发的符合自己公司内部要求的 hive-plus UI组件库,不建议自定义主题。
请参考 Hive Plus 自定义主题文档,自行处理。