HTML5+CSS3+JavaScript 实现淘宝购物车

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();
}

xinyue Day6

猜你喜欢

转载自blog.csdn.net/qq_47735503/article/details/111206618