状态动画与侦听器

通过侦听器我们能监听到任何数值属性的数值更新。可能听起来很抽象,所以让我们先来看看使用 GreenSock 一个例子:

  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js"></script>
  2. <div id="animated-number-demo">
  3. <input v-model.number="number" type="number" step="20">
  4. <p>{{ animatedNumber }}</p>
  5. </div>
  1. new Vue({
  2. el: '#animated-number-demo',
  3. data: {
  4. number: 0,
  5. tweenedNumber: 0
  6. },
  7. computed: {
  8. animatedNumber: function() {
  9. return this.tweenedNumber.toFixed(0);
  10. }
  11. },
  12. watch: {
  13. number: function(newValue) {
  14. TweenLite.to(this.$data, 0.5, { tweenedNumber: newValue });
  15. }
  16. }
  17. })

状态动画与侦听器 - 图1

当你把数值更新时,就会触发动画。这个是一个不错的演示,但是对于不能直接像数字一样存储的值,比如 CSS 中的 color 的值,通过下面的例子我们来通过 Tween.jsColor.js 实现一个例子:

  1. <script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script>
  2. <script src="https://cdn.jsdelivr.net/npm/color-js@1.0.3"></script>
  3. <div id="example-7">
  4. <input
  5. v-model="colorQuery"
  6. v-on:keyup.enter="updateColor"
  7. placeholder="Enter a color"
  8. >
  9. <button v-on:click="updateColor">Update</button>
  10. <p>Preview:</p>
  11. <span
  12. v-bind:style="{ backgroundColor: tweenedCSSColor }"
  13. class="example-7-color-preview"
  14. ></span>
  15. <p>{{ tweenedCSSColor }}</p>
  16. </div>
  1. var Color = net.brehaut.Color
  2. new Vue({
  3. el: '#example-7',
  4. data: {
  5. colorQuery: '',
  6. color: {
  7. red: 0,
  8. green: 0,
  9. blue: 0,
  10. alpha: 1
  11. },
  12. tweenedColor: {}
  13. },
  14. created: function () {
  15. this.tweenedColor = Object.assign({}, this.color)
  16. },
  17. watch: {
  18. color: function () {
  19. function animate () {
  20. if (TWEEN.update()) {
  21. requestAnimationFrame(animate)
  22. }
  23. }
  24. new TWEEN.Tween(this.tweenedColor)
  25. .to(this.color, 750)
  26. .start()
  27. animate()
  28. }
  29. },
  30. computed: {
  31. tweenedCSSColor: function () {
  32. return new Color({
  33. red: this.tweenedColor.red,
  34. green: this.tweenedColor.green,
  35. blue: this.tweenedColor.blue,
  36. alpha: this.tweenedColor.alpha
  37. }).toCSS()
  38. }
  39. },
  40. methods: {
  41. updateColor: function () {
  42. this.color = new Color(this.colorQuery).toRGB()
  43. this.colorQuery = ''
  44. }
  45. }
  46. })
  1. .example-7-color-preview {
  2. display: inline-block;
  3. width: 50px;
  4. height: 50px;
  5. }

状态动画与侦听器 - 图2