(前端学习)07 使用vue框架制作购物车小球动画效果

最近在学习前端制作了一个购物车小球的动画效果
直接上图看看效果
在这里插入图片描述

下面介绍一下制作这个动画的详细过程:
1.因为使用vue所以需要使用transition标签包裹 并指定动画三个动画生命周期函数

<transition 
  		@before-enter="beforeEnter"
  		@enter="enter"
  		@after-enter="afterEnter">
  		<div class="ball" v-if="Ballflag" ref="ball"></div> //Ballflag默认指定为false不显示
  	</transition>

样式设置成一个红色的小球采用absolute定位确保不影响页面的其他元素

.ball{
		width: 15px;
		height: 15px;
		border-radius: 50%;
		background-color: red;
		position: absolute;
		top: 413px;
		left: 80px;
		z-index: 99;
}

然后设置按钮 Ballflag = !Ballflag 取非 触发动画效果(这里就不多说了)

如果起始位置和终点位置都使用px固定死的话对于不同的分辨率的设备效果都有所不同
所以为避免这一情况我采用了动态计算出 起始位置和终点位置
下面是具体的动画的代码

//定义动画开始前回到原来的位置
		beforeEnter(el){
			el.style.transform = "translate(0,0)";
		},
		enter(el,done){
			el.offsetWidth;
			// 获取 小球 在页面中的位置
			var ballPosition = this.$refs.ball.getBoundingClientRect();
			// 获取 徽标 在页面中的位置(购物车上的红色标记)
			var badgePosition = document.getElementById("badge").getBoundingClientRect();

			var xDist = badgePosition.left - ballPosition.left;
			var yDist = badgePosition.top - ballPosition.top;
			
			
			el.style.transform = "translate("+xDist+"px, "+yDist+"px)";
			el.style.transition = "all 1s ease";
			done();
		},
		//动画结束后隐藏
		afterEnter(el){
			this.Ballflag = !this.Ballflag;
		},

通过动态的计算出起点位置和终点的位置来实现动画效果(优势可以适配不同分辨率的设备)
看到现在似乎整个动画效果已经完成了。

不过我在测试使用的时候发现一个问题

当我点击按钮触发动画的时候往下拉滚动条发现动画终点的位置并不是期望的那样到达购物车的位置
原因是我在给小球设置样式的时候给display设置的absolute绝对定位 只会计算出一个页面中的绝对的位置,无法跟着滚动条来动。
后来又想到可以使用fixed布局相对这屏幕来运动不受页面滚动的影响
所以实现的代码如下
样式

.ball{
		width: 15px;
		height: 15px;
		border-radius: 50%;
		background-color: red;
		position: fixed;
		z-index: 99;
		top: 413px;
		left: 80px;

	}

****注意这里的boxPosition是页面中数量1的位置 即定位小球的位置

beforeEnter(el){
			
			var boxPosition = this.$refs.boxPosition.getBoundingClientRect();
			// console.log(boxPosition)
			// 获取目标的起始位置 
			var dist = boxPosition.y -413;
			el.style.transform = "translate(0,"+dist+"px)";
		},
		enter(el,done){
			el.offsetWidth;
			
			var boxPosition = this.$refs.boxPosition.getBoundingClientRect();
			var badgePosition = document.getElementById("badge").getBoundingClientRect();

			//目标的起始位置
			var dist = boxPosition.y -413; 
			
			// 这里因为是使用boxPosition的位置不是小球的位置所以-10调整一下误差
			var xDist = badgePosition.left - boxPosition.left -10; 

			//这里要加上起始的定位
			var yDist = badgePosition.top - boxPosition.top + dist;
			
			el.style.transform = "translate("+xDist+"px, "+yDist+"px)";
			el.style.transition = "all 1s ease";
			done();
		},
		afterEnter(el){
			this.Ballflag = !this.Ballflag;
		},

这里就已经完成了小球的动画效果了
这样的动画不会因为页面的滚动而无法准确的定位而且还能适配不同分辨率的设备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值