CSS3 transform scale缩放问题

发布于 2022-09-11 17:32:24 字数 1729 浏览 24 评论 0

碰到一个问题,在vue项目中引入animate.css来实现过渡动画,然而出现了一些怪异的问题。
发生的问题如图所示
clipboard.png
该图出现的问题为节点的位置和尺寸都是按比例为1:1时的状态而非当前尺寸和位置

clipboard.png
该图出现的问题真不知道怎么描述,同一份代码不同电脑的谷歌浏览器竟然表现不一致,一台显示正常,另一台出现的问题如图,位置发生了偏移。确认过同一份代码,浏览器都是最新版本的谷歌浏览器

animate.css中起作用的样式为

.rubberBand {
  animation-name: rubberBand;
}
@keyframes rubberBand {
  from { transform: scale3d(1, 1, 1); }
  30% { transform: scale3d(1.25, 0.75, 1); }
  40% { transform: scale3d(0.75, 1.25, 1); }
  50% { transform: scale3d(1.15, 0.85, 1); }
  65% { transform: scale3d(0.95, 1.05, 1); }
  75% { transform: scale3d(1.05, 0.95, 1); }
  to { transform: scale3d(1, 1, 1); }
}
.animated {
  animation-duration: 1s;
  animation-fill-mode: both;
}

项目关键代码为

<svg :width="panelObj.panelWidth" :height="panelObj.panelHeight"`" :viewBox="`${panelObj.viewBoxX} ${panelObj.viewBoxY} ${panelObj.viewBoxWidth} ${panelObj.viewBoxHeight}`" >
  <!-- 绘制节点 -->
  <g v-for="(node,i) in nodesList" :key="i">
    <foreignObject :x="node.x" :y="node.y" :width="node.width" :height="node.height">
      <img class="animated rubberBand" :src="node.img" :width="node.width" :height="node.height"/>
    </foreignObject>
    <!-- 节点的标签 -->
    <text :x="node.x+node.width/2" :y="node.y+node.height">{{node.label}}</text>
  </g>
</svg>

如果依旧采用该方案实现动画需要怎么调整才能使其正常表现

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

篱下浅笙歌 2022-09-18 17:32:24

svg 的元素的transfrom和一般的html元素是有区别的...

可以参考一下张鑫旭的这篇文章
https://www.zhangxinxu.com/wo...

HTML元素的CSS3 transform和SVG的transform坐标系统大相径庭;具体的语法细节有差异。SVG transform属性语法有些自带偏移。而CSS transform则更加纯粹些。
平常我们使用transform其坐标是相对于当前元素而言的,默认是元素的中心点变换,我们可以通过transform-origin属性改变变换的中心点。而SVG中的transform的坐标变换的是相对于画布的左上角计算的,跟HTML的transform差别较大,理解上也更加麻烦。

流星番茄 2022-09-18 17:32:24

试一下transform-origion指定下原点坐标

挽手叙旧 2022-09-18 17:32:24

最近发现问题出现在viewBoxtransform上。
解决方案的方案是避免使用transform,通过别的方式去替换该表现形式,比如用margin+width+height替换scale

@keyframes rubberband {
  from { margin:0; width:100%; height:100%; }
  30% { margin:12.5% 0 0 -12.5%; width:125%; height:75%; }
  40% { margin:-12.5% 0 0 12.5%; width:75%; height: 125%; }
  50% { margin:7.5% 0 0 -7.5%; width:115%; height:85%; }
  65% { margin:-2.5% 0 0 2.5%; width:95%; height:105%; }
  75% { margin:2.5% 0 0 -2.5%; width:105%; height:95%; }
  to { margin:0; width:100%; height:100%; }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文