From 52e2142434dd422a47a76190c413fc8198ecd30f Mon Sep 17 00:00:00 2001 From: pipipi-pikachu Date: Sat, 16 Jul 2022 21:13:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=9D=80=E8=89=B2=EF=BC=88=E8=92=99=E7=89=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/slides.ts | 13 +++ .../ElementStylePanel/ImageStylePanel.vue | 5 +- .../Toolbar/common/ElementColorMask.vue | 100 ++++++++++++++++++ .../element/ImageElement/BaseImageElement.vue | 14 +++ .../components/element/ImageElement/index.vue | 14 +++ 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 src/views/Editor/Toolbar/common/ElementColorMask.vue diff --git a/src/types/slides.ts b/src/types/slides.ts index a53277c9..a8471f44 100644 --- a/src/types/slides.ts +++ b/src/types/slides.ts @@ -211,6 +211,18 @@ export interface ImageElementClip { shape: string } +/** + * 图片蒙版 + * + * color: 蒙版颜色 + * + * opacity: 蒙版透明度 + */ +export interface ImageColorElementMask { + color: string + opacity: number +} + /** * 图片元素 * @@ -242,6 +254,7 @@ export interface PPTImageElement extends PPTBaseElement { flipH?: boolean flipV?: boolean shadow?: PPTElementShadow + colorMask?: ImageColorElementMask } diff --git a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue index 6c3adc11..423ee8ed 100644 --- a/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue +++ b/src/views/Editor/Toolbar/ElementStylePanel/ImageStylePanel.vue @@ -41,6 +41,8 @@ + + @@ -70,6 +72,7 @@ import ElementOutline from '../common/ElementOutline.vue' import ElementShadow from '../common/ElementShadow.vue' import ElementFlip from '../common/ElementFlip.vue' import ElementFilter from '../common/ElementFilter.vue' +import ElementColorMask from '../common/ElementColorMask.vue' const shapeClipPathOptions = CLIPPATHS const ratioClipOptions = [ @@ -235,7 +238,7 @@ const resetImage = () => { slidesStore.removeElementProps({ id: handleElementId.value, - propName: ['clip', 'outline', 'flip', 'shadow', 'filters'], + propName: ['clip', 'outline', 'flip', 'shadow', 'filters', 'colorMask'], }) addHistorySnapshot() } diff --git a/src/views/Editor/Toolbar/common/ElementColorMask.vue b/src/views/Editor/Toolbar/common/ElementColorMask.vue new file mode 100644 index 00000000..0030290c --- /dev/null +++ b/src/views/Editor/Toolbar/common/ElementColorMask.vue @@ -0,0 +1,100 @@ + + + + + \ No newline at end of file diff --git a/src/views/components/element/ImageElement/BaseImageElement.vue b/src/views/components/element/ImageElement/BaseImageElement.vue index 78c44f84..94ff89ee 100644 --- a/src/views/components/element/ImageElement/BaseImageElement.vue +++ b/src/views/components/element/ImageElement/BaseImageElement.vue @@ -34,6 +34,13 @@ }" alt="" /> +
@@ -95,4 +102,11 @@ const { filter } = useFilter(filters) position: absolute; } } +.color-mask { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} diff --git a/src/views/components/element/ImageElement/index.vue b/src/views/components/element/ImageElement/index.vue index 409b61eb..1b7fdbc4 100644 --- a/src/views/components/element/ImageElement/index.vue +++ b/src/views/components/element/ImageElement/index.vue @@ -52,6 +52,13 @@ @dragstart.prevent alt="" /> +
@@ -185,4 +192,11 @@ const handleClip = (data: ImageClipedEmitData | null) => { position: absolute; } } +.color-mask { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +}