1、Vue中的CSS

在Vue项目中,经常有以下两种CSS写法:

  • vue文件template中的内联样式
  • vue文件下方的style标签中的内部样式 具体实现如下:
<template>
  <!--  下面div中的style样式就是内联样式  -->
  <div style="padding: 0 10px;">

    <!--  页面标题  -->
    <div class="title-css">
      这里面是页面标题的内容
    </div>

  </div>
</template>

<script>

</script>

<!--  下面style标签中的样式就是内部样式  -->
<style scoped>
/* 设置页面居中标题: 居中大字加粗上下间距 */
.title-css {
    font-size: 25px;
    font-weight: bold;
    text-align: center;
    margin-top: 15px;
    margin-bottom: 15px;
}

</style>

以上写法虽然比较方便快捷,但是也存在一些问题:

  • 内联样式的优先级问题:内联样式的优先级大于用选择器的样式,因此内联样式难以在后期进行替换覆盖,只能手动去修改相应的内联样式
  • 内联样式和内部样式比较难维护,不利于团队开发:页面中往往有很多样式是通用的,是具有共性的,当需求发生变更时,去修改内联样式和内部样式会比较困难

总之为了提升代码的可维护性,应当尽量不使用内联样式,少使用内部样式

2、Vue中如何封装public.css

为了提升代码的可维护性,我们经常需要实现public.css,在其中封装了一些公用的基本样式,各个页面都可以直接使用这些样式,这样可以避免重复性的开发工作,降低代码的耦合度。

Vue中往往把css文件写在/src/assets/css目录下,然后引入css的方式大致有以下几种:

  • 在入口js文件main.js中引入
  • 在index.html中引入
  • 在app.vue中引入

我的项目中是采取的在app.vue中引入,引入代码如下:

<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script>
// 导入公共样式
import './assets/css/public.css'

export default {
  name: 'App',
  components: {

  },
  mounted() {
    window.addEventListener('unload',this.saveState)
  },
  methods:{
    saveState(){
      sessionStorage.setItem('state',JSON.stringify(this.$store.state))
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  /*margin-top: 60px;*/
}
</style>

对app.vue的说明:app.vue是vue页面资源的首加载项,是主组件(页面入口文件),所有页面都是在App.vue下进行切换的,相当于React项目中的app.js

public.css代码如下:

/* 这里面封装了页面的全局样式 */
/* 页面中居中标题的公用样式: 居中大字加粗上下间距 */
.title-css {
  font-size: 25px;
  font-weight: bold;
  text-align: center;
  margin-top: 15px;
  margin-bottom: 15px;
}

/* 页面中靠左标题的公用样式: 靠左大字加粗 */
.left-title-css{
  font-size: 25px;
  font-weight: bold;
  text-align: left;
}

/* 模态框内部表单宽度为350px */
.modal-form-350 {
  width: 350px;
  margin: 0 auto;
}

/* 设置模态框内部输入框的宽度 */
.modal-form-350 .el-input{
  width: 220px;
}

3、Vue中使用less

什么是less

Less 是一种 CSS 的预处理语言,它在 CSS 的基础上增加了一些编程语言的特性,可以提升我们编写 CSS 的效率,减少很多重复性的代码,最终编译成纯净的 CSS 代码执行。Less 是 CSS 的超集,就像我们使用的 TS 和 JS 的关系,我们也可以把 Less 完全当作 CSS 来使用。

为什么要用less

CSS存在以下缺点:

  • 语法不够强大,比如无法嵌套书写,导致模块化开发中需要书写很多重复的选择器,导致可读性差
  • 没有合理的样式复用机制,也不能明确指定继承性,导致可维护性差

这就导致了我们在工作中无端增加了许多工作量。而使用CSS预处理器,提供 CSS 缺失的样式层复用机制、减少冗余代码,提高样式代码的可维护性。大大提高了我们的开发效率。less就是一种CSS预处理器,而且le***起来比较简单,因此我们在前端项目中使用less来提升CSS代码的可读性和可维护性

less的特性

less具备以下特性:

  • 变量(Variables):尽管less提供了变量,但是现在各大浏览器都支持CSS原生变量了,而且是动态的,有些时候使用原生变量会是一种更好的选择,如果需要考虑兼容性,可以使用 Less 的变量
  • 混合(Mixins):是将一组属性从一个规则集混入到另一个规则集的方法
  • 嵌套(Nesting):提供了嵌套代替层叠或者与层叠结合使用的能力
  • 导入(Importing):less可将另外一个Less文件导入进来,例如可以把变量样式都定义在一个单独的Less模块中,其他文件都来引用它,通常常用这种方式来控制主题样式,当需要修改主题的时候,只需要修改变量文件中的值,然后重新编译即可

后面以嵌套为例简单演示一下less在vue项目中的使用,其他特性不做进一步详述,有兴趣自行了解

le***与简单使用

  • 可通过 npm 来将 less 编译器安装为一个命令: npm i less -g
  • 然后我们可以通过 lessc 命令来编译 less 文件了: lessc test.less
  • 上面的命令会直接打印编译之后的结果,如果要输出到文件,可以加上输出文件名: lessc test.less test.css

Vue中使用less

使用 vue cli 创建的项目无需额外配置,只需下载合适版本的 less 以及 less-loader 即可使用 less: npm i -D less less-loader@6

成功导入less之后,把之前的public.css改为public.less,然后在里面写less代码即可,导入less的方法同导入css一样在app.vue中导入,只需把文件后缀名改为less即可:

<template>
  <div id="app">
    <router-view />
  </div>
</template>

<script>
// 导入公共样式
import './assets/css/public.less'

export default {
  name: 'App',
  components: {

  },
  mounted() {
    window.addEventListener('unload',this.saveState)
  },
  methods:{
    saveState(){
      sessionStorage.setItem('state',JSON.stringify(this.$store.state))
    }
  }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  /*margin-top: 60px;*/
}
</style>

public.less代码如下:

/* 这里面封装了页面的全局样式 */
/* 页面中居中标题的公用样式: 居中大字加粗上下间距 */
.title-css {
  font-size: 25px;
  font-weight: bold;
  text-align: center;
  margin-top: 15px;
  margin-bottom: 15px;
}

/* 页面中靠左标题的公用样式: 靠左大字加粗 */
.left-title-css{
  font-size: 25px;
  font-weight: bold;
  text-align: left;
}

/* 下面是less的嵌套写法, 相比css更加简单易懂 */
/* 模态框内部表单宽度为350px */
.modal-form-350 {
  width: 350px;
  margin: 0 auto;

  // 设置模态框内部输入框的宽度
  .el-input{
    width: 220px;
  }
}