Maison  >  Article  >  interface Web  >  JS crée une animation parabolique uniforme

JS crée une animation parabolique uniforme

php中世界最好的语言
php中世界最好的语言original
2018-03-17 13:41:471733parcourir

Cette fois, je vais vous apporter JS pour réaliser une animation de parabole uniforme Quelles sont les précautions pour réaliser une animation de parabole uniforme avec JS. Ce qui suit est un cas pratique. jetez un oeil une fois.

Alors qu'il travaillait sur un petit programme de commodité sans pilote, un jour, le produit a déclaré qu'il apprendrait du produit d'un certain fabricant et ajouterait une animation de balle parabolique au panier. Eh bien, produit, vous êtes le plus grand, faites-le !

Laissez-moi d'abord vous montrer les rendus

Analyse

Ce genre d'animation sans position de départ fixe , naturellement, vous ne pouvez pas utiliser d'images GIF, vous ne pouvez donc utiliser que du code natif pour réaliser

Alors, de quels outils disposons-nous pour implémenter l'animation ?

L'applet fournit l'API JS createAnimation pour créer des animations

Animation CSS

Avec l'outil en main, regardons ce qu'est une parabole est.

Ici, nous discutons uniquement de la parabole horizontale. D'après le principe mathématique, la parabole horizontale est [mouvement avec une vitesse horizontale constante et une accélération verticale]. La conversion au niveau du code se fait dans la fonction de synchronisation de l'effet d'animation. utilise linéaire et l'animation verticale utilise easy-in

Nous devons donc décomposer cette animation parabolique en deux animations qui sont exécutées simultanément mais avec des effets d'animation différents.

Implémentation

implémentation du mini programme

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 秒延时,确保球已经到位并显示
    self.setData({
      animationX: animationX.export(),
      animationY: animationY.export(),
    })
    return setTimeoutES6(400) // 400 是球的抛物线动画时长
  }).then(() => { // 400 秒延时后隐藏球
    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>

Pour autant que je sache, l'animation implémentée à l'aide de transform: transform() aura de meilleures performances que top & left, mais après l'avoir essayée, j'ai découvert qu'elle ne pouvait pas obtenir l'effet interactif idéal que j'attends avec impatience. pour approfondir les recherches

Implémentation H5

// todo

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le php. Site chinois !

Lecture recommandée :

Que faire si le glissement des données chargées dynamiquement échoue toujours

D3.js dessine une barre de progression dynamique

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn