Slider滑动输入条 - 图1

Slider 滑动输入条

滑动型输入器,展示当前值和可选范围。

何时使用

当用户需要在数值区间/自定义区间内进行选择时,可为连续或离散值。

代码演示

Slider滑动输入条 - 图2

基本

基本滑动条。当 rangetrue 时,渲染为双滑块。当 disabledtrue 时,滑块处于不可用状态。

  1. <template>
  2. <div>
  3. <a-slider id="test" v-model:value="value1" :disabled="disabled" />
  4. <a-slider range v-model:value="value2" :disabled="disabled" />
  5. Disabled:
  6. <a-switch size="small" v-model:checked="disabled" />
  7. </div>
  8. </template>
  9. <script lang="ts">
  10. import { defineComponent, ref } from 'vue';
  11. export default defineComponent({
  12. setup() {
  13. const value1 = ref<number>(0);
  14. const value2 = ref<number[]>([20, 50]);
  15. const disabled = ref<boolean>(false);
  16. return {
  17. value1,
  18. value2,
  19. disabled,
  20. };
  21. },
  22. });
  23. </script>
  24. <style scoped>
  25. .code-box-demo .ant-slider {
  26. margin-bottom: 16px;
  27. }
  28. </style>

Slider滑动输入条 - 图3

带 icon 的滑块

滑块左右可以设置图标来表达业务含义。

  1. <template>
  2. <div class="icon-wrapper">
  3. <frown-outlined :style="{ color: preColor }" />
  4. <a-slider :min="0" :max="20" v-model:value="sliderValue" />
  5. <smile-outlined :style="{ color: nextColor }" />
  6. </div>
  7. </template>
  8. <script lang="ts">
  9. import { defineComponent, ref, computed } from 'vue';
  10. import { FrownOutlined, SmileOutlined } from '@ant-design/icons-vue';
  11. export default defineComponent({
  12. components: {
  13. FrownOutlined,
  14. SmileOutlined,
  15. },
  16. setup() {
  17. const sliderValue = ref<number>(0);
  18. const min = ref<number>(0);
  19. const max = ref<number>(20);
  20. const preColor = computed(() => {
  21. const mid = +((max.value - min.value) / 2).toFixed(5);
  22. return sliderValue.value >= mid ? '' : 'rgba(0, 0, 0, .45)';
  23. });
  24. const nextColor = computed(() => {
  25. const mid = +((max.value - min.value) / 2).toFixed(5);
  26. return sliderValue.value >= mid ? 'rgba(0, 0, 0, .45)' : '';
  27. });
  28. return {
  29. sliderValue,
  30. min,
  31. max,
  32. preColor,
  33. nextColor,
  34. };
  35. },
  36. });
  37. </script>
  38. <style scoped>
  39. .icon-wrapper {
  40. position: relative;
  41. padding: 0px 30px;
  42. }
  43. .icon-wrapper .anticon {
  44. position: absolute;
  45. top: -2px;
  46. width: 16px;
  47. height: 16px;
  48. line-height: 1;
  49. font-size: 16px;
  50. color: rgba(0, 0, 0, 0.25);
  51. }
  52. .icon-wrapper .anticon:first-child {
  53. left: 0;
  54. }
  55. .icon-wrapper .anticon:last-child {
  56. right: 0;
  57. }
  58. </style>

Slider滑动输入条 - 图4

事件

当 Slider 的值发生改变时,会触发 onChange 事件,并把改变后的值作为参数传入。在 onmouseup 时,会触发 onAfterChange 事件,并把当前值作为参数传入。

  1. <template>
  2. <div class="code-box-demo">
  3. <a-slider v-model:value="value1" @afterChange="onAfterChange" />
  4. <a-slider range :step="10" v-model:value="value2" @afterChange="onAfterChange" />
  5. </div>
  6. </template>
  7. <script lang="ts">
  8. import { defineComponent, ref } from 'vue';
  9. export default defineComponent({
  10. setup() {
  11. const value1 = ref<number>(30);
  12. const value2 = ref<number[]>([20, 50]);
  13. const onAfterChange = (value: number) => {
  14. console.log('afterChange: ', value);
  15. };
  16. return {
  17. value1,
  18. value2,
  19. onAfterChange,
  20. };
  21. },
  22. });
  23. </script>
  24. <style scoped>
  25. .code-box-demo .ant-slider {
  26. margin-bottom: 16px;
  27. }
  28. </style>

Slider滑动输入条 - 图5

垂直

垂直方向的 Slider。

  1. <template>
  2. <div style="height: 300px">
  3. <div style="display: inline-block; height: 300px; margin-left: 70px">
  4. <a-slider vertical v-model:value="value1" />
  5. </div>
  6. <div style="display: inline-block; height: 300px; margin-left: 70px">
  7. <a-slider vertical range :step="10" v-model:value="value2" />
  8. </div>
  9. <div style="display: inline-block; height: 300px; margin-left: 70px">
  10. <a-slider vertical range :marks="marks" v-model:value="value3" />
  11. </div>
  12. </div>
  13. </template>
  14. <script lang="ts">
  15. import { defineComponent, ref, createVNode } from 'vue';
  16. export default defineComponent({
  17. setup() {
  18. const value1 = ref<number>(30);
  19. const value2 = ref<number[]>([20, 50]);
  20. const value3 = ref<number[]>([26, 37]);
  21. const marks = ref<Record<number, any>>({
  22. 0: '0°C',
  23. 26: '26°C',
  24. 37: '37°C',
  25. 100: {
  26. style: {
  27. color: '#f50',
  28. },
  29. label: createVNode('strong', {}, '100°C'),
  30. },
  31. });
  32. return {
  33. value1,
  34. value2,
  35. value3,
  36. marks,
  37. };
  38. },
  39. });
  40. </script>
  41. <style scoped>
  42. .code-box-demo .ant-slider {
  43. margin-bottom: 16px;
  44. }
  45. </style>

Slider滑动输入条 - 图6

反向

设置 reverse 可以将滑动条置反。

  1. <template>
  2. <div>
  3. <a-slider v-model:value="value1" :reverse="reverse" />
  4. <a-slider range v-model:value="value2" :reverse="reverse" />
  5. Reversed:
  6. <a-switch size="small" v-model:checked="reverse" />
  7. </div>
  8. </template>
  9. <script lang="ts">
  10. import { defineComponent, ref } from 'vue';
  11. export default defineComponent({
  12. setup() {
  13. const value1 = ref<number>(30);
  14. const value2 = ref<number[]>([20, 50]);
  15. const reverse = ref<boolean>(true);
  16. return {
  17. value1,
  18. value2,
  19. reverse,
  20. };
  21. },
  22. });
  23. </script>

Slider滑动输入条 - 图7

带输入框的滑块

数字输入框 组件保持同步。

  1. <template>
  2. <div>
  3. <a-row>
  4. <a-col :span="12">
  5. <a-slider v-model:value="inputValue1" :min="1" :max="20" />
  6. </a-col>
  7. <a-col :span="4">
  8. <a-input-number v-model:value="inputValue1" :min="1" :max="20" style="margin-left: 16px" />
  9. </a-col>
  10. </a-row>
  11. <a-row>
  12. <a-col :span="12">
  13. <a-slider v-model:value="inputValue" :min="0" :max="1" :step="0.01" />
  14. </a-col>
  15. <a-col :span="4">
  16. <a-input-number
  17. v-model:value="inputValue"
  18. :min="0"
  19. :max="1"
  20. :step="0.01"
  21. style="margin-left: 16px"
  22. />
  23. </a-col>
  24. </a-row>
  25. </div>
  26. </template>
  27. <script lang="ts">
  28. import { defineComponent, ref } from 'vue';
  29. export default defineComponent({
  30. setup() {
  31. const inputValue = ref<number>(0);
  32. const inputValue1 = ref<number>(1);
  33. return {
  34. inputValue,
  35. inputValue1,
  36. };
  37. },
  38. });
  39. </script>
  40. <style scoped>
  41. .code-box-demo .ant-slider {
  42. margin-bottom: 16px;
  43. }
  44. </style>

Slider滑动输入条 - 图8

自定义提示

使用 tipFormatter 可以格式化 Tooltip 的内容,设置 tipFormatter={null},则隐藏 Tooltip

  1. <template>
  2. <div>
  3. <a-slider :tip-formatter="formatter" />
  4. <a-slider :tip-formatter="null" />
  5. </div>
  6. </template>
  7. <script lang="ts">
  8. import { defineComponent, ref } from 'vue';
  9. export default defineComponent({
  10. setup() {
  11. const disabled = ref<boolean>(false);
  12. const formatter = (value: number) => {
  13. return `${value}%`;
  14. };
  15. return {
  16. disabled,
  17. formatter,
  18. };
  19. },
  20. });
  21. </script>

Slider滑动输入条 - 图9

带标签的滑块

使用 marks 属性标注分段式滑块,使用 value / defaultValue 指定滑块位置。当 included=false 时,表明不同标记间为并列关系。当 step=null 时,Slider 的可选值仅有 marks 标出来的部分。

  1. <template>
  2. <div id="components-slider-demo-mark">
  3. <h4>included=true</h4>
  4. <a-slider :marks="marks" v-model:value="value1" />
  5. <a-slider range :marks="marks" v-model:value="value2" />
  6. <h4>included=false</h4>
  7. <a-slider :marks="marks" :included="false" v-model:value="value3" />
  8. <h4>marks & step</h4>
  9. <a-slider :marks="marks" :step="10" v-model:value="value4" />
  10. <h4>step=null</h4>
  11. <a-slider :marks="marks" :step="null" v-model:value="value5" />
  12. </div>
  13. </template>
  14. <script lang="ts">
  15. import { defineComponent, createVNode, ref } from 'vue';
  16. export default defineComponent({
  17. setup() {
  18. const value1 = ref<number>(37);
  19. const value2 = ref<number[]>([26, 37]);
  20. const value3 = ref<number>(37);
  21. const value4 = ref<number>(37);
  22. const value5 = ref<number>(37);
  23. const marks = ref<Record<number, any>>({
  24. 0: '0°C',
  25. 26: '26°C',
  26. 37: '37°C',
  27. 100: {
  28. style: {
  29. color: '#f50',
  30. },
  31. label: createVNode('strong', {}, '100°C'),
  32. },
  33. });
  34. return {
  35. value1,
  36. value2,
  37. value3,
  38. value4,
  39. value5,
  40. marks,
  41. };
  42. },
  43. });
  44. </script>
  45. <style scoped>
  46. #components-slider-demo-mark h4 {
  47. margin: 0 0 16px;
  48. }
  49. #components-slider-demo-mark .ant-slider-with-marks {
  50. margin-bottom: 44px;
  51. }
  52. </style>

Slider滑动输入条 - 图10

控制 ToolTip 的显示

tooltipVisibletrue 时,将始终显示 ToolTip;反之则始终不显示,即使在拖动、移入时也是如此。

  1. <template>
  2. <a-slider v-model:value="value" :tooltip-visible="true" />
  3. </template>
  4. <script lang="ts">
  5. import { defineComponent, ref } from 'vue';
  6. export default defineComponent({
  7. setup() {
  8. const value = ref<number>(30);
  9. return {
  10. value,
  11. };
  12. },
  13. });
  14. </script>

API

参数说明类型默认值版本
autofocus自动获取焦点booleanfalse
disabled值为 true 时,滑块为禁用状态booleanfalse
dots是否只能拖拽到刻度上booleanfalse
includedmarks 不为空对象时有效,值为 true 时表示值为包含关系,false 表示并列booleantrue
marks刻度标记,key 的类型必须为 number 且取值在闭区间 [min, max] 内,每个标签可以单独设置样式object{ number: string|VNode } or { number: { style: object, label: string|VNode } } or { number: () => VNode }
max最大值number100
min最小值number0
range双滑块模式booleanfalse
reverse反向坐标轴booleanfalse1.5.0
step步长,取值必须大于 0,并且可被 (max - min) 整除。当 marks 不为空对象时,可以设置 stepnull,此时 Slider 的可选值仅有 marks 标出来的部分。number|null1
tipFormatterSlider 会把当前值传给 tipFormatter,并在 Tooltip 中显示 tipFormatter 的返回值,若为 null,则隐藏 Tooltip。Function|nullIDENTITY
value(v-model)设置当前取值。当 rangefalse 时,使用 number,否则用 [number, number]number|number[]
vertical值为 true 时,Slider 为垂直方向Booleanfalse
tooltipPlacement设置 Tooltip 展示位置。参考 Tooltipstring1.5.0
tooltipVisible值为true时,Tooltip 将会始终显示;否则始终不显示,哪怕在拖拽及移入时。Boolean
getTooltipPopupContainerTooltip 渲染父节点,默认渲染到 body 上。Function() => document.body1.5.0

事件

事件名称说明回调参数
afterChangemouseup 触发时机一致,把当前值作为参数传入。Function(value)
change当 Slider 的值发生改变时,会触发 change 事件,并把改变后的值作为参数传入。Function(value)

方法

名称描述
blur()移除焦点
focus()获取焦点