Class and Style Bindings
Class and Style Bindings
vuejs.org/v2/guide/class-and-style.html
Vue.js
Team
A common need for data binding is manipulating an element’s class list and its inline
styles. Since they are both attributes, we can use v-bind to handle them: we only need
to calculate a final string with our expressions. However, meddling with string
concatenation is annoying and error-prone. For this reason, Vue provides special
enhancements when v-bind is used with class and style . In addition to strings, the
expressions can also evaluate to objects or arrays.
Object Syntax
We can pass an object to v-bind:class to dynamically toggle classes:
The above syntax means the presence of the active class will be determined by the
truthiness of the data property isActive .
1/5
You can have multiple classes toggled by having more fields in the object. In addition,
the v-bind:class directive can also co-exist with the plain class attribute. So given the
following template:
<div
class="static"
v-bind:class="{ active: isActive, 'text-danger': hasError }"
></div>
data: {
isActive: true,
hasError: false
}
It will render:
When isActive or hasError changes, the class list will be updated accordingly. For
example, if hasError becomes true , the class list will become "static active text-
danger" .
<div v-bind:class="classObject"></div>
data: {
classObject: {
active: true,
'text-danger': false
}
}
This will render the same result. We can also bind to a computed property that returns
an object. This is a common and powerful pattern:
<div v-bind:class="classObject"></div>
data: {
isActive: true,
error: null
},
computed: {
classObject: function () {
return {
active: this.isActive && !this.error,
'text-danger': this.error && this.error.type === 'fatal'
}
}
}
2/5
Array Syntax
We can pass an array to v-bind:class to apply a list of classes:
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
If you would like to also toggle a class in the list conditionally, you can do it with a
ternary expression:
This will always apply errorClass , but will only apply activeClass when isActive is
truthy.
However, this can be a bit verbose if you have multiple conditional classes. That’s why
it’s also possible to use the object syntax inside array syntax:
With Components
This section assumes knowledge of Vue Components. Feel free to skip it and come back
later.
When you use the class attribute on a custom component, those classes will be added
to the component’s root element. Existing classes on this element will not be
overwritten.
Vue.component('my-component', {
template: '<p class="foo bar">Hi</p>'
})
3/5
The same is true for class bindings:
Object Syntax
The object syntax for v-bind:style is pretty straightforward - it looks almost like CSS,
except it’s a JavaScript object. You can use either camelCase or kebab-case (use quotes
with kebab-case) for the CSS property names:
data: {
activeColor: 'red',
fontSize: 30
}
It is often a good idea to bind to a style object directly so that the template is cleaner:
<div v-bind:style="styleObject"></div>
data: {
styleObject: {
color: 'red',
fontSize: '13px'
}
}
Again, the object syntax is often used in conjunction with computed properties that
return objects.
Array Syntax
The array syntax for v-bind:style allows you to apply multiple style objects to the same
element:
Auto-prefixing
When you use a CSS property that requires vendor prefixes in v-bind:style , for
example transform , Vue will automatically detect and add appropriate prefixes to the
applied styles.
4/5
Multiple Values
2.3.0+
Starting in 2.3.0+ you can provide an array of multiple (prefixed) values to a style
property, for example:
This will only render the last value in the array which the browser supports. In this
example, it will render display: flex for browsers that support the unprefixed version
of flexbox.
5/5