You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PixiJS如何通过容器包装Sprite实现两个互不冲突的旋转动画

实现方案

PixiJS 中 PIXI.Container 就是和 HTML div 功能一致的容器元素,你可以通过嵌套容器+Sprite的方式实现两个独立旋转动画,和HTML的父子元素嵌套逻辑完全一致。

关键修改步骤

  • 新建PIXI.Container实例作为wrapper父容器
  • 把Sprite原本的定位参数转移给wrapper,Sprite自身在容器内居中
  • 将Sprite添加到wrapper中,再把wrapper添加到舞台
  • 两个旋转动画分别绑定给wrapper和Sprite,两者的旋转属性独立不会互相覆盖

完整可运行代码

JavaScript

console.clear()
let app = new PIXI.Application({
  width: window.innerWidth,
  height: window.innerHeight,
  backgroundAlpha: 0,
  view: document.querySelector("#app"),
  antialias: true,
  autoDensity: true
});

let texture = PIXI.Texture.from("https://picsum.photos/200/100")
// 创建wrapper容器
const wrapper = new PIXI.Container()
// 把原本给sprite的定位挪给wrapper
wrapper.x = 200
wrapper.y = 100

let element = new PIXI.Sprite(texture);
element.anchor.set(0.5);
// sprite在容器内居中
element.x = 0
element.y = 0

// 嵌套结构:wrapper -> sprite,再把wrapper加到舞台
wrapper.addChild(element)
app.stage.addChild(wrapper)

// 两个动画分别绑定不同对象,不会冲突
// 无限360度旋转加给父容器
const tl = gsap.timeline({repeat: -1})
tl.to(wrapper, {angle: 360, duration: 2, ease: "none"})

// 小幅度来回摆动加给子Sprite
const tl2 = gsap.timeline({repeat: -1, yoyo: true})
tl2.fromTo(element, {angle: -10}, {angle: 10, duration: 0.5, ease: "sine.inOut"})

CSS

* {
  padding: 0;
  margin: 0;
}

#app {
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  width: 100%;
  height: 100%;
}

HTML

<script src="https://pixijs.download/release/pixi.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/gsap.min.js"></script>
<canvas id="app"></canvas>

你也可以根据需求调整两个动画的绑定对象,把360度旋转加给Sprite、摆动加给wrapper也可以,两者的旋转效果是叠加的,最终表现一致。

内容的提问来源于stack exchange,提问作者Greg--

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:36:07