Vue 中样式的使用
Vue 中,通常使用 v-bind,绑定 class / style 属性来操作元素的 class 列表和内联样式。
因为它们都是属性,所以,可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。
不过,字符串拼接麻烦且易错。因此,在将 v-bind用于 class和 style时,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 会自动侦测并添加相应的前缀。