原生html+js+css添加购物车效果

本文详细描述了如何使用原生HTML、JS和CSS实现购物车功能,包括数据预处理、单个商品操作(如总价计算、数量增减)、页面初始化以及动画效果的编写,全程未使用框架。
摘要由CSDN通过智能技术生成

目录

概述

首先先看效果

一、先建立单个物品的相关数据

二、对单个数据进行处理

三、使用原生的js初始化页面

四、调用已封装好的方法

总结


概述

通过原生的html+js+css实现添加到购物车的一个效果,包含了数据操作和动画效果

首先先看效果

购物车效果

一、先建立单个物品的相关数据

        处理单个数据体,在里面处理单个的总价、选中数量、是否选中、增加数量、减少数量

class ZBClassGoodsInfo{
	//构建
	constructor(goods){
		this.data		= goods;
		this.choose		= 0;
	}
	//返回当前物品的总价
	getTotalPrice(){
		return this.choose * this.data.price;
	}
	//判断当前物品是否选中
	isChoose(){
		return this.choose > 0;
	}
	//增加数量
	increase(){
		this.choose++;
	}
	//减少数量
	decrease(){
		if(this.choose <= 0){
			return;
		}
		this.choose--;
	}
}

二、对单个数据进行处理

        处理已准备好的数据,或者是从接口中拿的数据, 计算总价、增加数量、减少数量、获取选择的总数量、判断是否有选中数量、判断是否大于起送金额、计算距离起送的差、是否选中

//初始化页面数据
class ZBClassInitData{
	//构建
	constructor(){
		var uiGoods			= [];
		for(var i in goodsList){
			var tempGoods	= new ZBClassGoodsInfo(goodsList[i]);
			uiGoods.push(tempGoods);
		}
		this.uiGoods		= uiGoods;
		this.startPrice		= 1000;
		this.delivery		= 50;
	}
	
	//获取总价
	getTotalPrice(){
		var totalPrice		= 0;
		for(var i=0;i<this.uiGoods.length;i++){
			var goods		= this.uiGoods[i];
			totalPrice		+= goods.getTotalPrice();
		}
		return totalPrice;
	}
	
	//增加选中物品的数量
	increase(index){
		this.uiGoods[index].increase();
	}
	
	//减少选中物品的数量
	decrease(index){
		this.uiGoods[index].decrease();
	}
	
	//得到总计选中的数量
	getChooseNum(){
		var totalNum		= 0;
		for(var i=0;i<this.uiGoods.length;i++){
			totalNum		+= this.uiGoods[i].choose;
		}
		return totalNum;
	}
	
	//判断购物车中是否有商品
	hasGoods(){
		return this.getChooseNum() > 0;
	}
	
	//判断是否大于最低起送要求
	hasCrossDelivery(){
		return this.getTotalPrice() > this.startPrice;
	}
	
	//计算还差多少钱达到起送金额
	diffDelivery(){
		return this.startPrice - this.getTotalPrice();
	}
	//是否选中
	isChoose(index){
		return this.uiGoods[index].isChoose();
	}
}

三、使用原生的js初始化页面

        创建页面要展示的数据对象,在里面完成各种需要的操作封装,直接看代码,不啰嗦

//展示页面数据
class ZBClassPage{
	constructor(){
		this.doms		= {
							container:document.querySelector("#container"),
							goodsContnet:document.querySelector(".zb-goods-list"),
							cateBlock:document.querySelector(".zb-cate-list"),
							delivery:document.querySelector(".zb-bottom-delivery"),
							totalprice:document.querySelector(".zb-bottom-total-price"),
							cartblock:document.querySelector(".zb-page-cart"),
							cartnum:document.querySelector(".zb-page-cart-num"),
							subbtn:document.querySelector(".zb-bottom-right"),
							tocar:document.querySelector(".zb-to-car")
						};
		this.pageGoods	= new ZBClassInitData();
		//物品列表
		this.createHtml();
		//计算分类的高度
		
		//设置配送费用
		this.updateFooter();
		
		//监听动画
		this.pageListener();
		
		var cartRect	= this.doms.cartblock.getBoundingClientRect();
		var targetRect	= {
			x:cartRect.left + cartRect.width/2,
			y:cartRect.top + cartRect.height/4,
		};
		this.cartRect	= targetRect;
	}
	
	pageListener(){
		this.doms.cartblock.addEventListener('animationend',function(){
			this.classList.remove("zb-animate");
		});
	}
	
	//创建页面的元素
	createHtml(){
		var html		= "";//创建字符串
		for(var i in this.pageGoods.uiGoods){
			var goods	= this.pageGoods.uiGoods[i];
			html		+= `<div class="zb-goods-item">
								<div class="zb-goods-img">
									<img src="${goods.data.img}">
								</div>
								<div class="zb-goods-info">
									<div class="zb-goods-title zb-elp-2">${goods.data.title}</div>
									<div class="zb-goods-desc zb-elp-1">
										${goods.data.desc}
									</div>
									<div class="zb-goods-sell">
										月售 ${goods.data.sellNum}   好评${goods.data.favoriteRate}%
									</div>
									<div class="zb-goods-bottom">
										<div class="zb-goods-price">
											<span class="zb-goods-price-unit">¥</span>${goods.data.price}
										</div>
										<div class="zb-goods-btn">
											<div class="zb-iconfont zb-icon-jianhao zb-decrease" data-index="${i}"></div>
											<div class="zb-goods-num">${goods.choose}</div>
											<div class="zb-iconfont zb-icon-jiahao1 zb-increase" data-index="${i}"></div>
										</div>
									</div>
								</div>
							</div>`;
		}
		this.doms.goodsContnet.innerHTML	= html;
	}
	
	//增加数量
	increase(index){
		this.pageGoods.increase(index);
		this.updateGoodsItem(index);
		this.addMove(index);
		this.cartAnimate();
	}
	//减少数量
	decrease(index){
		this.pageGoods.decrease(index);		
		this.updateGoodsItem(index);
	}
	//更新元素
	updateGoodsItem(index){
		var curItem	= this.doms.goodsContnet.children[index];
		if(this.pageGoods.isChoose(index)){
			curItem.classList.add("zb-active");
		}else{
			curItem.classList.remove("zb-active");
		}
		
		var goodsnum	= curItem.querySelector(".zb-goods-num");
		goodsnum.textContent	= this.pageGoods.uiGoods[index].choose;
		
		//更新底部数据
		this.updateFooter();
	}
	
	//更新底部
	updateFooter(){
		//总费用
		this.doms.totalprice.textContent	= `¥${this.pageGoods.getTotalPrice()}`;
		
		//配送费
		var deliveryDom			= this.doms.delivery;
		deliveryDom.textContent	= `配送费¥${this.pageGoods.delivery}`;
		
		//选中的总数量
		var chooseTotal			= this.pageGoods.getChooseNum();
		this.doms.cartnum.textContent	= chooseTotal;
		//先移除样式
		this.doms.cartblock.classList.remove("zb-active");
		if(chooseTotal > 0){
			this.doms.cartnum.style.display	= "block";
			this.doms.cartblock.classList.add("zb-active");
		}else{
			this.doms.cartnum.style.display	= "none";
		}
		
		this.doms.subbtn.classList.remove("zb-cross");
		this.doms.subbtn.textContent	= `还差¥${this.pageGoods.diffDelivery()}元起送`;
		//计算起送费
		if(this.pageGoods.hasCrossDelivery()){
			this.doms.subbtn.textContent	= `去结算`;
			this.doms.subbtn.classList.add("zb-cross");
		}
	}
	
	//动画
	cartAnimate(){
		this.doms.cartblock.classList.add("zb-animate");
	}
	
	//加入的动画
	addMove(index){
		//计算点击的位置
		var increaseBtn		= this.doms.goodsContnet.children[index].querySelector(".zb-increase");
		var increaseRect	= increaseBtn.getBoundingClientRect();
		var sourceRect		= {
								x:increaseRect.left,
								y:increaseRect.top
							}
		
		var div						= document.createElement("div");
		div.className				= "zb-to-car";
		
		var divChild				= document.createElement("div");
		divChild.className			= "zb-iconfont zb-icon-jiahao1 zb-increase";
		
		div.style.transform			= `translateX(${sourceRect.x}px)`;
		divChild.style.transform	= `translateY(${sourceRect.y}px)`;
		div.appendChild(divChild);
		document.body.appendChild(div);
		
		//先进行渲染
		div.clientWidth;
		
		div.style.transform			= `translateX(${this.cartRect.x}px)`;
		divChild.style.transform	= `translateY(${this.cartRect.y}px)`;
		
		var that		= this;
		div.addEventListener('transitionend',function(){
			div.remove();
			that.cartAnimate();
		},{
			once:true
		});
	}
}

四、调用已封装好的方法

        直接调用已经封装好的方法来完成整个过程

var ui	= new ZBClassPage();
ui.doms.goodsContnet.addEventListener("click",function(e){
	if(e.target.classList.contains("zb-increase")){
		var index	= +e.target.dataset.index;
		ui.increase(index)
	}else if(e.target.classList.contains("zb-decrease")){
		var index	= +e.target.dataset.index;
		ui.decrease(index)
	}
});

可以下载完成版源码

总结

通过原生的js操作dom对象,来完成页面的展示,使用css来实现动画展示,整个过程中没有用到任何的框架。

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值