Skip to content
On this page

样式

介绍

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

默认使用 less 作为预处理语言,建议在使用前或者遇到疑问时学习一下 Less 的相关特性(如果想获取基础的 CSS 知识或查阅属性,请参考 MDN 文档)。

项目中使用的通用样式,都存放于 src/styles/ 下面。

入口样式已在 src/main.ts 中全局引入

bash
.
├── index.less    # 全局样式与变量
├── tailwind.css  # Tailwind CSS 指令与基础层
└── transition    # 路由切换动画
ts
// src/main.ts
import './styles/tailwind.css';
import './styles/index.less';

变量使用

项目没有开启 Less 全局注入(additionalData)。页面内需要使用 Less 变量时,请显式 @import 对应变量文件;src/styles/index.less 中的公共类可直接使用。

tailwindcss(3.4+)

项目中引用到了 tailwindcss,具体可以见文件使用说明。

语法如下:

html
<div class="flex mx-4 px-4"></div>

为什么使用 Less

习惯less作为样式语言,sass,有些情况下,会出现比如,安装等问题,不习惯的less的,自行切换一下,不难,就是很繁琐。

开启 scoped

没有加 scoped 属性,默认会编译成全局样式,可能会造成全局污染

vue
<style></style>

<style scoped></style>

温馨提醒

使用 scoped 后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件的 scoped CSS 和子组件的 scoped CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。

深度选择器

有时我们可能想明确地制定一个针对子组件的规则。

如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作符。有些像 Sass 之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 或 ::v-deep 操作符取而代之——两者都是 >>> 的别名,同样可以正常工作。

详情可以查看 RFC0023-scoped-styles-changes。

使用 scoped 后,父组件的样式将不会渗透到子组件中,所以可以使用以下方式解决:

vue
<style scoped>
  /* deep selectors */
  ::v-deep(.foo) {
  }
  /* shorthand */
  :deep(.foo) {
  }

  /* targeting slot content */
  ::v-slotted(.foo) {
  }
  /* shorthand */
  :slotted(.foo) {
  }

  /* one-off global rule */
  ::v-global(.foo) {
  }
  /* shorthand */
  :global(.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="less" module>
  .span1 {
    color: green;
    font-size: 30px;
  }
</style>

<style lang="less" module="moduleA">
  .span1 {
    color: green;
    font-size: 30px;
  }
</style>

重复引用问题

多个页面引入同一份 Less 变量文件时,会产生重复的样式表。使用 (reference) 只引用变量与 mixin,不重复输出样式:

vue
<style lang="less" scoped>
  @import (reference) '@/styles/variables.less'; // 以项目实际的变量文件为准
</style>