Vue 中样式的使用

Vue 中,通常使用 v-bind,绑定 class / style 属性来操作元素的 class 列表和内联样式。

因为它们都是属性,所以,可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。


不过,字符串拼接麻烦且易错。因此,在将 v-bind用于 classstyle时,Vue.js 做了专门的增强:

表达式结果的类型,除了字符串之外,还可以是 对象 或 数组


class 列表

# 字符串语法

# HTML
<div id="app">
    // 另,v-bind:class指令可以与普通的class属性共存。	
    <p class="news" :class="classVal">{{msg}}</p>
</div>

# JS
new Vue({
	el:'#app',
	data(){
		return{
			classVal:'colRed'  // 表达式的结果是一个字符串
		}
	}
})

# CSS
.colRed{
	color: red;
}

# 对象语法

  • 可以绑定一个对象,在对象中传入一个或多个属性,来动态切换 class
<template>
  <div id="app">
    <div :class="{active:isActive}"></div>
    <!-- :class 可以和普通的class属性共存 -->
    <div class="static" :class="{active:isActive,'text-danger':hasError}"></div>

    <!-- 渲染结果为:<div class="static active"></div> -->
    <!-- 说明:当 isActive 或者 hasError 变化时,class列表将相应地更新 -->
  </div>
</template>

<script>

export default {
  data(){
    return {
      isActive:true,
      hasError:false,
    }
  }
}
</script>

  • 也可以,直接绑定数据中的一个对象( 简化操作 )
<template>
  <div id="app">
    <!-- 效果同上 -->
    <div class="static" :class="classObj"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      classObj: {
        active: true,
        'text-danger': false
      }
    }
  },
}
</script>
  • 绑定一个返回对象的计算属性,这是一个常用且强大的模式:
<template>
  <div id="app">
    <!-- 效果同上 -->
    <div class="static" :class="classComputed"></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isActive:true,
      hasError:false
    }
  },
  computed:{
    classComputed(){
      return {
        active:this.isActive && !this.hasError,
        'text-danger':this.hasError
      }
    }
  }
}
</script>

# 数组语法

  • 可以绑定一个数组,来应用一个 class 列表
<template>
  <div id="app">
    <div :class="[activeClass,errorClass]"></div>

    <!-- 如果想根据条件切换列表中的class,可以使用三元运算符 -->
    <div :class="isActive ? activeClass : 'otherClass'"></div>
    <div :class="[isActive ? activeClass : '',errorClass]"></div>
    
    <!-- 当有多个条件class时,上述写法有些繁琐。所以,数组语法中,也可以使用对象语法 -->
    <div :class="[{activeClass:isActive},errorClass]"></div>
  </div>
</template>

<script>
export default {
  data(){
    return {
      isActive:false,
      activeClass:'active',
      errorClass:'text-danger'
    }
  }
}
</script>

# 在自定义组件上使用

在一个自定义组件上使用时,这些类将被添加到该组件的根元素上面,且这个元素上已经存在的类不会被覆盖。

<my-component class="foo bar" v-bind:class="{ active: isActive }"></my-component>

// 当isActive为true时,等同于:
<my-component class="foo bar active"></my-component>

内联样式 style

[1] 对象语法

  • v-bind:style的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
// CSS 属性名,可以用驼峰式或短横线分隔(记得用引号括起来) 来命名
data: {
  activeColor: 'red',
  fontSize: 30
}
  • 直接绑定到一个样式对象通常更好,这会让模板更清晰:
<div v-bind:style="styleObject"></div>
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}
  • 同样的,对象语法常常结合返回对象的计算属性使用。

[2] 数组语法

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

<div v-bind:style="[baseStyles, overridingStyles]"></div>

[3] 自动添加前缀

v-bind:style使用需添加浏览器引擎前缀的 CSS 属性时,Vue.js 会自动侦测并添加相应的前缀。