'How do I make a striped v-data-table in Vuetify?
I have a table
<v-data-table
:headers="headers"
:items="bookings"
class="elevation-1"
:search="search"
>
<template slot="items" slot-scope="props">
<td>{{ props.item.date }}</td>
<td>{{ props.item.time }}</td>
<td>{{ props.item.vehicle }}</td>
</template>
</v-data-table>
Made in Vuetify, It works all fine, I just need to make alternate rows into different colors. Or the give the bootstrap .table-striped
class to the table.
Solution 1:[1]
You could achieve that by using the following CSS rule :
tbody tr:nth-of-type(odd) {
background-color: rgba(0, 0, 0, .05);
}
new Vue({
el: '#app',
data() {
return {
headers: [{
text: 'Dessert (100g serving)',
align: 'left',
sortable: false,
value: 'name'
},
{
text: 'Calories',
value: 'calories'
},
{
text: 'Fat (g)',
value: 'fat'
},
{
text: 'Carbs (g)',
value: 'carbs'
},
{
text: 'Protein (g)',
value: 'protein'
},
{
text: 'Iron (%)',
value: 'iron'
}
],
desserts: [{
name: 'Frozen Yogurt',
calories: 159,
fat: 6.0,
carbs: 24,
protein: 4.0,
iron: '1%'
},
{
name: 'Ice cream sandwich',
calories: 237,
fat: 9.0,
carbs: 37,
protein: 4.3,
iron: '1%'
},
{
name: 'Eclair',
calories: 262,
fat: 16.0,
carbs: 23,
protein: 6.0,
iron: '7%'
},
{
name: 'Cupcake',
calories: 305,
fat: 3.7,
carbs: 67,
protein: 4.3,
iron: '8%'
},
{
name: 'Gingerbread',
calories: 356,
fat: 16.0,
carbs: 49,
protein: 3.9,
iron: '16%'
},
{
name: 'Jelly bean',
calories: 375,
fat: 0.0,
carbs: 94,
protein: 0.0,
iron: '0%'
},
{
name: 'Lollipop',
calories: 392,
fat: 0.2,
carbs: 98,
protein: 0,
iron: '2%'
},
{
name: 'Honeycomb',
calories: 408,
fat: 3.2,
carbs: 87,
protein: 6.5,
iron: '45%'
},
{
name: 'Donut',
calories: 452,
fat: 25.0,
carbs: 51,
protein: 4.9,
iron: '22%'
},
{
name: 'KitKat',
calories: 518,
fat: 26.0,
carbs: 65,
protein: 7,
iron: '6%'
}
]
}
}
})
tbody tr:nth-of-type(odd) {
background-color: rgba(0, 0, 0, .05);
}
<script src="https://cdn.jsdelivr.net/npm/babel-polyfill/dist/polyfill.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vuetify.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/vuetify.min.css">
<div id="app">
<v-app id="inspire">
<v-data-table :headers="headers" :items="desserts" class="elevation-1">
<template slot="items" slot-scope="props">
<td>{{ props.item.name }}</td>
<td class="text-xs-right">{{ props.item.calories }}</td>
<td class="text-xs-right">{{ props.item.fat }}</td>
<td class="text-xs-right">{{ props.item.carbs }}</td>
<td class="text-xs-right">{{ props.item.protein }}</td>
<td class="text-xs-right">{{ props.item.iron }}</td>
</template>
</v-data-table>
</v-app>
</div>
Solution 2:[2]
Expanding Boussadjra Brahim's answer. Here is some css for styling the header and footer globally
<style>
tbody tr:nth-of-type(even) {
background-color: rgba(236, 237, 237);
}
tbody tr:nth-of-type(odd) {
background-color: rgb(250 ,250, 250);
}
.v-data-table-header {
background-color: rgba(182, 183, 187);
color: white;
}
.v-data-footer {
background-color: rgb(250 ,250, 250);
}
.theme--light.v-data-table thead tr th {
color: white;
}
</style>
Solution 3:[3]
To achieve the stripes for both dark and light theme I do this:
<style>
.theme--light.v-data-table tbody tr:nth-of-type(even) {
background-color: rgba(0, 0, 0, .03);
}
.theme--dark.v-data-table tbody tr:nth-of-type(even) {
background-color: rgba(0, 0, 0, .5);
}
</style>
Solution 4:[4]
I had some trouble with this if you have a table which is expandable. This is because following the example at vuetify documentation, the resulting table will make one row also for the expanding content, which is hidden I think.
Anyhu this is the style I ended up with:
tr:nth-of-type(4n+3) {
background-color: rgba(0, 0, 0, .05);
}
Every forth row, with a offset of 3, so you dont include the header.
Solution 5:[5]
In v-data-table class="elevation-1"
I changed class
property to class="table-striped elevation-1"
and it works fine to me.
Solution 6:[6]
I use material design color for the background like this css style:
<style>
tbody tr:nth-of-type(odd) {
/* 'teal lighten-5' basides on material design color */
background-color: #E0F2F1;
}
tbody tr:nth-of-type(even) {
/* 'deep-orange lighten-5' basides on material design color */
background-color: #FBE9E7;
}
</style>
The results can be seen as below: Thanks to Boussadjra Brahim for helping answer this question. This answer is inspired by his answer.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Boussadjra Brahim |
Solution 2 | Kurtis Streutker |
Solution 3 | Hexodus |
Solution 4 | Terje Solem |
Solution 5 | xKobalt |
Solution 6 | Ahmad Budairi |