原生js 加入购物车抛物线动画效果

抛物线:利用抛物线方程 y = ax^2 + bx + c   传入3点坐标(x1, y1)(x2, y2)(x3, y3)求解出参数 a, b, c

           a: (y3 - y1 + (y2 - y1) * (x1 - x3) / (x2 - x1)) / (x3 * x3 - x1 * x1 - (x3 - x1) * (x1 + x2))

           b: (y2 - y1 + a * x1 * x1 - a * x2 * x2) / (x2 - x1)

           c: y1 - a * x1 * x1 - b * x1

从起点到终点, x匀速增加, 将x 带入方程得到y值,(x, y)即为动画每一帧的坐标位置

原点位置默认为页面左上角

完整代码:

// 元素抛物线动画

// startPos 动画元素起始位置

// targetPos 动画元素结束位置

// animationDom 动画元素

// animationTime 动画执行时间

// time 动画执行间隔

// callback动画执行完回调函数

function parabolaAnimation(startPos, targetPos, animationDom, animationTime = 400, time = 10, callback) {

  const [x1, x2, y1, y2] = [parseInt(-startPos.x), parseInt(-targetPos.x), parseInt(-startPos.y), parseInt(-targetPos.y)]

  const x3 = (x1 + x2) * 3 / 5

  const y3 = y2 + 30

  const dom = document.createElement('img')

  dom.src = car

  dom.width = 30

  dom.height = 30

  const animationDoms = animationDom ? animationDom : dom

  const speedX = (x2 - x1) * time / animationTime

  let times = 0

  animationDoms.style.position = 'fixed'

  animationDoms.style.left = `${-x1}px`

  animationDoms.style.top = `${-y1}px`

  animationDoms.style.zIndex = '10000'

  document.body.appendChild(animationDoms)

  // 利用抛物线方程: y = ax^2 + bx + c 带入三点坐标求得抛物线方程系数 a, b, c 。再根据方程,传入X 求Y

  const a = (y3 - y1 + (y2 - y1) * (x1 - x3) / (x2 - x1)) / (x3 * x3 - x1 * x1 - (x3 - x1) * (x1 + x2))

  const b = (y2 - y1 + a * x1 * x1 - a * x2 * x2) / (x2 - x1)

  const c = y1 - a * x1 * x1 - b * x1

  const timer = setInterval(() => {

    times += 1

    const x = x1 + speedX * times

    const y = a * x * x + b * x + c

    if (times * time > animationTime) {

      clearInterval(timer)

      document.body.removeChild(animationDoms)

      callback && callback()

    } else {

      animationDoms.style.left = `${-x}px`

      animationDoms.style.top = `${-y}px`

    }

  }, time)

}


执行完抛物线动画,可以在让购物车按钮加点抖动动画效果,抖动动画:

// 元素抖动动画

// maxDistance 抖动偏移距离

// interval  抖动快慢,数字越小越快,太小DOM反应不过来,看不出动画

// quarterCycle 一次完整来回抖动的四分之一周期

export function shakingAnimation(el, maxDistance = 5, interval = 15, quarterCycle = 8) {

  let curDistance = 0

  let direction = 1

  const timer = setInterval(function () {

    if (direction > 0) {

      curDistance++

      if (curDistance === maxDistance) {

        direction = -1

        maxDistance -= 1

      }

    } else {

      curDistance--

      if (curDistance === -maxDistance) {

        direction = 1

      }

    }

    el.style.transform = `translateY(${curDistance}px)`;

  }, interval)

  setTimeout(function () {

    clearInterval(timer)

    el.style.transform = `translateY(0)`;

  }, maxDistance * interval * quarterCycle);

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 223,726评论 6 521
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,697评论 3 402
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 170,734评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,508评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,522评论 6 399
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,051评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,429评论 3 427
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,403评论 0 278
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,930评论 1 323
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,977评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,122评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,763评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,454评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,931评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,047评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,613评论 3 380
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,150评论 2 363

推荐阅读更多精彩内容