前端jquery实现商城sku效果

        商城项目的两大核心,商品sku和订单,其中sku的实现还是有点复杂,尤其是在处理元素的监听事件,通过规格属性的id组合获取单品商品信息。一般思路是现获取sku的规格和属性,动态创建dom元素,然后请求后台接口数据获取单品,此文已本地json数据模拟全sku的情况,如果非全码的情况下,罗机处理非常复杂,还需考虑商品单品不存时候,元素置灰,不可点击得人情况:

1、css文件:

   body {
            width: 100%;
            height: 450px;
        }

        .outer-div {
            margin: 5px;
            width: 40%;
            height: 100%;
            border: blue solid 1px;
        }

        .left-div {
            float: left;
            width: 40%;
            height: 100%;
            /**border: black solid 1px;*/
        }

        .right-div {
            float: left;
            width: 60%;
            height: 100%;
            
        }

        .master-img {
            width: 100%;
            height: 100%;
        }

        .right-top-img {
            float: left;
            margin: 5px;
            width: 30%;
            height: 100px;
        }

        .right-top-div {
            float: left;
            margin-top: 15px;
            margin-right: 10px;
            height: 100px;
        }

        .right-top-span {
            margin-top: 8px;
        }

        .right-bottom-div {
            margin-left: 5px;
            margin-top: 120px;
             width:100%;
        }

        .right-bottom-span-normal {
            padding: 5px;
            margin-right: 10px;
             font: "微软雅黑";
            border-radius: 5px;
            border: 1px solid black;
        }

        .right-bottom-span-select {
            padding: 5px;
            margin-right: 10px;
            font: "微软雅黑";
            color: red;
            border-radius: 5px;
            border: 2px solid red;
        }

  2、sku的json数据,和商品json数据

[
	{
		"parentId": 1,
		"skuAttr": "尺寸",
		"itemList": [
			{
				"id": 0,
				"skuName": "39码"
			}, {
				"id": 1,
				"skuName": "40码"
			}, {
				"id": 2,
				"skuName": "41码"
			}, {
				"id": 3,
				"skuName": "42码"
			}
		]
	}, {
		"parentId": 2,
		"skuAttr": "颜色",
		"itemList": [
			{
				"id": 0,
				"skuName": "红色"
			}, {
				"id": 1,
				"skuName": "白色"
			}, {
				"id": 2,
				"skuName": "黄色"
			}, {
				"id": 3,
				"skuName": "蓝色"
			}
		]
	}
]

[
	{
		"itemId": "1020",
		"img": "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3576006200,3251831212&fm=26&gp=0.jpg",
		"name": "城市丽人",
		"price": 100.0
	}, {
		"itemId": "1021",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535965622122&di=81c5840ad16c828eed3ec1cf838a5d4f&imgtype=0&src=http%3A%2F%2Fi2.hdslb.com%2Fbfs%2Farchive%2F696c50aaa1ce68c950288ac3f00d65a4e91cad63.jpg",
		"name": "夏季新品连衣裙",
		"price": 101.5
	}, {
		"itemId": "1022",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233746&di=6e119707497b4b2d5bea2fa53724ce08&imgtype=0&src=http%3A%2F%2Fimg.go007.com%2F2017%2F04%2F08%2F185db2e70c24a49b_2.jpg",
		"name": "红豆女装",
		"price": 103.0
	}, {
		"itemId": "1023",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233745&di=353ed113ae709cd9d134bb59014d473b&imgtype=0&src=http%3A%2F%2Fimg000.hc360.cn%2Fy4%2FM00%2FF7%2F96%2FwKhQiFUpYruEQ2i6AAAAAHLEXbw797.jpg",
		"name": "城市丽人",
		"price": 104.5
	}, {
		"itemId": "1120",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233741&di=19f9b9a22c4de4ed6c2a17c9a9534c9d&imgtype=0&src=http%3A%2F%2Fimg000.hc360.cn%2Fhb%2FMTQ2MjM1NjE1MTQxNy03ODQyOTIwODQ%3D.jpg",
		"name": "夏季新品连衣裙",
		"price": 106.0
	}, {
		"itemId": "1121",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233743&di=bb19b1a16788e58c5d6b0ac4ac17bbe1&imgtype=0&src=http%3A%2F%2Fmlady.2liang.net%2Fd%2Ffile%2Fclothing%2Fxiazhuang%2F2016-04%2Fefebf66e3e70b09d0371b7c045580871.jpg",
		"name": "红豆女装",
		"price": 107.5
	}, {
		"itemId": "1122",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233743&di=e1c715e4919b7e888fe985b0b9f080de&imgtype=0&src=http%3A%2F%2Fimg004.hc360.cn%2Fy4%2FM05%2F25%2FF1%2FwKhQiFT6GsqEHiplAAAAAAaQmss866.jpg",
		"name": "城市丽人",
		"price": 109.0
	}, {
		"itemId": "1123",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233743&di=731cfe3cea4c6c5f893c743c5b94bc7d&imgtype=0&src=http%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi1%2FTB1JAMnfkSWBuNjSszdXXbeSpXa_%2521%25210-item_pic.jpg_400x400.jpg",
		"name": "夏季新品连衣裙",
		"price": 110.5
	}, {
		"itemId": "1220",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233740&di=f6c5afcc7dd462fa5bfee7e0963b46c9&imgtype=0&src=http%3A%2F%2Fd6.yihaodianimg.com%2FN02%2FM0B%2F6F%2FAA%2FCgQCslOlNgCAZFOxAAHlr_RIVAg76400.jpg",
		"name": "红豆女装",
		"price": 112.0
	}, {
		"itemId": "1221",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446471851&di=f1a483e99c8e8be05f3a9702c4c097ec&imgtype=jpg&src=http%3A%2F%2Fimg3.imgtn.bdimg.com%2Fit%2Fu%3D74341273%2C3968231785%26fm%3D214%26gp%3D0.jpg",
		"name": "城市丽人",
		"price": 113.5
	}, {
		"itemId": "1222",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233807&di=02c117c17b1a83ca8ca76ec9dfbfddf7&imgtype=0&src=http%3A%2F%2Fd6.yihaodianimg.com%2FN07%2FM00%2F95%2F6D%2FChEbvFWsImOAalfeAAGGZc9le2005000.jpg",
		"name": "夏季新品连衣裙",
		"price": 115.0
	}, {
		"itemId": "1223",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233807&di=9a91b89aad071f1c03ea9bb07b886baa&imgtype=0&src=http%3A%2F%2Fm.360buyimg.com%2Fn12%2Fg14%2FM02%2F1B%2F0B%2FrBEhV1NGOGYIAAAAAAIn4ZRI2LwAALrGAGW-pIAAif5340.jpg%2521q70.jpg",
		"name": "红豆女装",
		"price": 116.5
	}, {
		"itemId": "1320",
		"img": "https://img.alicdn.com/imgextra/i2/712330740/TB1jbAcCFGWBuNjy0FbXXb4sXXa_!!0-item_pic.jpg_430x430q90.jpg",
		"name": "城市丽人",
		"price": 118.0
	}, {
		"itemId": "1321",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233807&di=2bf2316f331895bd828abe830f2d1723&imgtype=0&src=http%3A%2F%2Fimage4.suning.cn%2Fuimg%2Fb2c%2Fnewcatentries%2F0000000000-000000000688881146_2_800x800.jpg",
		"name": "夏季新品连衣裙",
		"price": 119.5
	}, {
		"itemId": "1322",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233806&di=6bbad8c769ac88fd2c32fa764103f793&imgtype=0&src=http%3A%2F%2Fimg009.hc360.cn%2Fm6%2FM04%2F73%2F53%2FwKhQoVcVtiaEPtGfAAAAAK4k0NY745.jpg",
		"name": "红豆女装",
		"price": 121.0
	}, {
		"itemId": "1323",
		"img": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233805&di=43e3ad8b377a79a1fc95981a2491b6f5&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01bb875929671aa801216a3e9881f0.jpg%401280w_1l_2o_100sh.jpg",
		"name": "城市丽人",
		"price": 122.5
	}
]

3、html布局和js逻辑

<!DOCTYPE html>
<html>
     <head>
		<meta charset="UTF-8">
		<link rel="stylesheet" type="text/css" href="css/sku.css" />
		<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
		<script type="text/javascript">
			var jsonStr = '[{"parentId":1,"skuAttr":"尺寸","itemList":[{"id":0,"skuName":"39码"},{"id":1,"skuName":"40码"},{"id":2,"skuName":"41码"},{"id":3,"skuName":"42码"}]},{"parentId":2,"skuAttr":"颜色","itemList":[{"id":0,"skuName":"红色"},{"id":1,"skuName":"白色"},{"id":2,"skuName":"黄色"},{"id":3,"skuName":"蓝色"}]}]';
			var skuJson = '[{"itemId":"1020","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1536040952&di=3d0e69918da73060dcdb921173d5a791&imgtype=jpg&er=1&src=http%3A%2F%2Fimg4.99114.com%2Fgroup1%2FM00%2F19%2F78%2FwKgGMFgqsHSAP6BfAAIaSnHqL-E258.jpg","name":"城市丽人","price":100.0},{"itemId":"1021","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233746&di=ee6e713744b5dff59ddd2725f4ac8eb6&imgtype=0&src=http%3A%2F%2Ffile5.youboy.com%2Fe%2F2015%2F4%2F28%2F91%2F662831.jpg","name":"夏季新品连衣裙","price":101.5},{"itemId":"1022","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233746&di=6e119707497b4b2d5bea2fa53724ce08&imgtype=0&src=http%3A%2F%2Fimg.go007.com%2F2017%2F04%2F08%2F185db2e70c24a49b_2.jpg","name":"红豆女装","price":103.0},{"itemId":"1023","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233745&di=353ed113ae709cd9d134bb59014d473b&imgtype=0&src=http%3A%2F%2Fimg000.hc360.cn%2Fy4%2FM00%2FF7%2F96%2FwKhQiFUpYruEQ2i6AAAAAHLEXbw797.jpg","name":"城市丽人","price":104.5},{"itemId":"1120","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233741&di=19f9b9a22c4de4ed6c2a17c9a9534c9d&imgtype=0&src=http%3A%2F%2Fimg000.hc360.cn%2Fhb%2FMTQ2MjM1NjE1MTQxNy03ODQyOTIwODQ%3D.jpg","name":"夏季新品连衣裙","price":106.0},{"itemId":"1121","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233743&di=bb19b1a16788e58c5d6b0ac4ac17bbe1&imgtype=0&src=http%3A%2F%2Fmlady.2liang.net%2Fd%2Ffile%2Fclothing%2Fxiazhuang%2F2016-04%2Fefebf66e3e70b09d0371b7c045580871.jpg","name":"红豆女装","price":107.5},{"itemId":"1122","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233743&di=e1c715e4919b7e888fe985b0b9f080de&imgtype=0&src=http%3A%2F%2Fimg004.hc360.cn%2Fy4%2FM05%2F25%2FF1%2FwKhQiFT6GsqEHiplAAAAAAaQmss866.jpg","name":"城市丽人","price":109.0},{"itemId":"1123","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233743&di=731cfe3cea4c6c5f893c743c5b94bc7d&imgtype=0&src=http%3A%2F%2Fimg.alicdn.com%2Fimgextra%2Fi1%2FTB1JAMnfkSWBuNjSszdXXbeSpXa_%2521%25210-item_pic.jpg_400x400.jpg","name":"夏季新品连衣裙","price":110.5},{"itemId":"1220","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233740&di=f6c5afcc7dd462fa5bfee7e0963b46c9&imgtype=0&src=http%3A%2F%2Fd6.yihaodianimg.com%2FN02%2FM0B%2F6F%2FAA%2FCgQCslOlNgCAZFOxAAHlr_RIVAg76400.jpg","name":"红豆女装","price":112.0},{"itemId":"1221","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446471851&di=f1a483e99c8e8be05f3a9702c4c097ec&imgtype=jpg&src=http%3A%2F%2Fimg3.imgtn.bdimg.com%2Fit%2Fu%3D74341273%2C3968231785%26fm%3D214%26gp%3D0.jpg","name":"城市丽人","price":113.5},{"itemId":"1222","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233807&di=02c117c17b1a83ca8ca76ec9dfbfddf7&imgtype=0&src=http%3A%2F%2Fd6.yihaodianimg.com%2FN07%2FM00%2F95%2F6D%2FChEbvFWsImOAalfeAAGGZc9le2005000.jpg","name":"夏季新品连衣裙","price":115.0},{"itemId":"1223","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233807&di=9a91b89aad071f1c03ea9bb07b886baa&imgtype=0&src=http%3A%2F%2Fm.360buyimg.com%2Fn12%2Fg14%2FM02%2F1B%2F0B%2FrBEhV1NGOGYIAAAAAAIn4ZRI2LwAALrGAGW-pIAAif5340.jpg%2521q70.jpg","name":"红豆女装","price":116.5},{"itemId":"1320","img":"https://img.alicdn.com/imgextra/i2/712330740/TB1jbAcCFGWBuNjy0FbXXb4sXXa_!!0-item_pic.jpg_430x430q90.jpg","name":"城市丽人","price":118.0},{"itemId":"1321","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233807&di=2bf2316f331895bd828abe830f2d1723&imgtype=0&src=http%3A%2F%2Fimage4.suning.cn%2Fuimg%2Fb2c%2Fnewcatentries%2F0000000000-000000000688881146_2_800x800.jpg","name":"夏季新品连衣裙","price":119.5},{"itemId":"1322","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233806&di=6bbad8c769ac88fd2c32fa764103f793&imgtype=0&src=http%3A%2F%2Fimg009.hc360.cn%2Fm6%2FM04%2F73%2F53%2FwKhQoVcVtiaEPtGfAAAAAK4k0NY745.jpg","name":"红豆女装","price":121.0},{"itemId":"1323","img":"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1535446233805&di=43e3ad8b377a79a1fc95981a2491b6f5&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01bb875929671aa801216a3e9881f0.jpg%401280w_1l_2o_100sh.jpg","name":"城市丽人","price":122.5}]';

			var $masterImg; //主图
			var $smallImg; //小图
			var $skuName; //商品名称
			var $skuSpec; //商品规格组合
			var $skuPrice; //商品价格

			var skuIds = new Array(); //所有规格的全id        
			var skuList = new Array(); //所有规格属性json集合
			var goodsList = new Array(); //所有单品json集合
			var specIds; //规格组合id
			var specNames; //屬性名称
			var firstNameSpec="";
			var firstGoodsObj;

			$(function() {
				init$Obj();
				skuJson2Arr();
				addSkuList($skuContainer);
			});

			/**
			 * 初始化jquery元素
			 */
			function init$Obj() {
				$masterImg = $("#master-img");
				$smallImg = $("#small-img");
				$skuName = $("#sku-name");
				$skuSpec = $("#sku-spec");
				$skuPrice = $("#sku-price");
				$skuContainer =$("#sku-spec-contanier");
			}

			/**
			 *动态添加sku的规格属性 
			 */
			function addSkuList($skuContainer) {
				
				$.getJSON("spec_list.json", function(data) {
					specIds = new Array();
					specNames = new Array();

					$.each(data, function(index, info) {
						console.log("規格=" + JSON.stringify(info));
						skuList[index] = info;
						var obj = info;
						var $div = $("<div style='margin-top: 15px;'></div>");
						var $span = $("<span>" + obj.skuAttr + "</span></br></br>");
						$div.append($span);
					
						var objList = obj.itemList;
						var $sdiv = $("<div></div>");

						$.each(objList, function(index2, goods) {
							var sobj = goods;
							var $sspan = $("<span>" + sobj.skuName + "</span>");
							var tempId = ((index + 1).toString() + index2.toString()) + "&" + index;
							$sspan.attr("id", tempId);
					
							if(index2 == 0) {
								$sspan.addClass("right-bottom-span-select");
								firstNameSpec=firstNameSpec+sobj.skuName;
								console.log("第一个商品的名称="+firstNameSpec);
							}else 
								$sspan.addClass("right-bottom-span-normal");
							
							$sdiv.append($sspan);
							
							$($sspan).click(function() {
								$(this).removeClass("right-bottom-span-normal").addClass("right-bottom-span-select");
								$(this).siblings().removeClass("right-bottom-span-select").addClass("right-bottom-span-normal");
								var mId = $(this).attr("id");
								var splits = mId.split("&");
								var mName = $(this).html();
								specIds[splits[1]] = splits[0];
								specNames[splits[1]] = mName;
								getSpecIds();
							});
							
							$div.append($sdiv);
							$skuContainer.append($div);
						   });
					});
				});
			}
			/**
			 * 把skuJson解析存储到数组
			 */

			function skuJson2Arr() {
				$.getJSON("goods_list.json", function(data) {
					$.each(data, function(index, info) {
						if(index==0) {
							firstGoodsObj=info;
							showgGoodsInfo(firstGoodsObj,firstNameSpec);
							console.log("第一个商品="+JSON.stringify(firstGoodsObj));
						}
						goodsList[index] = info;
						skuIds[index] = info.itemId;
						//console.log("商品=" + info);
					});
				});

			}

			/**
			 * 获取sku最终组合id
			 */

			function getSpecIds() {
				var ids = "";
				var names = "";
				$.each(specIds, function(index, info) {
					ids = ids + specIds[index];
					names = names + specNames[index];
				});

				console.log("##############------" + ids + "----" + names);
				$.each(skuIds, function(index) {
					if(ids == this) {
						var obj = goodsList[index];
						showgGoodsInfo(obj, names);
					}
				});

			}

			/**
			 *展示商品数据
			 * {"itemId":"1020","img":"258.jpg","name":"城市丽人","price":100.0}
			 */
			function showgGoodsInfo(jsonObj, spec) {
				console.log("json="+JSON.stringify(jsonObj));
				$masterImg.attr("src", jsonObj.img);
				$smallImg.attr("src", jsonObj.img);
				$skuName.html(jsonObj.name);
				$skuPrice.html("¥" + jsonObj.price);
				$skuSpec.html(spec);
			}
		</script>

		<title>SKU商品规格</title>
	</head>

	<body>

		<div class="outer-div">
			<!-- 左边布局-->
			<div class="left-div">
				<img id="master-img" class="master-img" alt="商品主图" />
			</div>

			<!-- 右边布局-->
			<div class="right-div">

				<img id="small-img" class="right-top-img" alt="规格图" />

				<div class="right-top-div">

					<div class=".right-top-span">
						<span id="sku-name">请新版连衣裙</span></br>
					</div>

					<div class="right-top-span">
						<span id="sku-spec">39号红色</span></br>
					</div>

					<div class="right-top-span">
						<span id="sku-price">¥129.00</span>
					</div>
				</div>

				<!-- sku详情 -->
				<div id="sku-spec-contanier" class="right-bottom-div">
				</div>

			</div>
		</div>
	</body>

</html>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值