使用html+css+JavaScript制作抛物线小球

本文介绍了如何使用CSS和JavaScript为购物车添加动态特效,通过点击按钮触发小球抛物线运动,并在动画结束后优雅地移除。关键在于使用`transform`和`transition`实现动画效果,以及使用事件监听确保内存管理

效果如下: 

 一般用于给购物车添加按钮时进行的特效

//html
<div class="addToCart">
			<span>+</span>
		</div>
		<!-- 这里的标签是为了写css样式 -->
		<!-- 	<div class="outer">
		<div class="inner"></div>
	</div> -->
		<div class="shopCart">
			<span>Cart</span>
		</div>

 首先要先布局

然后设置其样式

//css样式
.addToCart {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  top: 100px;
  left: 100px;
  position: absolute;
  background: #0f79b9;
  font-size: 30px;
  color: #fff;
  font-weight: bolder;
  line-height: 32px;
  text-align: center;
  cursor: pointer;
  z-index: 10; }
  .addToCart span {
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none; }

.outer {
  z-index: 9;
  top: 100px;
  left: 100px;
  position: absolute;
  transition: -webkit-transform 1s linear;
  transition: transform 1s linear;
  transition: transform 1s linear, -webkit-transform 1s linear; }
  .outer .inner {
    border-radius: 50%;
    width: 36px;
    height: 36px;
    top: 0;
    left: 0;
    position: absolute;
    background: #e0c01b;
    opacity: 1;
    transition: all 1s cubic-bezier(.29,-0.48,.99,.19)}
.shopCart {
  width: 100px;
  height: 40px;
  line-height: 40px;
  border-radius: 5px;
  background: #35b317;
  color: #fff;
  text-align: center;
  position: absolute;
  right: 100px;
  bottom: 100px; }

/*# sourceMappingURL=cssway.css.map */

效果如图所示:

 下面是给元素添加JS效果

var addToCart = document.querySelector('.addToCart');
			var shopCart = document.querySelector('.shopCart');
			// 对函数进行封装
			function createBall() {
				// 创建一个outer
				var outer = document.createElement('div');
				// 创建outer
				var inner = document.createElement('div');
				//把inner塞到outer里面
				// 生成两个节点 classlist:该属性适用于在元素中添加,移除以及切换CSS类
				// classlist属性是只读的,但可以使用add()和remover()方法去修改它
				outer.classList.add('outer'); //添加一个outer的节点
				inner.classList.add('inner'); //添加一个inner的节点
				// appendChild():向节点节点添加最后一个子节点
				// insertBefore(newnode,existingnode):在已有子节点之前插入新的子节点newnode要插入的子节点,existingnode要添加新的节点前的子节点。两个值都要添加
				outer.appendChild(inner); //把inner塞到outer里面  inner为变量,不是字符串,所以不需要加引号
				// 在body里面增加一个outer
				document.body.appendChild(outer)
				return outer;
			}

 然后调用createBall(),实现添加标签

核心是点击事件: 

// createBall()
			/* 核心是点击事件 */
			// 对盒子做一个点击事件
			addToCart.addEventListener('click', function(e) {
				// 两个作用域不同,之间没有关系
				var outer = createBall(),
					// firstchild可以获取多余文本节点
					inner = outer.firstElementChild, //获取outer第一个子元素
					// 起始的按钮就是点击的目标
					startBtn = e.target,
					// getBoundingClientRect():可以获得页面中某个元素的上下左右别别相对浏览器视窗的位置
					// +上下左右的间距
					startPoint = startBtn.getBoundingClientRect(),
					// cart的上下左右的间距
					endPoint = shopCart.getBoundingClientRect(),

					instanceX = endPoint.left - startPoint.left,
					// 结束的左边(cart) - 开始的左边(+)
					// 结束的上边(cart) - 开始的上边(+)
					// 可以获取两者之间的长度和高度
					// 开始和结束必须使用定位,否则不会发生变化
					instanceY = endPoint.top - startPoint.top;
				outer.style.transform = 'translate3d(' + instanceX + 'px,0,0)';
				// 外面的小球控制他的水平方向
				inner.style.transform = 'translate3d(0,' + instanceY + 'px,0)';
				// 里面的小球控制它的垂直方向,形成一个抛物线
			})

 写到这里就可以实现给小球添加抛物线了

问题来了,如何让他的小球动画结束过后消失呢?有以下两种方法:

1、 inner.style.opacity = 0;  //当完成之后可以让他过渡结束过后变成透明 

 效果:

 让他变成透明放进来的东西实际上没有被移除,,点击过多,会影响到内存占用

建议使用第二种方案

	function animateEnd(e) {
				var target = e.target;
				// classList.contains:是不是存在这个节点
				if (target.classList.contains('outer')) {
					// 如果有outer,就把他的父节点给移除掉,他的子节点就不会存在
					removeNode(target);
				}
				if (target.classList.contains('inner')) {
					// 移除目标值的parentNode
					removeNode(target.parentNode);
				}
			} 
			//不能直接调用,他不知道这个动画在什么时候移除
			// 应该在动画结束之后移除
			
			
			function removeNode(ele) { //移除节点
				ele.parentNode && ele.parentNode.removeChild(ele); //找到目标值的父节点同时移除节点
				// 让这个元素变为空
				ele = null;
			}
			// 加一个监听器,当过渡动画结束过后再去执行这个结束的动画
			window.addEventListener('transitionend', animateEnd, false);
			// animageEnd:在css完成过渡后触发
			//false:冒泡
			//true:捕获

 这样就不会有内存占用的问题了

如果想更改抛物线的话可以更改css样式中的贝塞尔曲线更换即可

贝塞尔曲线网址

js加入购物车抛物线动画与购物车效果特效,亲测可用, 当您在电商购物网站浏览中意的商品时,您可以点击页面中的“加入购物车”按钮即可将商品加入的购物车中。本文介绍借助一款基于jQuery的动画插件,点击加入购物车按钮时,实现商品将飞入到右侧的购物车中的效果。 HTML 首先载入jQuery库文件和jquery.fly.min.js插件。 复制代码 代码如下: 接着,将商品信息html结构布置好,本例中,我们用四个商品并排布置,每个商品box中包括有商品图片、价格、名称以及加入购物车按钮等信息。 复制代码 代码如下: ¥3499.00 LG 49LF5400-CA 49寸IPS硬屏富贵招财铜钱设计 加入购物车 ¥3799.00 Hisense/海信 LED50T1A 海信电视官方旗舰店 加入购物车 ¥¥3999.00 Skyworth/创维 50E8EUS 8核4Kj极清酷开系统智能液晶电视 加入购物车 ¥6969.00 乐视TV Letv X60S 4核1080P高清3D安卓智能超级电视 加入购物车 然后,我们还需要在页面的右侧加上购物车以及提示信息。 复制代码 代码如下: 购物车 已成功加入购物车! CSS 我们使用CSS先将商品排列美化,然后设置右侧购物车样式,具体请看代码: 复制代码 代码如下: .box{float:left; width:198px; height:320px; margin-left:5px; border:1px solid #e0e0e0; text-align:center} .box p{line-height:20px; padding:4px 4px 10px 4px; text-align:left} .box:hover{border:1px solid #f90} .box h4{line-height:32px; font-size:14px; color:#f30;font-weight:500} .box h4 span{font-size:20px} .u-flyer{display: block;width: 50px;height: 50px;border-radius: 50px;position: fixed;z-index: 9999;} .m-sidebar{position: fixed;top: 0;right: 0;background: #000;z-index: 2000;width: 35px;height: 100%;font-size: 12px;color: #fff;} .cart{color: #fff;t
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Southern Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值