• 状态动画与侦听器

    状态动画与侦听器

    通过侦听器我们能监听到任何数值属性的数值更新。可能听起来很抽象,所以让我们先来看看使用 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.js 和 Color.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