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"