滑块

v-slider组件是数字输入的更好的可视化,它用于收集数字用户数据。

用例

滑块沿着条形图反映一系列值,用户可以从中选择单个值。 它们是调整设置的理想选择,例如音量,亮度或应用图像滤镜。

Sliders(滑块) - 图1

API

从下面选择您想要的组件,并查看可用的属性、插槽、事件和函数。

Sliders(滑块) - 图2

实战场

template script


  1. <template>
  2. <v-row
  3. justify="space-around"
  4. >
  5. <v-col cols="12">
  6. <v-slider
  7. v-model="min"
  8. min="-100"
  9. max="100"
  10. label="Min"
  11. ></v-slider>
  12. </v-col>
  13. <v-col cols="12">
  14. <v-slider
  15. v-model="max"
  16. min="-100"
  17. max="100"
  18. label="Max"
  19. ></v-slider>
  20. </v-col>
  21. <v-switch v-model="disabled" class="ma-2" label="Disabled"></v-switch>
  22. <v-switch v-model="readonly" class="ma-2" label="Readonly"></v-switch>
  23. <v-switch v-model="vertical" class="ma-2" label="Vertical"></v-switch>
  24. <v-switch v-model="range" class="ma-2" label="Range"></v-switch>
  25. <v-col cols="12">
  26. <v-slider
  27. v-if="!range"
  28. v-model="volume"
  29. append-icon="volume_up"
  30. prepend-icon="volume_down"
  31. :min="min"
  32. :max="max"
  33. :disabled="disabled"
  34. :readonly="readonly"
  35. :vertical="vertical"
  36. label="Volume"
  37. ></v-slider>
  38. <v-range-slider
  39. v-else
  40. append-icon="volume_up"
  41. prepend-icon="volume_down"
  42. :min="min"
  43. :max="max"
  44. :disabled="disabled"
  45. :readonly="readonly"
  46. :vertical="vertical"
  47. label="Volume"
  48. ></v-range-slider>
  49. </v-col>
  50. </v-row>
  51. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. volume: 10,
  6. min: 0,
  7. max: 100,
  8. disabled: false,
  9. readonly: false,
  10. vertical: false,
  11. range: false,
  12. }
  13. },
  14. }
  15. </script>

Sliders(滑块) - 图3

示例

下面是一些简单到复杂的例子。

最小值和最大值

您可以设置滑块的 minmax 值。

template script


  1. <template>
  2. <v-card flat color="transparent">
  3. <v-subheader>Min and max default slider</v-subheader>
  4. <v-card-text>
  5. <v-row>
  6. <v-col class="pr-4">
  7. <v-slider
  8. v-model="slider"
  9. class="align-center"
  10. :max="max"
  11. :min="min"
  12. hide-details
  13. >
  14. <template v-slot:append>
  15. <v-text-field
  16. v-model="slider"
  17. class="mt-0 pt-0"
  18. hide-details
  19. single-line
  20. type="number"
  21. style="width: 60px"
  22. ></v-text-field>
  23. </template>
  24. </v-slider>
  25. </v-col>
  26. </v-row>
  27. </v-card-text>
  28. <v-subheader>Min and max range slider</v-subheader>
  29. <v-card-text>
  30. <v-row>
  31. <v-col class="px-4">
  32. <v-range-slider
  33. v-model="range"
  34. :max="max"
  35. :min="min"
  36. hide-details
  37. class="align-center"
  38. >
  39. <template v-slot:prepend>
  40. <v-text-field
  41. :value="range[0]"
  42. class="mt-0 pt-0"
  43. hide-details
  44. single-line
  45. type="number"
  46. style="width: 60px"
  47. @change="$set(range, 0, $event)"
  48. ></v-text-field>
  49. </template>
  50. <template v-slot:append>
  51. <v-text-field
  52. :value="range[1]"
  53. class="mt-0 pt-0"
  54. hide-details
  55. single-line
  56. type="number"
  57. style="width: 60px"
  58. @change="$set(range, 1, $event)"
  59. ></v-text-field>
  60. </template>
  61. </v-range-slider>
  62. </v-col>
  63. </v-row>
  64. </v-card-text>
  65. </v-card>
  66. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. min: -50,
  6. max: 90,
  7. slider: 40,
  8. range: [-20, 70],
  9. }
  10. },
  11. }
  12. </script>

Sliders(滑块) - 图4

禁用

您无法与 disabled 滑块互动。

template


  1. <template>
  2. <v-container fluid>
  3. <v-row>
  4. <v-col cols="12">
  5. <v-slider
  6. disabled
  7. label="Disabled"
  8. value="30"
  9. ></v-slider>
  10. </v-col>
  11. </v-row>
  12. </v-container>
  13. </template>

Sliders(滑块) - 图5

只读

您不能与 readonly 滑块交互,但它们看起来与普通滑块一样。

template


  1. <template>
  2. <v-container fluid>
  3. <v-row>
  4. <v-col cols="12">
  5. <v-slider
  6. readonly
  7. label="Readonly"
  8. value="30"
  9. ></v-slider>
  10. </v-col>
  11. </v-row>
  12. </v-container>
  13. </template>

Sliders(滑块) - 图6

图标

您可以使用 append-iconprepend-icon 属性将图标添加到滑块。

template script


  1. <template>
  2. <v-card
  3. flat
  4. color="transparent"
  5. >
  6. <v-subheader>Media volume</v-subheader>
  7. <v-card-text>
  8. <v-slider
  9. v-model="media"
  10. prepend-icon="volume_up"
  11. ></v-slider>
  12. </v-card-text>
  13. <v-subheader>Alarm volume</v-subheader>
  14. <v-card-text>
  15. <v-slider
  16. v-model="alarm"
  17. append-icon="alarm"
  18. ></v-slider>
  19. </v-card-text>
  20. <v-subheader>Icon click callback</v-subheader>
  21. <v-card-text>
  22. <v-slider
  23. v-model="zoom"
  24. append-icon="zoom_in"
  25. prepend-icon="zoom_out"
  26. @click:append="zoomIn"
  27. @click:prepend="zoomOut"
  28. ></v-slider>
  29. </v-card-text>
  30. </v-card>
  31. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. media: 0,
  6. alarm: 0,
  7. zoom: 0,
  8. }
  9. },
  10. methods: {
  11. zoomOut () {
  12. this.zoom = (this.zoom - 10) || 0
  13. },
  14. zoomIn () {
  15. this.zoom = (this.zoom + 10) || 100
  16. },
  17. },
  18. }
  19. </script>

Sliders(滑块) - 图7

垂直滑块

您可以使用 vertical 将滑块切换到垂直方向。 如果需要更改滑块的高度,请使用 css。

template script


  1. <template>
  2. <v-container>
  3. <v-row>
  4. <v-slider
  5. v-model="value"
  6. vertical
  7. label="Regular"
  8. ></v-slider>
  9. <v-range-slider
  10. v-model="value2"
  11. vertical
  12. label="Range"
  13. ></v-range-slider>
  14. </v-row>
  15. </v-container>
  16. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. value: 10,
  6. value2: [20, 40],
  7. }
  8. },
  9. }
  10. </script>

Sliders(滑块) - 图8

拇指

您可以在滑动或总是显示“缩略图标签”。它可以通过设置“缩略图-颜色”和自定义大小,设置“缩略图-大小”来显示自定义颜色。 使用 always-dirty 时,即使在 min 值上,其颜色永远不会改变。

template script


  1. <template>
  2. <v-container fluid>
  3. <v-row>
  4. <v-col cols="12">
  5. <v-subheader class="pl-0">Show thumb when using slider</v-subheader>
  6. <v-slider
  7. v-model="slider"
  8. thumb-label
  9. ></v-slider>
  10. </v-col>
  11. <v-col cols="12">
  12. <v-subheader class="pl-0">Always show thumb label</v-subheader>
  13. <v-slider
  14. v-model="slider"
  15. thumb-label="always"
  16. ></v-slider>
  17. </v-col>
  18. <v-col cols="12">
  19. <v-subheader class="pl-0">Custom thumb size</v-subheader>
  20. <v-slider
  21. v-model="slider"
  22. :thumb-size="24"
  23. thumb-label="always"
  24. ></v-slider>
  25. </v-col>
  26. <v-col cols="12">
  27. <v-subheader class="pl-0">Custom thumb label</v-subheader>
  28. <v-slider
  29. v-model="slider"
  30. :thumb-size="24"
  31. thumb-label="always"
  32. >
  33. <template v-slot:thumb-label="{ value }">
  34. {{ satisfactionEmojis[Math.min(Math.floor(value / 10), 9)] }}
  35. </template>
  36. </v-slider>
  37. </v-col>
  38. </v-row>
  39. </v-container>
  40. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. satisfactionEmojis: ['😭', '😢', '☹️', '🙁', '😐', '🙂', '😊', '😁', '😄', '😍'],
  6. slider: 45,
  7. }
  8. },
  9. }
  10. </script>

Sliders(滑块) - 图9

反向标签

具有 inverse-label 属性的 v-slider 在其末尾显示标签。

template


  1. <template>
  2. <v-container fluid>
  3. <v-row>
  4. <v-col cols="12">
  5. <v-slider
  6. inverse-label
  7. label="Inverse label"
  8. value="30"
  9. ></v-slider>
  10. </v-col>
  11. </v-row>
  12. </v-container>
  13. </template>

Sliders(滑块) - 图10

Light Vuetify Stickers

Stick them to your car, laptop or favorite mug. They are made from a durable vinyl with a laminate that is weather-proof against rain, sun, wind and snow, and even dishwasher safe.

ads by Vuetify

](https://store.vuetifyjs.com/product/vuetify-light-sticker?ref=vuetifyjs.com)

自定义范围滑块

使用 tick-labels 属性和插槽,您可以创建一个非常定制的解决方案。

template script


  1. <template>
  2. <v-row>
  3. <v-col class="pa-12">
  4. <v-range-slider
  5. :tick-labels="seasons"
  6. :value="[0, 1]"
  7. min="0"
  8. max="3"
  9. ticks="always"
  10. tick-size="4"
  11. >
  12. <template v-slot:thumb-label="props">
  13. <v-icon dark>
  14. {{ season(props.value) }}
  15. </v-icon>
  16. </template>
  17. </v-range-slider>
  18. </v-col>
  19. </v-row>
  20. </template>
  1. <script>
  2. export default {
  3. data: () => ({
  4. seasons: [
  5. 'Winter',
  6. 'Spring',
  7. 'Summer',
  8. 'Fall',
  9. ],
  10. icons: [
  11. 'mdi-snowflake',
  12. 'mdi-leaf',
  13. 'mdi-fire',
  14. 'mdi-water',
  15. ],
  16. }),
  17. methods: {
  18. season (val) {
  19. return this.icons[val]
  20. },
  21. },
  22. }
  23. </script>

Sliders(滑块) - 图11

刻度线

刻度线代表用户可以将滑块移动到的预定值。

template script


  1. <template>
  2. <v-card flat color="transparent">
  3. <v-subheader>Show ticks when using slider</v-subheader>
  4. <v-card-text>
  5. <v-slider
  6. v-model="value"
  7. step="10"
  8. ticks
  9. ></v-slider>
  10. </v-card-text>
  11. <v-subheader>Always show ticks</v-subheader>
  12. <v-card-text>
  13. <v-slider
  14. v-model="value"
  15. step="10"
  16. ticks="always"
  17. ></v-slider>
  18. </v-card-text>
  19. <v-subheader>Tick size</v-subheader>
  20. <v-card-text>
  21. <v-slider
  22. v-model="value"
  23. step="10"
  24. ticks="always"
  25. tick-size="4"
  26. ></v-slider>
  27. </v-card-text>
  28. <v-subheader>Tick labels</v-subheader>
  29. <v-card-text>
  30. <v-slider
  31. v-model="fruits"
  32. :tick-labels="ticksLabels"
  33. :max="3"
  34. step="1"
  35. ticks="always"
  36. tick-size="4"
  37. ></v-slider>
  38. </v-card-text>
  39. </v-card>
  40. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. value: 0,
  6. fruits: 0,
  7. ticksLabels: [
  8. 'Figs',
  9. 'Lemon',
  10. 'Pear',
  11. 'Apple',
  12. ],
  13. }
  14. },
  15. }
  16. </script>

Sliders(滑块) - 图12

自定义颜色

您可以使用colortrack-colorthumb-color属性来设置滑块的颜色。

template script


  1. <template>
  2. <div>
  3. <v-slider
  4. v-model="ex1.val"
  5. :color="ex1.color"
  6. :label="ex1.label"
  7. ></v-slider>
  8. <v-slider
  9. v-model="ex2.val"
  10. :label="ex2.label"
  11. :track-color="ex2.color"
  12. ></v-slider>
  13. <v-slider
  14. v-model="ex3.val"
  15. :label="ex3.label"
  16. :thumb-color="ex3.color"
  17. thumb-label="always"
  18. ></v-slider>
  19. </div>
  20. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. ex1: { label: 'color', val: 25, color: 'orange darken-3' },
  6. ex2: { label: 'track-color', val: 75, color: 'green lighten-1' },
  7. ex3: { label: 'thumb-color', val: 50, color: 'red' },
  8. }
  9. },
  10. }
  11. </script>

Sliders(滑块) - 图13

范围

范围滑块。

template script


  1. <template>
  2. <v-card flat color="transparent">
  3. <v-subheader>Default range slider</v-subheader>
  4. <v-card-text>
  5. <v-range-slider
  6. v-model="value1"
  7. ></v-range-slider>
  8. </v-card-text>
  9. <v-subheader>Disabled range slider</v-subheader>
  10. <v-card-text>
  11. <v-range-slider
  12. v-model="value2"
  13. disabled
  14. ></v-range-slider>
  15. </v-card-text>
  16. </v-card>
  17. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. value1: [30, 60],
  6. value2: [30, 60],
  7. }
  8. },
  9. }
  10. </script>

Sliders(滑块) - 图14

验证

Vuetify包含简单的验证通过使用 rules 属性,这个属性接受一个回调函数组,在验证规则时,当前的 v-model 值将被传递给回调函数,这个回调函数必须返回 tureString 或者错误信息。

template script


  1. <template>
  2. <v-card flat color="transparent">
  3. <v-subheader>Rules</v-subheader>
  4. <v-card-text class="pt-0">
  5. <v-slider
  6. v-model="value"
  7. :rules="rules"
  8. label="How many?"
  9. step="10"
  10. thumb-label="always"
  11. ticks
  12. ></v-slider>
  13. </v-card-text>
  14. <v-subheader>Persistent hint</v-subheader>
  15. <v-card-text class="pt-0">
  16. <v-slider
  17. v-model="value"
  18. :rules="rules"
  19. hint="40 in stock"
  20. label="How many?"
  21. persistent-hint
  22. step="10"
  23. thumb-label="always"
  24. ticks
  25. ></v-slider>
  26. </v-card-text>
  27. </v-card>
  28. </template>
  1. <script>
  2. export default {
  3. data () {
  4. return {
  5. value: 30,
  6. rules: [
  7. v => v <= 40 || 'Only 40 in stock',
  8. ],
  9. }
  10. },
  11. }
  12. </script>

Sliders(滑块) - 图15

插槽

使用诸如 prependappend 之类的插槽可轻松自定义 v-slider 以适应任何情况。

template script style


  1. <template>
  2. <v-card
  3. class="mx-auto"
  4. max-width="600"
  5. >
  6. <v-toolbar
  7. flat
  8. dense
  9. >
  10. <v-toolbar-title>
  11. <span class="subheading">METRONOME</span>
  12. </v-toolbar-title>
  13. <v-spacer></v-spacer>
  14. <v-btn icon>
  15. <v-icon>mdi-share-variant</v-icon>
  16. </v-btn>
  17. </v-toolbar>
  18. <v-card-text>
  19. <v-row
  20. class="mb-4"
  21. justify="space-between"
  22. >
  23. <v-col class="text-left">
  24. <span
  25. class="display-3 font-weight-light"
  26. v-text="bpm"
  27. ></span>
  28. <span class="subheading font-weight-light mr-1">BPM</span>
  29. <v-fade-transition>
  30. <v-avatar
  31. v-if="isPlaying"
  32. :color="color"
  33. :style="{
  34. animationDuration: animationDuration
  35. }"
  36. class="mb-1 v-avatar--metronome"
  37. size="12"
  38. ></v-avatar>
  39. </v-fade-transition>
  40. </v-col>
  41. <v-col class="text-right">
  42. <v-btn
  43. :color="color"
  44. dark
  45. depressed
  46. fab
  47. @click="toggle"
  48. >
  49. <v-icon large>
  50. {{ isPlaying ? 'mdi-pause' : 'mdi-play' }}
  51. </v-icon>
  52. </v-btn>
  53. </v-col>
  54. </v-row>
  55. <v-slider
  56. v-model="bpm"
  57. :color="color"
  58. track-color="grey"
  59. always-dirty
  60. min="40"
  61. max="218"
  62. >
  63. <template v-slot:prepend>
  64. <v-icon
  65. :color="color"
  66. @click="decrement"
  67. >
  68. mdi-minus
  69. </v-icon>
  70. </template>
  71. <template v-slot:append>
  72. <v-icon
  73. :color="color"
  74. @click="increment"
  75. >
  76. mdi-plus
  77. </v-icon>
  78. </template>
  79. </v-slider>
  80. </v-card-text>
  81. </v-card>
  82. </template>
  1. <script>
  2. export default {
  3. data: () => ({
  4. bpm: 40,
  5. interval: null,
  6. isPlaying: false,
  7. }),
  8. computed: {
  9. color () {
  10. if (this.bpm < 100) return 'indigo'
  11. if (this.bpm < 125) return 'teal'
  12. if (this.bpm < 140) return 'green'
  13. if (this.bpm < 175) return 'orange'
  14. return 'red'
  15. },
  16. animationDuration () {
  17. return `${60 / this.bpm}s`
  18. },
  19. },
  20. methods: {
  21. decrement () {
  22. this.bpm--
  23. },
  24. increment () {
  25. this.bpm++
  26. },
  27. toggle () {
  28. this.isPlaying = !this.isPlaying
  29. },
  30. },
  31. }
  32. </script>
  1. <style>
  2. @keyframes metronome-example {
  3. from {
  4. transform: scale(.5);
  5. }
  6. to {
  7. transform: scale(1);
  8. }
  9. }
  10. .v-avatar--metronome {
  11. animation-name: metronome-example;
  12. animation-iteration-count: infinite;
  13. animation-direction: alternate;
  14. }
  15. </style>

Sliders(滑块) - 图16