Vue动态样式方法总结

Posted SuperYiY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue动态样式方法总结相关的知识,希望对你有一定的参考价值。

Vue动态样式实现方式

前言

本文主要针对 Vue2.x 来展开vue的动态css样式方法归纳。
如果亲爱的读者们需要,后续会更新Vue3的动态样式方法或者使用TypeScript来实现。
CSS动态样式 一般用于设置某个字段根据状态显示不同的样式。
比如 字段A,平时返回0,正常显示字段黑色;返回1时,显示异常,文字颜色为红色

Vue动态样式实现方式

  • :style 动态设置style行内样式,优先级最高
  • :class 动态设置class类名
  • method: 调用方法return返回
  • v-if/v-else + 复合类名

:style

// 1、三元表达式  对象形式
<div class="name" :style="color:state == true ? 'red' : 'black'">麻辣香锅</div>
<div class="name" :style="state == true ? 'color:red' : 'color:black'">麻辣牛锅</div>
// 2、直接对象形式  
<div class="name" :style="fontSize:`$sizepx`">麻辣火锅</div>
// 3、数组形式
<div class="name" :style="[styleObj1,styleObj2]">麻辣香锅</div>
// 4、复合型
<div class="name" :style="[color:state ? 'red' : 'black',styleObj2]">麻辣香锅</div>
// 4、调用方法形式
<div class="name" :style="setStyle()">麻辣鸡煲</div>
export default 
	data()
    	return
            state:1,
            size:14,
            Obj1:
                color:red
            ,
            Obj2:
                fontSize:12px
            
        
	,
    method:
        setStyle()
            let obj = 
                color:'red',
                fontSize:'14px'
            
            return obj
        
    

<style>
  .name
    color:yellow;
    font-size:12px;
  
</style>

注意:

  • html上调用的所有东西,最好是该vue实例的data、method、watch、computed等本身的变量和函数,一般不要直接调用外部的函数,比如是工具类untils的方法,有需要可以在data中新建变量绑定在HTML上,在data方法或其他方式去调用。
  • js的样式属性名注意用驼峰命名法,比如font-size —— fontSize

:class

// 1、三元表达式,对象/数组形式,单个条件
<div class="name" :class="'success-text':state == true">广式煲仔饭</div>
<div :class="['name', state == true ? 'success' : '']">广式煲仔饭</div>
// 相当于
<div class="name" :class="state == true ? 'success-text : ''">广式煲仔饭</div>

// 2、对象形式,多个条件
<div class="name" :class="'success-text':state == true,'success-text2':state2 == true">广式煲仔饭</div>

// 3、data形式或者computed形式   (缺点就是类名一定只能是一个单词)
<div class="name" :class="classObject">广式煲仔饭</div>
<div class="name" :class="classObject_cp">广式煲仔饭</div>

// 4、mothod方法
<div class="name" :class="setClass()">广式煲仔饭</div>
<button @click="state = state ? false : true">改变state状态</button>

export default 
  data () 
    return 
      state:true,
      state2:true,
      styleObj1:
        color:'red'
      ,
      styleObj2:
        fontSize:'14px'
      ,
      classObject:
        success_text:true,  // 因为变量名不能用-来隔开,所以只能匹配到_或只有一个单词的类名
        success_text2:true
      
    
  ,
  computed:
    classObject_cp:function()
      return
        success:this.state,
        success2:this.state2
      
    
  ,
  methods: 
    setClass()
      return 
        success_text:this.state,
        success_text2:this.state2
      
    ,
    changeState()
      this.state = this.state ? false : true
    
  

<style>
  .name
    color:yellow;
    font-size:12px;
  
  .error-text
    color:red;
  
  .success-text
    color:greenyellow;
  
  .success-text2
    font-size:16px;
    font-weight: 600;
  
  .success
    color:greenyellow;
  
  .success2
    font-size:16px;
    font-weight: 600;
  
</style>
  • :class 目标就是通过判断找到对应的css类名

  • 方法3或4,注意类名只能是单个单词或_连接等,此外的,都不行,因为js变量名是以单个单词组成的。

    比如这里success-text,变量无法表达出来,就算了驼峰命名也不行,因为successText是类名,不像:style行内式,是作为css属性名。

  • :style优先级高,无需考虑本标签元素class的属性,因为一定会被style相同的属性所覆盖;

v-if/v-else + 复合类名

        <div class="father">
          <div class="child success-text">child</div>
          <div class="child">
            <div v-if="state == true" class="success-text">child</div>
            <div v-else-if="state == false" class="error-text">child</div>
            <div v-else>--</div>  
          </div>
          <div class="child">child</div>
        </div>

    <style>
        .father
            color:black
        
        .child
            fotn-size:16px
        
        .success-text:
            color:green
        
        .error-text
            color:red
        
    </style>

结尾

纸上得来终觉浅,
绝知此事要躬行。

Vue 动态样式绑定

1. 简介

本小节我们将介绍 Vue 中如何动态绑定样式。包括 Class 的绑定、内联样式 Style 的绑定。掌握样式绑定的多种形式是其中的重点难点。同学们可以在学完本小节之后对样式的绑定方式加以总结,再通过反复的练习来加深印象。

2. 解释

操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style 时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。 ---- 官方定义

通过 v-bind 指令给 DOM 元素动态绑定 Class 和 Style,一般用于根据不同数据状态切换元素样式的场景下。

2.绑定元素的 Class

我们可以通过数组和对象的两种形式绑定元素的 Class。

2.1 对象

2.1.1 对象语法

通过传给 v-bind:class 一个对象,以动态地切换 class:

<div v-bind:class=" show: isShow "></div>

代码解释:
上面的语法表示 show 这个 class 存在与否将取决于数据属性 isShow 是否为真值。

具体示例:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<style>.hide 
    display: none;
  </style>
<body>
  <div id="app"> 
    <div v-bind:class="hide: isHide">Hello !</div>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>var vm = new Vue(
	el: '#app',
  data: 
  	isHide: true
  ,
)
//vm.isHide = true</script>
</html>

代码解释:
HTML 代码第 2 行,我们给 div 绑定来样式,当 isHide 为真值时, 其渲染结果为 <div class="hide"></div>,否则 <div></div>
打开控制台,修改 vm.isHide 的值可以动态改变页面效果。

2.1.2 与普通的 class 属性共存

此外,v-bind:class 指令也可以与普通的 class 属性共存。
语法:<div class ="defaultClass" v-bind:class=" classA: isA,classB:isB ">

当有如下模板:

<div
  class="defaultClass"
  v-bind:class=" show: isShow, 'text-danger': hasError "
></div>

和如下 data:

data: 
  isShow: true,
  hasError: false

结果渲染为:

<div class="defaultClass active"></div>

代码解释:
当 isShow 或者 hasError 变化时,class 列表将相应地更新。
例如,如果 hasError 的值为 trueisShow 的值为 true,class 列表将变为 "defaultClass show text-danger"
例如,如果 hasError 的值为 trueisShow 的值为 false,class 列表将变为 "defaultClass text-danger"

在之前介绍的案例中,我们将绑定的数据对象内联定义在模板里, 这样显得比较繁琐。其实,我们可以统一定义在一个c lassObject 中:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"> 
    <div class="defaultClass" v-bind:class="classObject">Hello !</div>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>var vm = new Vue(
	el: '#app',
  data: 
  	classObject: 
      show: true,
      'text-danger': false
    
  ,
)</script>
</html>

结果渲染为:

<div class="defaultClass show"></div>

代码解释:
HTML 代码中,我们首先给 div 一个固定样式 defaultClass, 然后通过 classObject 给 div 绑定样式。
JS 代码 第 6-9 行,我们定义了数据 classObject,它有两个属性:1. 属性 show,值为 true,2. 属性 text-danger,值为 false。所以,最后页面渲染的效果是:<div class="defaultClass show"></div>

2.1.3 利用计算属性绑定样式

<div v-bind:class="classObject"></div>

我们也可以在这里绑定一个返回对象的 计算属性 。这是一个常用且强大的模式:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"> 
    <div v-bind:class="classObject"></div>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>var vm = new Vue(
	el: '#app',
  computed: 
    classObject: function () 
      return 
        show: true,
        'text-danger': false
      
    
  
)</script>
</html>

结果渲染为:

<div class="defaultClass show"></div>

代码解释:
HTML 代码中,我们通过 classObject 给 div 绑定样式。
JS 代码 第 6-11 行,我们定义了计算属性 classObject,它返回一个对象,该对象有两个属性:1. 属性 show,值为 true,2. 属性 text-danger,值为 false。所以,最后页面渲染的效果是:<div class="show"></div>

2.2 数组语法

我们可以把一个数组传给 v-bind:class,以应用一个 class 列表:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"> 
    <div v-bind:class="[classA, classB]">Hello !</div>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>var vm = new Vue(
	el: '#app',
  data: 
  	classA: 'classA',
    classB: 'classB1 classB2'
  ,
)</script>
</html>

渲染为:

<div class="classA classB1 classB2"></div>

代码解释:
在 HTML 代码中,我们通过数组给 div 绑定样式,数组中有 classA 和 classB 两个值。
在 JS 代码第 6-7 行定义了 classA 和 classB 两个字符串,它的格式和元素 class 的格式相同,不同的样式类之间以空格相隔。

如果你也想根据条件切换列表中的 class,可以用三元表达式:

<div v-bind:class="[isShow ? showClass : '', classB]"></div>

这样写将始终添加 classB 的样式,但是只有在 isShow 为真时才添加 showClass

不过,当有多个条件 class 时这样写有些繁琐。所以在数组语法中也可以使用对象的形式来表达数组中的某一项:

<div v-bind:class="[ showClass: isShow , classB]"></div>

代码解释:
在 HTML 中,div 绑定一个样式数组,数组第一项是一个对象表达式 showClass: isShow 。当 isShow 为 true 时样式最终绑定为:<div v-bind:class="[showClass, classB]"></div>;当 isShow 为 false 时样式最终绑定为:<div v-bind:class="[classB]"></div>

3.绑定内联样式

和 Class 的绑定一样,Style 的绑定同样可以通过数组和对象的两种形式。

3.1 对象语法

v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"> 
    <div v-bind:style=" backgroundColor: backgroundColor, width: width + 'px' "></div>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>var vm = new Vue(
	el: '#app',
  data: 
    backgroundColor: 'red',
    width: 300
  
)</script>
</html>

渲染为:

<div style =" background-color:red;width: 300px"></div>

代码解释:
在 HTML 代码中,我们给 div 绑定 background-color 和 width 两个内联样式,它们的值在 data 中定义。

在模板中写较为复杂的表达式语法显得比较繁琐,通常直接绑定到一个样式对象更好,这会让模板显得更加清晰:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"> 
    <div v-bind:style="styleObject"></div>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>var vm = new Vue(
	el: '#app',
  data: 
  	styleObject: 
      "background-color": 'red',
      width: '300px'
    
  ,
)</script>
</html>

渲染为:

<div style ="background-color:red;width: 300px"></div>

代码解释:
在 HTML 代码中,我们给 div 绑定数据 styleObject,它们的值在 data 中定义。

3.2 数组语法

v-bind:style 的数组语法可以将多个样式对象应用到同一个元素上:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="app"> 
    <div v-bind:style="[stylesA, stylesB]"></div>
  </div>
</body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>var vm = new Vue(
	el: '#app',
  data: 
    stylesA: 
      "background-color": 'red',
      width: '300px'
    ,
    stylesB: 
      color: '#fff',
      height: '300px'
    
  
)</script>
</html>

渲染为:

<div style ="background-color:red;width: 300px;color:#fff;height:300px"></div>

4. 小节

本小节我们学习了如何通过v-bind来动态绑定样式。主要有以下知识点:

  • 通过 v-bind:class 动态绑定元素的 Class;
  • v-bind:style 动态绑定元素的内联样式;
  • 如果通过数组和对象的形式给 v-bind:class 和 v-bind:style 赋值。

以上是关于Vue动态样式方法总结的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vuex 商店的 Vue.js 组件中设置动态样式

45.VUE学习之--组件之父组件使用scope定义子组件模板样式结构实例讲解

10.Vue.js 样式绑定

vue.js存储--localStorage

Vue.js 样式绑定

Vue.js:如何使动态创建的 HTML 使用作用域 CSS?