• vue 过渡状态


    vue的过渡系统提供了非常多简单的方法设置进入、离开和列表的动效。那么对于数据元素本身的动效呢,例:

    • 数字和运算
    • 颜色的显示
    • svg节点的位置
    • 元素的大小和其他的属性

    所有的原始数字都被事先存储起来,可以直接转换到数字。做到这一步,我们就可以结合vue的响应式和组件系统,使用第三方库来实现切换元素的过渡状态。

    状态动画与watcher

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

    <script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script>
     
    <div id="animated-number-demo">
    <input v-model.number="number" type="number" step="20">
    <p>{{ animatedNumber }}</p>
    </div>
     
    new Vue({
    el: '#animated-number-demo',
    data: {
    number: 0,
    animatedNumber: 0
    },
    watch: {
    number: function(newValue, oldValue) {
    var vm = this
    function animate () {
    if (TWEEN.update()) {
    requestAnimationFrame(animate)
    }
    }
     
    new TWEEN.Tween({ tweeningNumber: oldValue })
    .easing(TWEEN.Easing.Quadratic.Out)
    .to({ tweeningNumber: newValue }, 500)
    .onUpdate(function () {
    vm.animatedNumber = this.tweeningNumber.toFixed(0)
    })
    .start()
     
    animate()
    }
    }
    })
    当你把数值更新时,就会发出动画。这个是一个不错的演示,但是对于不能直接像数字一样存储的值,比如css中的color的值。
    通过下面的例子我们来通过color.js实现一个例子:
    <script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script>
    <script src="https://cdn.jsdelivr.net/npm/color-js@1.0.3"></script>
     
    <div id="example-7">
    <input
    v-model="colorQuery"
    v-on:keyup.enter="updateColor"
    placeholder="Enter a color"
    >
    <button v-on:click="updateColor">Update</button>
    <p>Preview:</p>
    <span
    v-bind:style="{ backgroundColor: tweenedCSSColor }"
    class="example-7-color-preview"
    ></span>
    <p>{{ tweenedCSSColor }}</p>
    </div>
     
    动态状态转换
    就像vue的过渡组件一样,数据背后状态转换会时时更新,这对于原型设计非常有用。当你修改一些变量,即使是一个简单的svg多边形也可以实现很多难以想象的效果。
     
    通过组件组织过渡
    管理太多的状态转换会很快的增加vue实例或者组件的复杂性,幸好很多的动画可以提取到专用的子组件。
    我们将之前的示例改写一下:
    <script src="https://cdn.jsdelivr.net/npm/tween.js@16.3.4"></script>
     
    <div id="example-8">
    <input v-model.number="firstNumber" type="number" step="20"> +
    <input v-model.number="secondNumber" type="number" step="20"> =
    {{ result }}
    <p>
    <animated-integer v-bind:value="firstNumber"></animated-integer> +
    <animated-integer v-bind:value="secondNumber"></animated-integer> =
    <animated-integer v-bind:value="result"></animated-integer>
    </p>
    </div>
     
    // 这种复杂的补间动画逻辑可以被复用
    // 任何整数都可以执行动画
    // 组件化使我们的界面十分清晰
    // 可以支持更多更复杂的动态过渡
    // strategies.
    Vue.component('animated-integer', {
    template: '<span>{{ tweeningValue }}</span>',
    props: {
    value: {
    type: Number,
    required: true
    }
    },
    data: function () {
    return {
    tweeningValue: 0
    }
    },
    watch: {
    value: function (newValue, oldValue) {
    this.tween(oldValue, newValue)
    }
    },
    mounted: function () {
    this.tween(0, this.value)
    },
    methods: {
    tween: function (startValue, endValue) {
    var vm = this
    function animate () {
    if (TWEEN.update()) {
    requestAnimationFrame(animate)
    }
    }
     
    new TWEEN.Tween({ tweeningValue: startValue })
    .to({ tweeningValue: endValue }, 500)
    .onUpdate(function () {
    vm.tweeningValue = this.tweeningValue.toFixed(0)
    })
    .start()
     
    animate()
    }
    }
    })
     
    // All complexity has now been removed from the main Vue instance!
    new Vue({
    el: '#example-8',
    data: {
    firstNumber: 20,
    secondNumber: 40
    },
    computed: {
    result: function () {
    return this.firstNumber + this.secondNumber
    }
    }
    })
     
    我们能在组件中结合使用这一节讲到各种过渡策略和vue内建的过渡系统。总之,对于完成各种过渡动效几乎没有阻碍。
     
    赋予设计声明
    只要一个动画,就可以带来生命。不幸的是,当设计师创建图标、logo 和吉祥物的时候,他们交付的通常都是图片或静态的 SVG。所以,虽然 GitHub 的章鱼猫、Twitter 的小鸟以及其它许多 logo 类似于生灵,它们看上去实际上并不是活着的。
    vue可以帮到你,因为svg的本质是数据,我们只需要这些动物兴奋,思考和境界的样例
    然后vue就可以辅助完成这几种状态之间的过渡动画,来制作你的欢迎页面,加载指示,以及更加带有情感的提示。
     
  • 相关阅读:
    elasticsearch query 和 filter 的区别
    java 模拟简单搜索
    filterBuilders 构建过滤器query
    elasticsearch java 索引操作
    lesson4:利用jmeter来压测数据库
    lesson3:使用java代码的方式对不能识别的协议进行压力测试
    lession2:使用HTTP Cookie 管理器来传递cookies值
    lesson1:压测普通网页
    php mysql find_in_set函数 检索单子段 逗号分隔序列
    写出一种排序算法(要写出代码),并说出优化它的方法。(新浪面试题)
  • 原文地址:https://www.cnblogs.com/susanws/p/7422229.html
Copyright © 2020-2023  润新知