首頁 >web前端 >js教程 >JS實作拋物線動畫的程式碼實例

JS實作拋物線動畫的程式碼實例

小云云
小云云原創
2018-03-02 14:06:231648瀏覽

在做小程式的專案中,需要在增加購物車的時候,增加拋物線小球動畫。

分析

這種不固定起始位置的動畫,自然不能用gif 圖,所以只能用原生程式碼實作

那我們有什麼工具來實作動畫呢?

  • 小程式提供了JS API createAnimation 來建立動畫

  • CSS transition

工具有了,我們再看一下什麼是拋物線。

這裡我們只討論水平拋物線,水平拋物線從數學原理上來說就是【水平勻速、垂直加速的運動】,轉換成代碼層面就是在動畫效果 timingFunction 中,水平動畫採用 linear ,垂直動畫採用ease-in

所以我們需要把這個拋物線動畫分解成 兩個 同時 進行但 不同動畫效果 的動畫。

實作

(一)小程式的實作

JS:

cartAnimation(x, y) { // x y 为手指点击的坐标,即球的起始坐标
    let self = this,
        cartY = app.globalData.winHeight - 50, // 结束位置(购物车图片)纵坐标
        cartX = 50, // 结束位置(购物车图片)的横坐标
        animationX = flyX(cartX, x), // 创建球的横向动画
        animationY = flyY(cartY, y) // 创建球的纵向动画
    this.setData({          ballX: x,          ballY: y,          showBall: true
    })
    setTimeoutES6(100).then(() => { // 100 ms 延时,确保球已经到位并显示
        self.setData({            animationX: animationX.export(),            animationY: animationY.export(),
        })        return setTimeoutES6(400) // 400 ms 是球的抛物线动画时长
    }).then(() => { // 400 ms 延时后隐藏球
        this.setData({            showBall: false,
        })
    })
}function setTimeoutES6(sec) { // Promise 化 setTimeout
    return new Promise((resolve, reject) => {
        setTimeout(() => {resolve()}, sec)
    })
}function flyX(cartX, oriX) { // 水平动画
    let animation = wx.createAnimation({        duration: 400,        timingFunction: 'linear',
    })
    animation.left(cartX).step()    return animation
}function flyY(cartY, oriY) { // 垂直动画
    let animation = wx.createAnimation({        duration: 400,        timingFunction: 'ease-in',
    })
    animation.top(cartY).step()    return animation
}

HTML:

<view>
    <view></view></view>

translate 最佳化

#就我所知,用 transform: translate() 來實現的動畫會比top & left 效能更優,但實作下來卻沒那麼容易咯。

研究來研究去,發現translate 的做法比top & left 的做法多了一步,就是需要將小球的 translate 位移還原(否則translate 一直有值),才能保證下一次的位移從點擊的位置開始

cartAnimation(x, y) {    let self = this,
        cartY = app.globalData.winHeight - 50,
        cartX = 50,
        animationX = flyX(cartX, x),
        animationY = flyY(cartY, y)    this.setData({        leftNum: x,        topNum: y,        showBall: true
    })
    setTimeoutES6(100).then(() => {
        self.setData({            animationDataX: animationX.export(),            animationDataY: animationY.export(),
        })        return setTimeoutES6(400)
    }).then(() => {        this.setData({            showBall: false,            animationX: flyX(0, 0, 0).export(), // 还原小球位置,即 translate 恢复默认值
            animationY: flyY(0, 0, 0).export(),
        })
    })
}function flyX(cartX,oriX,duration) {    let animation = wx.createAnimation({        duration: duration||400,        timingFunction: 'linear',
    })
    animation.translateX(cartX-oriX).step()    return animation
}function flyY(cartY,oriY,duration) {    let animation = wx.createAnimation({        duration: duration||400,        timingFunction: 'ease-in',
    })
    animation.translateY(cartY-oriY).step()    return animation
}

HTML 部分不變

(二)H5 的實作

除了小程式之外,前端日常開發更多的當然還是H5,下面我將會以CSS3 transition 的方法來實作

nbsp;html>
    <meta>
    <meta>
    <style>
        * {            padding: 0;            margin: 0;
        }        #ball {            width:12px;            height:12px;            background: #5EA345;            border-radius: 50%;            position: fixed;            transition: left 1s linear, top 1s ease-in;
        }    </style>
    <title>CSS3 水平抛物线动画</title>
    <p></p><script>
    var $ball = document.getElementById(&#39;ball&#39;);    document.body.onclick = function (evt) {        console.log(evt.pageX,evt.pageY)
        $ball.style.top = evt.pageY+&#39;px&#39;;
        $ball.style.left = evt.pageX+&#39;px&#39;;
        $ball.style.transition = &#39;left 0s, top 0s&#39;;
        setTimeout(()=>{
            $ball.style.top = window.innerHeight+&#39;px&#39;;
            $ball.style.left = &#39;0px&#39;;
            $ball.style.transition = &#39;left 1s linear, top 1s ease-in&#39;;
        }, 20)
    }</script>

相關推薦:

JS拋物線動畫操作實例分享

關於html5中圖片拋物線運動技巧分享

JavaScript中彈性勢能動畫之關於拋物線運動的程式碼案例

以上是JS實作拋物線動畫的程式碼實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn