思路:  

1.因页面分组件分的比较细,由图可知是组件5到组件4的联动. 如果利用组件间通信需要 子组件5 -->组件3-->所有组件的父组件-->组件4, 层级略显复杂,所以使用了vuex状态管理管理数据.

2.动画处理:

利用vue的 transition 标签来处理动画.

小球运动的轨迹是一条抛物线, 可使X轴做匀速运动, Y轴贝塞尔曲线, 可以考虑设定两个嵌套的DOM来控制运行轨迹.外层控制Y轴动画, 内层控制X轴动画.

因小球落点是同一个位置, 可以将小球设定到落点位置, 动态获取初始值来决定小球的运动轨迹.

3.如果连续点击小球, 则页面上可能显示多个小球, 所以需要设置多个小球保证页面上可以显示多个小球.

结构图:

html (Ball.vue) :

      <div class="ball-container">
<transition v-for="(ball,index) in balls" :key="index" name="drop" @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
<div class="ball" v-show="ball.show" >
<div class="inner inner-hook"></div>
</div>
</transition>
</div>

css (Ball.vue):

      .ball-container
.ball
position fixed
left .64rem
bottom .44rem
z-index 200
width .32rem
height .32rem
border-radius 50%
// background rgb(0, 160, 220)
&.drop-enter-active
transition: all .4s cubic-bezier(0.49, -0.29, 0.75, 0.41)
.inner
width .32rem
height .32rem
border-radius 50%
background rgb(0, 160, 220)
transition: all .4s linear

js (Ball.vue)

  computed: {
...mapState({
balls: state => state.balls.balls,
dropBall: state => state.balls.dropBall
})
},
methods: {
...mapMutations(['changeShow', 'changeDropBall']),
beforeEnter (el) {
let count = this.balls.length
while (count--) {
let ball = this.balls[count]
if (ball.show) {
//getBoundingClientRect返回值是一个 DOMRect 对象, 此包含了一组用于描述边框的只读属性——left、top、right和bottom,单位为像素。
//除了 width 和 height 外的属性都是相对于视口的左上角位置而言的。
let rect = ball.el.getBoundingClientRect()
let x = rect.left - 32
let y = -(window.innerHeight - rect.top - 22)
//小球外层控制y轴的运动轨迹,translate3d()可以开启硬件加速
el.style.display = ''
el.style.webkitTransform = `translate3d(0, ${y}px, 0)`
el.style.transform = `translate3d(0, ${y}px, 0)`
//内层小球控制x轴运动轨迹,内外层运动方式是不一样的, y轴贝塞尔曲线, x轴匀速.
let inner = el.getElementsByClassName('inner-hook')[0]
inner.style.webkitTransform = `translate3d(${x}px, 0, 0)`
inner.style.transform = `translate3d(${x}px, 0, 0)`
}
}
},
enter (el) {
// 触发浏览器重绘
/* eslint-disable no-unused-vars */
let rf = el.offsetHeight
this.$nextTick(() => {
el.style.webkitTransform = 'translate3d(0, 0, 0)'
el.style.transform = 'translate3d(0, 0, 0)'
let inner = el.getElementsByClassName('inner-hook')[0]
inner.style.webkitTransform = `translate3d(0, 0, 0)`
inner.style.transform = `translate3d(0, 0, 0)`
})
},
afterEnter (el) {
// 删除数组第一个元素, 并返回第一个元素,因对象都是指向地址,所以操作dropBall数组也就操作了balls数组
let ball = this.dropBall.shift()
if (ball) {
ball.show = false
el.style.display = 'none'
}
}
}

store里面的moudle (balls.js):

const balls = {
state: {
balls: [{
show: false
}, {
show: false
}, {
show: false
}, {
show: false
}, {
show: false
}],
dropBall: []
},
mutations: {
changeShow (state, {index, isShow, el}) {
state.balls[index].show = isShow
state.balls[index].el = el
},
changeDropBall (state, ball) {
state.dropBall.push(ball)
}
}
} export default balls

增加商品数量(即点击+号)触发小球动画的页面 (Cartcontrol.vue):

  computed: {
...mapState({
balls: state => state.balls.balls
})
},
methods: {
...mapMutations(['changeShow', 'changeDropBall']),
addCart (event) {
for (let i = 0; i < this.balls.length; i++) {
if (!this.balls[i].show) {
this.changeShow({index: i, isShow: true, el: event.target})
this.changeDropBall(this.balls[i])
return
}
}
}
}

此DOME是根据参考黄轶老师的仿饿了吗课程改编而来~

Vue实现购物车小球动画的更多相关文章

  1. 使用vue模拟购物车小球动画

    使用vue模拟购物车小球动画 1.效果演示 2.相关代码 <!DOCTYPE html> <html lang="en"> <head> < ...

  2. vue.js加入购物车小球动画

    生成一个动画小球的div,并且生成五个小球,五个是为了生成一定数量的小球来作为操作使用,按照小球动画的速度,一般来说五个也可以保证有足够的小球数量来运行动画 动画的内容分别是外层和内层,外层控制动画小 ...

  3. css贝塞尔曲线模仿饿了么购物车小球动画

    在线观看贝塞尔曲线值:传送门 在线观看动画效果:传送门 代码: <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  4. Vue实现购物小球抛物线

    .shop{ position: fixed; top: 300px; left: 40px; } .ball{ position: fixed; left: 32px; bottom: 22px; ...

  5. vue 2.0 购物车小球抛物线

    备注:此项目模仿 饿了吗.我用的是最新的Vue, 视频上的一些写法已经被废弃了. 布局代码 <div class="ball-container"> <trans ...

  6. “完美”解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来。

    最近做,微信点餐小程序,遇到添加商品时出现抛物动画,参考借鉴了这位大神的方法 https://www.cnblogs.com/greengage/p/7815842.html 但出现了一个问题,连续点 ...

  7. 基于jquery fly插件实现加入购物车抛物线动画效果,jquery.fly.js

    在购物网站中,加入购物车的功能是必须的功能,有的网站在用户点击加入购物车按钮时,就会出现该商品从点击出以抛物线的动画相似加入购物车,这个功能看起来非常炫,对用户体验也有一定的提高.下面介绍基于jque ...

  8. vue中使用js动画与velocity.js

    一:vue中使用js动画 根据上一篇安装animate.css之后 vue中有动画的钩子函数,@before-enter是内容由无到有的时候自动监听触发的函数,函数会接收到参数el,这样可以动态设置样 ...

  9. 基于jQuery加入购物车飞入动画特效

    基于jQuery加入购物车飞入动画特效.这是一款电商购物网站常用的把商品加入购物车代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div id="main& ...

随机推荐

  1. 用户场景分析i

    名字 学生(注重饮食选择,挑剔) 年龄 20 收入 无 知识层面 大学 使用这个网站的典型场景 中午或者晚上饿了但是不知道想吃什么,又不想随便吃,还是比较挑剔..这时,他就需要通过我们的网站来看其他人 ...

  2. 做一个vue的todolist列表

    <template> <div id="app"> <input type="text" v-model="todo&q ...

  3. 实体框架—Entity Framework

    简称EF,是微软以ADO.NET为基础所发展出来的对象关系对应(ORM)解决方案. EF就是用来处理数据的,与数据库打交道.但是底层还是用到了ADO.NET的那一套东西. 为什么叫对象关系对应解决方案 ...

  4. python练习题-day14

    一.选择题 1. python不支持的数据类型有:A. charB. intC. floatD. list ans:A 2.x = ‘foo’y = 2print(x + y) A. fooB. fo ...

  5. ELK基础原理

    搜索引擎 索引组件:  获取数据-->建立文档-->文档分析-->文档索引(倒排索引)    搜索组件:  用户搜索接口-->建立查询(将用户键入的信息转换为可处理的查询对象) ...

  6. 小程序图表wx-chart

    下载地址 https://github.com/xiaolin3303/wx-charts 使用步骤: 一.解压后,把dist里面的wxcharts.js或者wxcharts-min.js放在小程序的 ...

  7. 024-母版页MasterPage

    网站的布局通常是统一的,上面是Logo.菜单条.下面是公司地址.版权声明等.如果每个页面都重复做这些功能的话:重复性劳动.一旦修改那么每个页面都要修改..Net中一般用母版(MasterPage)技术 ...

  8. php redis队列操作

    php redis队列操作 rpush/rpushx 有序列表操作,从队列后插入元素:lpush/lpushx 和 rpush/rpushx 的区别是插入到队列的头部,同上,'x'含义是只对已存在的 ...

  9. WebForm跨页面传值取值、C#服务端跳转页面、 Button的OnClientClick属性和超链接点击弹出警示框

    一.跨页面传值和取值: 1.QueryString - url传值,地址传值 优缺点:不占用服务器内存:保密性差,传递长度有限. 通过跳转页面路径进行传值方式: href="地址?key=v ...

  10. 【Spark-core学习之七】 Spark广播变量、累加器

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...