diff --git a/examples/sites/demos/apis/color-picker.js b/examples/sites/demos/apis/color-picker.js index 88f89d07ac..dc6be1c4bd 100644 --- a/examples/sites/demos/apis/color-picker.js +++ b/examples/sites/demos/apis/color-picker.js @@ -119,6 +119,20 @@ export default { meta: { stable: '3.27.0' } + }, + { + name: 'placement', + type: 'top | bottom', + defaultValue: 'bottom', + desc: { + 'zh-CN': '定义颜色选择器的弹出位置', + 'en-US': 'Define the pop-up position of the color selector' + }, + mode: ['pc'], + pcDemo: 'placement', + meta: { + stable: '3.30.0' + } } ], events: [ diff --git a/examples/sites/demos/pc/app/color-picker/placement.spec.ts b/examples/sites/demos/pc/app/color-picker/placement.spec.ts new file mode 100644 index 0000000000..4d9c835206 --- /dev/null +++ b/examples/sites/demos/pc/app/color-picker/placement.spec.ts @@ -0,0 +1,11 @@ +import { test, expect } from '@playwright/test' + + +test('placement', async ({ page }) => { + // 测试 + page.on('pageerror', (exception) => expect(exception).toBeNull()) + await page.locator('#placement').selectOption('top') + await expect(page.locator('.t-color-picker__panel')).toHaveCSS('top', '0px') + await page.locator('#placement').selectOption('bottom') + await expect(page.locator('.t-color-picker__panel')).toHaveCSS('top', 'auto') +}) \ No newline at end of file diff --git a/examples/sites/demos/pc/app/color-picker/placement.vue b/examples/sites/demos/pc/app/color-picker/placement.vue new file mode 100644 index 0000000000..56bc5203a9 --- /dev/null +++ b/examples/sites/demos/pc/app/color-picker/placement.vue @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/examples/sites/demos/pc/app/color-picker/webdoc/color-picker.js b/examples/sites/demos/pc/app/color-picker/webdoc/color-picker.js index 88a17e82b5..d93f0cd9e3 100644 --- a/examples/sites/demos/pc/app/color-picker/webdoc/color-picker.js +++ b/examples/sites/demos/pc/app/color-picker/webdoc/color-picker.js @@ -241,6 +241,19 @@ export default { }, apis: ['color-mode'], demos: ['color-mode'] + }, + { + id: 'placement', + name: '显示位置', + support: { + value: true + }, + description: '通过 placement 属性来定义颜色选择器的显示位置', + cloud: { + value: false + }, + apis: ['placement'], + demos: ['placement'] } ] } diff --git a/packages/renderless/src/color-picker/vue.ts b/packages/renderless/src/color-picker/vue.ts index 6d5bc4dc8b..a2fa353d3b 100644 --- a/packages/renderless/src/color-picker/vue.ts +++ b/packages/renderless/src/color-picker/vue.ts @@ -63,11 +63,17 @@ export const renderless = (props, ctx: ISharedRenderlessParamHooks, { emit }: IS ) const changeVisible = toggleVisible(isShow) const { onConfirm, onCancel } = useEvent(state, emit, changeVisible, color) + + // 根据 placement 决定动画方向 + const transitionName = () => { + return props.placement === 'top' ? 'tiny-zoom-in-bottom' : 'tiny-zoom-in-top' + } const api = { state, changeVisible, onConfirm, - onCancel + onCancel, + transitionName } return api } diff --git a/packages/theme/src/color-picker/index.less b/packages/theme/src/color-picker/index.less index 3534ee0f50..fc5db22c48 100644 --- a/packages/theme/src/color-picker/index.less +++ b/packages/theme/src/color-picker/index.less @@ -66,4 +66,20 @@ &--mini &__inner { border-radius: 2px; } + + &__dropdown { + position: absolute; + } + + &__dropdown--bottom { + top: 100%; + left: 0; + margin-top: 8px; + } + + &__dropdown--top { + bottom: 100%; + left: 0; + margin-bottom: 8px; + } } diff --git a/packages/vue/src/color-picker/src/index.ts b/packages/vue/src/color-picker/src/index.ts index 11b5468cac..6f389d7327 100644 --- a/packages/vue/src/color-picker/src/index.ts +++ b/packages/vue/src/color-picker/src/index.ts @@ -52,6 +52,13 @@ export default defineComponent({ validator(val: string) { return ['monochrome', 'linear-gradient'].includes(val) } + }, + placement:{ + type: String, + default: 'bottom', + validator(val: string) { + return ['top', 'bottom'].includes(val) + } } }, setup(props, context) { diff --git a/packages/vue/src/color-picker/src/pc.vue b/packages/vue/src/color-picker/src/pc.vue index 11171c214c..35e01fcb03 100644 --- a/packages/vue/src/color-picker/src/pc.vue +++ b/packages/vue/src/color-picker/src/pc.vue @@ -1,50 +1,53 @@ changeVisible(!state.isShow)" > - - + + + + + + - + + \ No newline at end of file