样式

介绍

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

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

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

以下common,tailwind文件已在 App.vue 中全局引入

  1. .
  2. ├── common # 公共类
  3. ├── tailwind # tailwind 类库
  4. └── var # 变量

::: tip 全局注入

var.less 这个文件会被全局注入到所有文件,所以在页面内可以直接使用变量而不需要手动引入

:::

  1. <style lang="less" scoped>
  2. // 这里已经隐式注入了 var.less
  3. </style>

tailwindcss(2.2.6+)

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

语法如下:

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

为什么使用 Less

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

开启 scoped

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

  1. <style></style>
  2. <style scoped></style>

::: tip 温馨提醒

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

:::

深度选择器

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

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

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

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

  1. <style scoped>
  2. /* deep selectors */
  3. ::v-deep(.foo) {
  4. }
  5. /* shorthand */
  6. :deep(.foo) {
  7. }
  8. /* targeting slot content */
  9. ::v-slotted(.foo) {
  10. }
  11. /* shorthand */
  12. :slotted(.foo) {
  13. }
  14. /* one-off global rule */
  15. ::v-global(.foo) {
  16. }
  17. /* shorthand */
  18. :global(.foo) {
  19. }
  20. </style>

CSS Modules

针对样式覆盖问题,还有一种方案是使用 CSS Modules 模块化方案。使用方式如下。

  1. <template>
  2. <span :class="$style.span1">hello</span>
  3. </template>
  4. <script>
  5. import { useCSSModule } from 'vue';
  6. export default {
  7. setup(props, context) {
  8. const $style = useCSSModule();
  9. const moduleAStyle = useCSSModule('moduleA');
  10. return {
  11. $style,
  12. moduleAStyle,
  13. };
  14. },
  15. };
  16. </script>
  17. <style lang="less" module>
  18. .span1 {
  19. color: green;
  20. font-size: 30px;
  21. }
  22. </style>
  23. <style lang="less" module="moduleA">
  24. .span1 {
  25. color: green;
  26. font-size: 30px;
  27. }
  28. </style>

重复引用问题

加上 reference 可以解决页面内重复引用导致实际生成的 style 样式表重复的问题。

这步已经全局引入了。所以可以不写,直接使用变量

  1. <style lang="less" scoped>
  2. /* 该行代码已全局引用。可以不用单独引入 */
  3. @import (reference) '../../styles/val.less';
  4. <style>