Class与Style绑定
操作元素的class列表和内联样式是数据绑定的一个常见需求,因为他们都是attribute,所以我们可以用
v-bind
来处理他们
绑定HTML Class
对象语法
通过
v-bind:class
,借助data或计算属性,来动态改变某个class是否存在
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<style>
.active,
.active2,
.active3 {
border: 3px solid red;
width: 100px;
height: 100px;
}
</style>
</head>
<body>
<div id="app">
<!-- <div v-bind:class="{'active': isactive}">我是DIV</div> -->
<!-- <div v-bind:class="classObject">我是DIV</div> -->
<div v-bind:class="classObject">我是DIV</div>
</div>
<script>
let vm = new Vue({
el: '#app',
// data: function () {
// return {
// isactive: true
// }
// }
// data: {
// classObject: {
// active2: true,
// danger: true
// }
// }
data: function () {
return {
isactive: true
}
},
computed: {
classObject: function () {
return {
active3: this.isactive
}
}
}
})
</script>
</body>
</html>
数组语法
把一个数组传给
v-bind:class
,以应用一个class列表,进而借助这个class列表来动态修改class。
<div id="app">
<div v-bind:class="[classOne,classTwo]">我是DIV</div>
</div>
<script>
let vm = new Vue({
el: '#app',
data: function () {
return {
classOne: 'sty1',
classTwo: 'sty2'
}
}
})
</script>
如果你也想根据条件切换列表中的 class,可以用三元表达式:
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
这样写将始终添加 errorClass
,但是只有在 isActive
是 truthy时才添加 activeClass
。
不过,当有多个条件 class 时这样写有些繁琐。所以在数组语法中也可以使用对象语法:
<div v-bind:class="[{ active: isActive }, errorClass]"></div>
用在组件上
自定义组件的初始模板上的class不会被覆盖,后续添加的class会增加
绑定内联样式
对象语法
类似于class的对象语法
直接绑定到一个样式对象通常更好,这会让模板更清晰:
<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
同样的,对象语法常常结合返回对象的计算属性使用。
数组语法
v-bind:style
的数组语法可以将多个样式对象应用到同一个元素上:
<div v-bind:style="[baseStyles, overridingStyles]"></div>
自动添加前缀
当
v-bind:style
使用需要添加浏览器引擎前缀的 CSS property 时,如transform
,Vue.js 会自动侦测并添加相应的前缀。
多重值
从 2.3.0 起你可以为 style
绑定中的 property 提供一个包含多个值的数组,常用于提供多个带前缀的值,例如:
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex
。