diff --git a/docs/en-US/component/slider.md b/docs/en-US/component/slider.md index 31d624a7b1..16a0231370 100644 --- a/docs/en-US/component/slider.md +++ b/docs/en-US/component/slider.md @@ -45,6 +45,16 @@ slider/sizes ::: +## Placement + +You can custom tooltip placement. + +:::demo + +slider/placement + +::: + ## Range selection Selecting a range of values is supported. @@ -73,31 +83,32 @@ slider/show-marks ## Attributes -| Attribute | Description | Type | Accepted Values | Default | -| --------------------- | --------------------------------------------------------------------------------------------------------- | --------------- | ----------------------- | ------- | -| model-value / v-model | binding value | number | — | 0 | -| min | minimum value | number | — | 0 | -| max | maximum value | number | — | 100 | -| disabled | whether Slider is disabled | boolean | — | false | -| step | step size | number | — | 1 | -| show-input | whether to display an input box, works when `range` is false | boolean | — | false | -| show-input-controls | whether to display control buttons when `show-input` is true | boolean | — | true | -| size | size of the slider | string | large / default / small | default | -| input-size | size of the input box, when set `size`, the default is the value of `size` | string | large / default / small | default | -| show-stops | whether to display breakpoints | boolean | — | false | -| show-tooltip | whether to display tooltip value | boolean | — | true | -| format-tooltip | format to display tooltip value | function(value) | — | — | -| range | whether to select a range | boolean | — | false | -| vertical | vertical mode | boolean | — | false | -| height | Slider height, required in vertical mode | string | — | — | -| label | label for screen reader | string | — | — | -| range-start-label | when `range` is true, screen reader label for the start of the range | string | — | — | -| range-end-label | when `range` is true, screen reader label for the end of the range | string | — | — | -| format-value-text | format to display the `aria-valuenow` attribute for screen readers | function(value) | — | — | -| debounce | debounce delay when typing, in milliseconds, works when `show-input` is true | number | — | 300 | -| tooltip-class | custom class name for the tooltip | string | — | — | -| marks | marks, type of key must be `number` and must in closed interval `[min, max]`, each mark can custom style | object | — | — | -| validate-event | whether to trigger form validation | boolean | - | true | +| Attribute | Description | Type | Accepted Values | Default | +| --------------------- | --------------------------------------------------------------------------------------------------------- | --------------- | --------------------------------------------------------------------------------------------------------- | ------- | +| model-value / v-model | binding value | number | — | 0 | +| min | minimum value | number | — | 0 | +| max | maximum value | number | — | 100 | +| disabled | whether Slider is disabled | boolean | — | false | +| step | step size | number | — | 1 | +| show-input | whether to display an input box, works when `range` is false | boolean | — | false | +| show-input-controls | whether to display control buttons when `show-input` is true | boolean | — | true | +| size | size of the slider | string | large / default / small | default | +| input-size | size of the input box, when set `size`, the default is the value of `size` | string | large / default / small | default | +| show-stops | whether to display breakpoints | boolean | — | false | +| show-tooltip | whether to display tooltip value | boolean | — | true | +| format-tooltip | format to display tooltip value | function(value) | — | — | +| range | whether to select a range | boolean | — | false | +| vertical | vertical mode | boolean | — | false | +| height | Slider height, required in vertical mode | string | — | — | +| label | label for screen reader | string | — | — | +| range-start-label | when `range` is true, screen reader label for the start of the range | string | — | — | +| range-end-label | when `range` is true, screen reader label for the end of the range | string | — | — | +| format-value-text | format to display the `aria-valuenow` attribute for screen readers | function(value) | — | — | +| debounce | debounce delay when typing, in milliseconds, works when `show-input` is true | number | — | 300 | +| tooltip-class | custom class name for the tooltip | string | — | — | +| placement | position of Tooltip | string | top/top-start/top-end/bottom/bottom-start/bottom-end/left/left-start/left-end/right/right-start/right-end | top | +| marks | marks, type of key must be `number` and must in closed interval `[min, max]`, each mark can custom style | object | — | — | +| validate-event | whether to trigger form validation | boolean | - | true | ## Events diff --git a/docs/examples/slider/placement.vue b/docs/examples/slider/placement.vue new file mode 100644 index 0000000000..71a9a03f02 --- /dev/null +++ b/docs/examples/slider/placement.vue @@ -0,0 +1,33 @@ + + + + diff --git a/packages/components/slider/__tests__/slider.test.tsx b/packages/components/slider/__tests__/slider.test.tsx index e848092171..34475d565f 100644 --- a/packages/components/slider/__tests__/slider.test.tsx +++ b/packages/components/slider/__tests__/slider.test.tsx @@ -89,6 +89,19 @@ describe('Slider', () => { expect(slider.vm.formatValue).toBe('$0') }) + it('placement', async () => { + const TOOLTIP_CLASS = 'custom_tooltip' + const PLACEMENT = 'right' + + mount(() => ) + + await nextTick() + + expect( + document.querySelector(`.${TOOLTIP_CLASS}`).dataset.popperPlacement + ).toBe(PLACEMENT) + }) + describe('drag', () => { it('horizontal', async () => { vi.useRealTimers() diff --git a/packages/components/slider/src/button.ts b/packages/components/slider/src/button.ts index 28e7f07a36..14c68ca9c4 100644 --- a/packages/components/slider/src/button.ts +++ b/packages/components/slider/src/button.ts @@ -1,3 +1,4 @@ +import { placements } from '@popperjs/core' import { buildProps, isNumber } from '@element-plus/utils' import { UPDATE_MODEL_EVENT } from '@element-plus/constants' import type { ExtractPropTypes, Ref } from 'vue' @@ -10,6 +11,11 @@ export const sliderButtonProps = buildProps({ }, vertical: Boolean, tooltipClass: String, + placement: { + type: String, + values: placements, + default: 'top', + }, } as const) export type SliderButtonProps = ExtractPropTypes diff --git a/packages/components/slider/src/button.vue b/packages/components/slider/src/button.vue index 51028e4d7c..bd330e0ee1 100644 --- a/packages/components/slider/src/button.vue +++ b/packages/components/slider/src/button.vue @@ -15,7 +15,8 @@ (Object), }, diff --git a/packages/components/slider/src/slider.vue b/packages/components/slider/src/slider.vue index 98460cc849..2e14ad26aa 100644 --- a/packages/components/slider/src/slider.vue +++ b/packages/components/slider/src/slider.vue @@ -29,6 +29,7 @@ :model-value="firstValue" :vertical="vertical" :tooltip-class="tooltipClass" + :placement="placement" role="slider" :aria-label=" range || !isLabeledByFormItem ? firstButtonLabel : undefined @@ -50,6 +51,7 @@ :model-value="secondValue" :vertical="vertical" :tooltip-class="tooltipClass" + :placement="placement" role="slider" :aria-label="secondButtonLabel" :aria-valuemin="firstValue"