JS에서 포물선 애니메이션을 구현하기 위한 코드 예제

小云云
풀어 주다: 2018-03-02 14:06:23
원래의
1480명이 탐색했습니다.

소규모 프로그램 프로젝트에서는 장바구니를 추가할 때 포물선 공 애니메이션을 추가해야 합니다.

분석

시작 위치가 고정되지 않은 이런 애니메이션은 당연히 gif 이미지를 사용할 수 없기 때문에 네이티브 코드로만 구현할 수 있습니다

그럼 애니메이션을 구현하려면 어떤 도구가 필요한가요?

  • 애플릿은 JS API createAnimation을 제공하여 애니메이션을 생성합니다.

  • CSS 전환

이제 도구를 사용할 수 있으므로 포물선이 무엇인지 살펴보겠습니다.

여기서는 수평 포물선에 대해서만 논의합니다. 수학적 원리에서 수평 포물선은 [일정한 수평 속도 및 수직 가속도를 갖는 움직임]입니다. 코드 레벨로의 변환은 애니메이션 효과 timingFunction에 있습니다. 수직 애니메이션은 이즈인을 사용합니다

그래서 우리는 이 포물선 애니메이션을 동시에 수행되지만 애니메이션 효과가 다른 두 개의 애니메이션으로 분해해야 합니다.

Implementation

(1) 미니 프로그램 구현

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 animation="{{animationY}}" style="position:fixed;top:{{ballY}}px;" hidden="{{!showBall}}">
    <view class="ball" animation="{{animationX}}" style="position:fixed;left:{{ballX}}px;"></view></view>
로그인 후 복사

translate Optimization

내가 아는 한,Transform:translate()을 사용하여 구현한 애니메이션은 top & left보다 성능이 더 좋을 것입니다. 훌륭하지만 구현하기가 쉽지 않습니다.

연구하고 조사한 결과 번역 방법이 위쪽 및 왼쪽 방법보다 한 단계 더 높다는 것을 발견했습니다. 즉, 공의 번역 변위를 복원해야 합니다(그렇지 않으면 번역이 항상 값을 갖습니다). 다음 변위는 클릭한 위치부터 시작됩니다

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 부분은 그대로 유지됩니다

(2) H5 구현

작은 프로그램 외에도 일상적인 프론트 엔드 개발은 물론 여전히 H5입니다. 아래에서는 CSS3 전환 방법을 사용하겠습니다. 구현하려면

<!DOCTYPE html><html lang="en" style="width:100%;height:100%;"><head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <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></head><body style="width:100%;height:100%;">
    <p id="ball"></p></body><script>
    var $ball = document.getElementById('ball');    document.body.onclick = function (evt) {        console.log(evt.pageX,evt.pageY)
        $ball.style.top = evt.pageY+'px';
        $ball.style.left = evt.pageX+'px';
        $ball.style.transition = 'left 0s, top 0s';
        setTimeout(()=>{
            $ball.style.top = window.innerHeight+'px';
            $ball.style.left = '0px';
            $ball.style.transition = 'left 1s linear, top 1s ease-in';
        }, 20)
    }</script></html>
로그인 후 복사

관련 권장 사항:

JS 포물선 애니메이션 작업 예제 공유

HTML5에서 그림의 포물선 운동에 대한 팁 공유

JavaScript에서 탄성 잠재 에너지 애니메이션의 포물선 운동에 대한 코드 예제

위 내용은 JS에서 포물선 애니메이션을 구현하기 위한 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!