Sometimes when working with Vue, we might need to apply some CSS to an element based on some certain conditions. Vue.js provides us with special syntax to dynamically bind our styles and CSS.
Binding to Classes
There are different ways we can bind CSS classes to our html. We can either use the object binding or the array binding
Object binding
We can add CSS dynamically to our html by passing the classes to an object using v-bind:class="{}" syntax. let's see an example of this:
//script
const isBlue = ref(true);
//template
<div v-bind:class="{"blue-text": isBlue}">I'm a blue text</div>
//css
.blue-text {
color: blue;
}
The blue-text class will be added to the div depending on whether the isBlue variable is true or false, in this case it's true, so the blue-text class we be added to the div which will then render:
<div class="blue-text">I'm a blue text</div>
If we change isBlue to false, the class list will updated automatically and accordingly, i.e. the blue-text class will be removed.
We can also add multiple classes to the div like so:
<div v-bind:class="{"blue-text": isBlue, "active": isActive}">I'm a blue text</div>
We can also use the v-bind:class shorthand :class to dynamically bind classes:
<div :class="{"blue-text": isBlue}">I'm a blue text</div>
Array Binding
We can also bind :class to an array like so:
<div :class="[isBlue ? "blue-text" : '']">I'm a blue text</div>
We're using the same example but this time in a different way, we're binding the blue-text class to the div depending on the status of the isBlue variable. When isBlue becomes false the class is removed. Optionally we can add another class to the div to toggle them conditionally:
<div :class="[isBlue ? 'blue-text' : 'red-text']">I'm either a blue or red text</div>
Now when isBlue is false the text changes to red and when isBlue is true the text changes to blue.
Binding to Inline Styles
Just like :class binding, we can also bind styles directly to an HTML element using :style v-bind syntax. Let's see this in action:
Object Binding
<div :style="{color: blue, 'font-size': '20px'}"> I'm a blue text </div>
We can also declare our object directly in the script section to make our code cleaner.
const styleObject = reactive({
color: 'blue',
'font-size': '20px'
})
<div :style="styleObject">I'm a blue text</div>
Array Binding
One of the many benefits of binding to an array is that you can bind multiple objects to a single array.
<div :style="[styleObject1, styleObject2, styleObject3]"></div>
Apart from binding object styles to an array, we can also bind our styles directly into the array.
Top comments (2)
is this how dark and light __scheme switches get done?
Yes.. there are other ways to do it also. I will write an article on how to implement light and dark theme/scheme with Vue this week.