Skip to content

样式配置

主要介绍如何在项目中使用和规划样式文件。

前言

默认使用 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 自定义主题文档,自行处理。

内容由donymh提供,如有疑问,请微信联系lmingh6