HTML5+CSS3+JavaScript 實現淘寶購物車
阿新 • • 發佈:2020-12-16
HTML5+CSS3+JavaScript 實現淘寶購物車
1.在一個裡面寫的,好複製。。。。。下邊有分開寫的 備註詳細
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>購物車</title>
<style>
.block{
width: 800px;
height: auto;
min-height : 30px;
border: 1px solid silver;
margin: auto;
}
.title{
display: flex;/*彈性佈局*/
flex-direction: row;/*以行的方式修飾*/
}
.title>div{
flex: 1;/*劃分區域*/
border-bottom: 1px solid silver;
border-right : 1px solid silver;
height: 30px;
line-height: 30px;
text-align: center;
font-size: 13px;
}
.title>div:nth-child(i) input{
position: relative;
top: 2px;
}
.h_list{
display: flex;
flex-direction : row;
}
.h_list>div{
flex: 1;
text-align: center;
line-height: 80px;
border: 1px solid silver;
}
.leftbtn,.rightbtn,.txt{
display: inline-block;
width: 30px;
text-align: center;
}
.iscolor{
background: antiquewhite;
}
</style>
</head>
<body>
<div class="block"><!--顯示的盒子-->
<div class="title"><!--購物車框框-->
<div><input type="checkbox" id="allcheck"/>全選/反選</div>
<div>名稱</div>
<div>單價</div>
<div>數量</div>
<div>小計</div>
<div>操作</div>
</div>
</div>
<div>
總計:<label id="label"></label>
</div>
<script>
var data=[{
name:"短袖",
price:40,
num:1,
totle:40
},
{
name:"短袖",
price:120,
num:1,
totle:120
},
{
name:"短袖",
price:80,
num:1,
totle:80
},
{
name:"短袖",
price:110,
num:1,
totle:110
}
];
var block=document.querySelector(".block");
var allcheck=document.getElementById("allcheck");
showEle();
function showEle(){
for (var i = 0; i <data.length ; i++) {
//建立行元素
var h_list=document.createElement("div");
h_list.setAttribute("class","h_list");
var div_v_f=document.createElement("div")
var check=document.createElement("input");
check.type="checkbox";
check.index=i;
check.addEventListener("click",ckcolor);
check.className="all";
div_v_f.appendChild(check);
h_list.appendChild(div_v_f);
for (var k in data[i]) {//裡邊是集合所以用for in
if(k=="num")
{
var div_v=document.createElement("div");
var left=document.createElement("button");
left.className="leftbtn";
left.innerHTML="-";
left.index=i;
left.addEventListener("click",leftbtn);
div_v.appendChild(left);
var txt=document.createElement("label");
txt.innerHTML=data[i][k];
txt.className="txt";
div_v.appendChild(txt);
var right=document.createElement("button");
right.innerHTML="+";
right.className="rightbtn";
right.index=i;
right.addEventListener("click",rightbtn);
div_v.appendChild(right);
h_list.appendChild(div_v);
}
else{
var div_v=document.createElement("div");
div_v.innerHTML=data[i][k];
div_v.className=k;
h_list.appendChild(div_v);
}
}
var div_v_d=document.createElement("div")
var btn=document.createElement("button");
btn.innerHTML="刪除";
btn.className="delete";
btn.index= i;
btn.addEventListener("click",deletebtn);
div_v_d.appendChild(btn);
h_list.appendChild(div_v_d);
block.appendChild(h_list);
}
}
allcheck.onclick=function (){
var ckall=document.getElementsByClassName("all");
var hlist=document.getElementsByClassName("h_list")
for (var i = 0; i <ckall.length ; i++) {
ckall[i].checked=!ckall[i].checked;
ckallcolor(ckall[i].checked,hlist,i);
}
}
function leftbtn(){
var txt=document.getElementsByClassName("txt")
var num=txt[this.index].innerHTML;
num--;
if(num<=1){
num=1;
}
txt[this.index].innerHTML=num;
s_totle(this.index,num);
showallprice();
}
function rightbtn(){
var txt=document.getElementsByClassName("txt")
var num=txt[this.index].innerHTML;
num++;
txt[this.index].innerHTML=num;
s_totle(this.index,num);
showallprice();
}
function s_totle(index,n){
var price=document.getElementsByClassName("price");
var totle=document.getElementsByClassName("totle");
totle[index].innerHTML=price[index].innerHTML*n;
}
function ckallcolor(isck,obj,index){
if(isck){
obj[index].className="h_list iscolor";
}else {
obj[index].className="h_list";
}
showallprice();
}
function ckcolor(){
var hlist=document.getElementsByClassName("h_list");
if(this.checked){
hlist[this.index].className="h_list iscolor";
}else {
hlist[this.index].className="h_list";
}
showallprice();
}
function showallprice(){
var all=document.getElementsByClassName("all");
var totle=document.getElementsByClassName("totle");
var allprice=0;
for (var i = 0; i <all.length ; i++) {
if(all[i].checked){
allprice+=parseFloat(totle[i].innerHTML);
}
}
var label=document.getElementById("label");
label.innerText=allprice;
//console.log(allprice);
}
function deletebtn(){
var hlist=document.getElementsByClassName("h_list");
var checkbox=document.getElementsByClassName("all");
var leftbtn=document.getElementsByClassName("leftbtn");
var deletebtn=document.getElementsByClassName("delete");
var rightbtn=document.getElementsByClassName("rightbtn");
hlist[this.index].remove();
for (var i = 0; i <hlist.length ; i++) {
checkbox[i].index=i;
leftbtn[i].index=i;
rightbtn[i].index=i;
deletebtn[i].index=i;
}
showallprice();
}
</script>
</body>
</html>
2.拆一下 html裡外鏈路徑要寫對(不用我說了吧)
html檔案
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>購物車</title>
<link href="css/css.css" rel="stylesheet">
</head>
<body>
<div class="block"><!--設定大盒子-->
<div class="title"><!--設定大盒子裡的title-->
<div><input type="checkbox" id="allck">全選/反選</div>
<div>名稱</div>
<div>單價</div>
<div>數量</div>
<div>小計</div>
<div>操作</div>
</div>
</div>
<script src="js/js.js"></script>
</body>
</html>
css 樣式
.block{
width: 800px;
height: auto;/*高度自適應*/
min-height: 30px;/*最小高度指的是沒有資料前title那一行的資料*/
border: 1px silver solid;
margin: auto;/*居中顯示*/
}
.title{
display: flex;/*設定伸縮盒*/
flex-direction: row;/*讓裡面的元素在一行顯示*/
}
.title>div{
flex: 1px;/*分配空間*/
height: 30px;/*設定高度是想垂直顯示用*/
border: 1px solid silver;
text-align: center;/*居中顯示*/
line-height: 30px;/*垂直顯示*/
}
.h_list{
display: flex;/*設定伸縮盒*/
flex-direction: row;/*讓裡面的元素在一行顯示*/
}
.h_list>div{/*分配空間 居中*/
flex: 1;
text-align: center;
line-height: 80px;
border: 1px solid silver;
}
.txt {/*num裡label的寬*/
width: 30px;
display: inline-block;
}
js檔案
var data=[{
name:"短袖",
price:40,
num:1,
totle:40
},{
name:"短袖",
price:40,
num:1,
totle:40
},{
name:"短袖",
price:40,
num:1,
totle:40
},{
name:"短袖",
price:40,
num:1,
totle:40
},
]//虛擬後臺資料
var block=document.querySelector(".block");//獲取大盒子位置,為的就是想讓虛擬資料顯示到大盒子位置
var allck=document.getElementById("allck")
show();//執行show方法
function show(){
//迴圈方法 確定幾行
for (var i = 0; i <data.length ; i++) {
//建立行元素 為什麼要建立行元素---因為想讓取出的資源成行顯示
var h_list=document.createElement("div");
//給行元素設定class類選擇器
h_list.setAttribute("class","h_list");
//建立放置選擇框的div
var datacheck =document.createElement("div");
//給每行建立選擇框
var check=document.createElement("input");
check.type="checkbox";
check.index=i;//給選擇框一個索引,點選變色用
check.className="ck";
check.addEventListener("click",ckcolor);
//給選擇框放到放置選擇框的div
datacheck.appendChild(check);
//給放置選擇框的div放到行元素
h_list.appendChild(datacheck);
//選擇框完事了 要遍歷出來資料放到行元素裡了
for (var k in data[i]) {
//給計數行新增+、-按鈕 所以要一個判斷
if(k=="num"){
//num行新增div
var numall=document.createElement("div");
//新增按鈕
var left=document.createElement("button");
left.innerHTML="-";
left.index=i;
left.className="left";
left.addEventListener("click",leftbtn);
//新增計數框
var txt=document.createElement("label");
txt.innerHTML="1";
txt.className="txt";
//新增按鈕
var right=document.createElement("button");
right.innerHTML="+";
right.index=i;
right.className="right";
right.addEventListener("click",rightbtn);
//依次向上新增
numall.appendChild(left);
numall.appendChild(txt);
numall.appendChild(right);
h_list.appendChild(numall);
}else{
//建立放置資料的div
var datalist=document.createElement("div");
//給每個div顯示字
datalist.innerHTML=data[i][k];
//給每個div設定class類選擇器
datalist.className=k;
h_list.appendChild(datalist);
}
}
//放置刪除按鈕的div
var remove=document.createElement("div");
//建立刪除的按鈕
var btn=document.createElement("button");
btn.innerHTML="刪除";
btn.className="delete";
btn.index=i;
btn.addEventListener("click",deletebtn);
//依次往上加
remove.appendChild(btn)
h_list.appendChild(remove);
block.appendChild(h_list);
}
}
//給全選框設定點選全選事件
allck.onclick=function (){
//獲取那一組選擇框
var ck=document.getElementsByClassName("ck");
//獲取行元素,點選變色用
var hlist=document.getElementsByClassName("h_list");
//迴圈遍歷出選擇框狀態
for (var i=0;i<ck.length;i++){
//選中,未選中切換
ck[i].checked=!ck[i].checked;
//呼叫方法變色
ckallcolor(ck[i].checked,hlist,i);
}
}
//選擇框 點選變色
function ckcolor() {
//同樣獲取行元素
var hlist=document.getElementsByClassName("h_list");
if(this.checked){
hlist[this.index].style.backgroundColor="red";
}
else {
hlist[this.index].style.backgroundColor="white";
}
allprice()
}
//全選框選中變色 需要傳遞選擇框狀態,行元素,下標
function ckallcolor(isck,obj,index){
if(isck){
obj[index].style.backgroundColor="red";
}else {
obj[index].style.backgroundColor="white";
}
allprice()
}
//設定按鈕事件
function leftbtn() {
var txt = document.getElementsByClassName("txt");
var num = txt[this.index].innerHTML;
num--;
if (num <= 1) {
num = 1;
}
txt[this.index].innerHTML = num;
s_price(this.index,num);
allprice()
}
function rightbtn() {
var txt = document.getElementsByClassName("txt");
var num = txt[this.index].innerHTML;
num++;
txt[this.index].innerHTML = num;
s_price(this.index,num);
allprice()
}
//小計
function s_price(index,num){
//獲取單價
var price=document.getElementsByClassName("price");
//獲取小計
var totle=document.getElementsByClassName("totle");
//小計=單價乘數量
totle[index].innerHTML=price[index].innerHTML*num;
}
//算總賬
function allprice(){
//需要小計
var totle=document.getElementsByClassName("totle");
//需要選擇框算錢
var ck=document.getElementsByClassName("ck");
//需要定義總價初始值
var allprice=0;
//遍歷 出選擇框
for (var i = 0; i <ck.length ; i++) {
//選擇了 就算總賬
if(ck[i].checked){
allprice+=parseFloat(totle[i].innerHTML);
}
console.log(allprice);//總賬在控制檯顯示一下,,,,懶
}
}
//刪除按鈕新增事件
function deletebtn() {
//刪除意味著所有用到索引的都要更新一下
var hlist = document.getElementsByClassName("h_list");
var checkbox = document.getElementsByClassName("ck");
var leftbtn = document.getElementsByClassName("left");
var deletebtn = document.getElementsByClassName("delete");
var rightbtn = document.getElementsByClassName("right");
//刪除
hlist[this.index].remove();
//重新遍歷下標索引 重新賦值
for (var i = 0; i < hlist.length; i++) {
checkbox[i].index = i;
leftbtn[i].index = i;
rightbtn[i].index = i;
deletebtn[i].index = i;
}
//重新算總賬
allprice();
}