fix: 旋转后的元素执行动画异常

This commit is contained in:
pipipi-pikachu 2021-04-09 12:44:11 +08:00
parent 48660ed8ec
commit 5b9b117fcb
6 changed files with 213 additions and 170 deletions

View File

@ -9,28 +9,33 @@
transform: `rotate(${elementInfo.rotate}deg)`, transform: `rotate(${elementInfo.rotate}deg)`,
}" }"
> >
<div <div
class="element-content" class="rotate-wrapper"
:style="{ :style="{ transform: `rotate(${elementInfo.rotate}deg)` }"
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
> >
<ImageOutline :elementInfo="elementInfo" /> <div
class="element-content"
:style="{
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
>
<ImageOutline :elementInfo="elementInfo" />
<div class="image-content" :style="{ clipPath: clipShape.style }"> <div class="image-content" :style="{ clipPath: clipShape.style }">
<img <img
:src="elementInfo.src" :src="elementInfo.src"
:draggable="false" :draggable="false"
:style="{ :style="{
top: imgPosition.top, top: imgPosition.top,
left: imgPosition.left, left: imgPosition.left,
width: imgPosition.width, width: imgPosition.width,
height: imgPosition.height, height: imgPosition.height,
filter: filter, filter: filter,
}" }"
alt="" alt=""
/> />
</div>
</div> </div>
</div> </div>
</div> </div>
@ -85,7 +90,10 @@ export default defineComponent({
.base-element-image { .base-element-image {
position: absolute; position: absolute;
} }
.rotate-wrapper {
width: 100%;
height: 100%;
}
.element-content { .element-content {
width: 100%; width: 100%;
height: 100%; height: 100%;

View File

@ -7,46 +7,50 @@
left: elementInfo.left + 'px', left: elementInfo.left + 'px',
width: elementInfo.width + 'px', width: elementInfo.width + 'px',
height: elementInfo.height + 'px', height: elementInfo.height + 'px',
transform: `rotate(${elementInfo.rotate}deg)`,
}" }"
@mousedown="$event => handleSelectElement($event)" @mousedown="$event => handleSelectElement($event)"
> >
<ImageClipHandler <div
v-if="isCliping" class="rotate-wrapper"
:src="elementInfo.src" :style="{ transform: `rotate(${elementInfo.rotate}deg)` }"
:clipData="elementInfo.clip"
:width="elementInfo.width"
:height="elementInfo.height"
:top="elementInfo.top"
:left="elementInfo.left"
:clipPath="clipShape.style"
@clip="range => handleClip(range)"
/>
<div
class="element-content"
v-else
v-contextmenu="contextmenus"
:style="{
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
> >
<ImageOutline :elementInfo="elementInfo" /> <ImageClipHandler
v-if="isCliping"
:src="elementInfo.src"
:clipData="elementInfo.clip"
:width="elementInfo.width"
:height="elementInfo.height"
:top="elementInfo.top"
:left="elementInfo.left"
:clipPath="clipShape.style"
@clip="range => handleClip(range)"
/>
<div
class="element-content"
v-else
v-contextmenu="contextmenus"
:style="{
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
>
<ImageOutline :elementInfo="elementInfo" />
<div class="image-content" :style="{ clipPath: clipShape.style }"> <div class="image-content" :style="{ clipPath: clipShape.style }">
<img <img
:src="elementInfo.src" :src="elementInfo.src"
:draggable="false" :draggable="false"
:style="{ :style="{
top: imgPosition.top, top: imgPosition.top,
left: imgPosition.left, left: imgPosition.left,
width: imgPosition.width, width: imgPosition.width,
height: imgPosition.height, height: imgPosition.height,
filter: filter, filter: filter,
}" }"
@dragstart.prevent @dragstart.prevent
alt="" alt=""
/> />
</div>
</div> </div>
</div> </div>
</div> </div>
@ -149,7 +153,10 @@ export default defineComponent({
cursor: default; cursor: default;
} }
} }
.rotate-wrapper {
width: 100%;
height: 100%;
}
.element-content { .element-content {
width: 100%; width: 100%;
height: 100%; height: 100%;

View File

@ -6,47 +6,51 @@
left: elementInfo.left + 'px', left: elementInfo.left + 'px',
width: elementInfo.width + 'px', width: elementInfo.width + 'px',
height: elementInfo.height + 'px', height: elementInfo.height + 'px',
transform: `rotate(${elementInfo.rotate}deg)`,
}" }"
> >
<div <div
class="element-content" class="rotate-wrapper"
:style="{ :style="{ transform: `rotate(${elementInfo.rotate}deg)` }"
opacity: elementInfo.opacity,
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
> >
<SvgWrapper <div
overflow="visible" class="element-content"
:width="elementInfo.width" :style="{
:height="elementInfo.height" opacity: elementInfo.opacity,
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
> >
<defs v-if="elementInfo.gradient"> <SvgWrapper
<GradientDefs overflow="visible"
:id="`base-gradient-${elementInfo.id}`" :width="elementInfo.width"
:type="elementInfo.gradient.type" :height="elementInfo.height"
:color1="elementInfo.gradient.color[0]"
:color2="elementInfo.gradient.color[1]"
:rotate="elementInfo.gradient.rotate"
/>
</defs>
<g
:transform="`scale(${elementInfo.width / elementInfo.viewBox}, ${elementInfo.height / elementInfo.viewBox}) translate(0,0) matrix(1,0,0,1,0,0)`"
> >
<path <defs v-if="elementInfo.gradient">
vector-effect="non-scaling-stroke" <GradientDefs
stroke-linecap="butt" :id="`base-gradient-${elementInfo.id}`"
stroke-miterlimit="8" :type="elementInfo.gradient.type"
stroke-linejoin="" :color1="elementInfo.gradient.color[0]"
:d="elementInfo.path" :color2="elementInfo.gradient.color[1]"
:fill="elementInfo.gradient ? `url(#base-gradient-${elementInfo.id})` : elementInfo.fill" :rotate="elementInfo.gradient.rotate"
:stroke="outlineColor" />
:stroke-width="outlineWidth" </defs>
:stroke-dasharray="outlineStyle === 'dashed' ? '10 5' : '0 0'" <g
></path> :transform="`scale(${elementInfo.width / elementInfo.viewBox}, ${elementInfo.height / elementInfo.viewBox}) translate(0,0) matrix(1,0,0,1,0,0)`"
</g> >
</SvgWrapper> <path
vector-effect="non-scaling-stroke"
stroke-linecap="butt"
stroke-miterlimit="8"
stroke-linejoin=""
:d="elementInfo.path"
:fill="elementInfo.gradient ? `url(#base-gradient-${elementInfo.id})` : elementInfo.fill"
:stroke="outlineColor"
:stroke-width="outlineWidth"
:stroke-dasharray="outlineStyle === 'dashed' ? '10 5' : '0 0'"
></path>
</g>
</SvgWrapper>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -96,7 +100,10 @@ export default defineComponent({
.base-element-shape { .base-element-shape {
position: absolute; position: absolute;
} }
.rotate-wrapper {
width: 100%;
height: 100%;
}
.element-content { .element-content {
width: 100%; width: 100%;
height: 100%; height: 100%;

View File

@ -7,49 +7,53 @@
left: elementInfo.left + 'px', left: elementInfo.left + 'px',
width: elementInfo.width + 'px', width: elementInfo.width + 'px',
height: elementInfo.height + 'px', height: elementInfo.height + 'px',
transform: `rotate(${elementInfo.rotate}deg)`,
}" }"
@mousedown="$event => handleSelectElement($event)" @mousedown="$event => handleSelectElement($event)"
> >
<div <div
class="element-content" class="rotate-wrapper"
v-contextmenu="contextmenus" :style="{ transform: `rotate(${elementInfo.rotate}deg)` }"
:style="{
opacity: elementInfo.opacity,
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
> >
<SvgWrapper <div
overflow="visible" class="element-content"
:width="elementInfo.width" v-contextmenu="contextmenus"
:height="elementInfo.height" :style="{
opacity: elementInfo.opacity,
filter: shadowStyle ? `drop-shadow(${shadowStyle})` : '',
transform: flipStyle,
}"
> >
<defs v-if="elementInfo.gradient"> <SvgWrapper
<GradientDefs overflow="visible"
:id="`editabel-gradient-${elementInfo.id}`" :width="elementInfo.width"
:type="elementInfo.gradient.type" :height="elementInfo.height"
:color1="elementInfo.gradient.color[0]"
:color2="elementInfo.gradient.color[1]"
:rotate="elementInfo.gradient.rotate"
/>
</defs>
<g
:transform="`scale(${elementInfo.width / elementInfo.viewBox}, ${elementInfo.height / elementInfo.viewBox}) translate(0,0) matrix(1,0,0,1,0,0)`"
> >
<path <defs v-if="elementInfo.gradient">
vector-effect="non-scaling-stroke" <GradientDefs
stroke-linecap="butt" :id="`editabel-gradient-${elementInfo.id}`"
stroke-miterlimit="8" :type="elementInfo.gradient.type"
stroke-linejoin="" :color1="elementInfo.gradient.color[0]"
:d="elementInfo.path" :color2="elementInfo.gradient.color[1]"
:fill="elementInfo.gradient ? `url(#editabel-gradient-${elementInfo.id})` : elementInfo.fill" :rotate="elementInfo.gradient.rotate"
:stroke="outlineColor" />
:stroke-width="outlineWidth" </defs>
:stroke-dasharray="outlineStyle === 'dashed' ? '10 6' : '0 0'" <g
></path> :transform="`scale(${elementInfo.width / elementInfo.viewBox}, ${elementInfo.height / elementInfo.viewBox}) translate(0,0) matrix(1,0,0,1,0,0)`"
</g> >
</SvgWrapper> <path
vector-effect="non-scaling-stroke"
stroke-linecap="butt"
stroke-miterlimit="8"
stroke-linejoin=""
:d="elementInfo.path"
:fill="elementInfo.gradient ? `url(#editabel-gradient-${elementInfo.id})` : elementInfo.fill"
:stroke="outlineColor"
:stroke-width="outlineWidth"
:stroke-dasharray="outlineStyle === 'dashed' ? '10 6' : '0 0'"
></path>
</g>
</SvgWrapper>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -120,7 +124,10 @@ export default defineComponent({
cursor: default; cursor: default;
} }
} }
.rotate-wrapper {
width: 100%;
height: 100%;
}
.element-content { .element-content {
width: 100%; width: 100%;
height: 100%; height: 100%;

View File

@ -5,25 +5,29 @@
top: elementInfo.top + 'px', top: elementInfo.top + 'px',
left: elementInfo.left + 'px', left: elementInfo.left + 'px',
width: elementInfo.width + 'px', width: elementInfo.width + 'px',
transform: `rotate(${elementInfo.rotate}deg)`,
}" }"
> >
<div <div
class="element-content" class="rotate-wrapper"
:style="{ :style="{ transform: `rotate(${elementInfo.rotate}deg)` }"
backgroundColor: elementInfo.fill,
opacity: elementInfo.opacity,
textShadow: shadowStyle,
lineHeight: elementInfo.lineHeight,
letterSpacing: (elementInfo.wordSpace || 0) + 'px',
}"
> >
<ElementOutline <div
:width="elementInfo.width" class="element-content"
:height="elementInfo.height" :style="{
:outline="elementInfo.outline" backgroundColor: elementInfo.fill,
/> opacity: elementInfo.opacity,
<div class="text ProseMirror-static" v-html="elementInfo.content"></div> textShadow: shadowStyle,
lineHeight: elementInfo.lineHeight,
letterSpacing: (elementInfo.wordSpace || 0) + 'px',
}"
>
<ElementOutline
:width="elementInfo.width"
:height="elementInfo.height"
:outline="elementInfo.outline"
/>
<div class="text ProseMirror-static" v-html="elementInfo.content"></div>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -61,7 +65,10 @@ export default defineComponent({
.base-element-text { .base-element-text {
position: absolute; position: absolute;
} }
.rotate-wrapper {
width: 100%;
height: 100%;
}
.element-content { .element-content {
position: relative; position: relative;
padding: 10px; padding: 10px;

View File

@ -7,31 +7,35 @@
top: elementInfo.top + 'px', top: elementInfo.top + 'px',
left: elementInfo.left + 'px', left: elementInfo.left + 'px',
width: elementInfo.width + 'px', width: elementInfo.width + 'px',
transform: `rotate(${elementInfo.rotate}deg)`,
}" }"
@mousedown="$event => handleSelectElement($event)" @mousedown="$event => handleSelectElement($event)"
> >
<div <div
class="element-content" class="rotate-wrapper"
:style="{ :style="{ transform: `rotate(${elementInfo.rotate}deg)` }"
backgroundColor: elementInfo.fill,
opacity: elementInfo.opacity,
textShadow: shadowStyle,
lineHeight: elementInfo.lineHeight,
letterSpacing: (elementInfo.wordSpace || 0) + 'px',
}"
v-contextmenu="contextmenus"
> >
<ElementOutline
:width="elementInfo.width"
:height="elementInfo.height"
:outline="elementInfo.outline"
/>
<div <div
class="text" class="element-content"
ref="editorViewRef" :style="{
@mousedown="$event => handleSelectElement($event, false)" backgroundColor: elementInfo.fill,
></div> opacity: elementInfo.opacity,
textShadow: shadowStyle,
lineHeight: elementInfo.lineHeight,
letterSpacing: (elementInfo.wordSpace || 0) + 'px',
}"
v-contextmenu="contextmenus"
>
<ElementOutline
:width="elementInfo.width"
:height="elementInfo.height"
:outline="elementInfo.outline"
/>
<div
class="text"
ref="editorViewRef"
@mousedown="$event => handleSelectElement($event, false)"
></div>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -325,7 +329,10 @@ export default defineComponent({
cursor: default; cursor: default;
} }
} }
.rotate-wrapper {
width: 100%;
height: 100%;
}
.element-content { .element-content {
position: relative; position: relative;
padding: 10px; padding: 10px;