用前端知识做一个小项目——购物车

所用技术:html,css,javascript

实现效果:

基本思路:

1.将页面的每个部分都用div盒子装起来,整个页面用一个div盒子,里面再划分多个盒子。

2.添加css样式,使页面基本达到效果。

3.添加js代码,增加一些加减数量,全选,结算的功能。

效果实现:

一.将页面的每个部分都用div盒子装起来,整个页面用一个div盒子,里面再划分多个盒子,大概如此

 画了其中一部分,每个方框都是一个div。

<body>
    <!--购物车-->
    <div class="shops">
        <!--店铺-->
        <div class="shop" id="s1">
            <!-- 头-->
            <div class="header">
                <input type="checkbox" class="shop_checkbox" value="2" onclick="midCheck(this)" id="head_check1">
                <input type="hidden" value="shop1_item1_checkbox shop1_item2_checkbox">
                <span class="shop_icon"><img src="img/biilbili.png" class="shop_icon"></span>
                <span class="shop_name">店铺:bilibili旗舰店</span>
                <span class="shop_wangwang_icon"><img src="img/旺旺.png" class="shop_wangwang_icon"></span>
            </div>
            <!--条目1-->
            <div class="item" id="i1">
                <!--复选框-->
                <div class="item_checkbox">
                    <input type="checkbox" onclick="check(this)" id="shop1_item1_checkbox">
                    <input type="hidden" value="shop1_item1_checkbox shop1_item2_checkbox head_check1">
                </div>

 就这样一层一层的套盒子。

二.添加css样式,使页面基本达到效果。

没添加之前

会出现这种杂乱无章的排布。现在添加css样式

        (一)所有div都是占一行的,所以我们要把在同一行的盒子设置成弹性布局,将display设置成flex,实现弹性布局

.item{
    display: flex;
    border: solid 1px #B7B3B3;
    padding: 20px;
    background-color: #FCF8F7;
}

               还有将一起排列的图标设置成,display: inline-block,就可以实现对齐的块排列。

类似这样。

再在合适的地方打补丁padding 内补丁 和 margin 外补丁

.item_checkbox,.item_img{
    margin-right: 10px;
}
.item{
    padding: 20px;
}   

 margin_right就是在这个div的右面留出空间。

再用height和width设置各个盒子高度和宽度

 都实现后大概会有这种效果(最终效果,有一些在上面还没说到)。

(二)将最大和盒子居中

.shops{
    width: 1200px;
    margin-left: auto;
    margin-right: auto;
    font-size: 13px;
    color: #1B1919;
}

 这样左右会留下空隙。

(三)调整,两边对齐

左右对齐

上下对齐

 像这些都是需要两边对齐的,

justify-content: space-between用于弹性布局
.promotion{
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    width: 220px;
    margin-right: 50px;
}

(四)鼠标悬停设置

.plus:hover,.minus:hover{
    color: #DD5617;
    cursor: pointer;
    border: solid #DD5617;
    height: 23px;
}

.plus:hover 表示光标在plus类元素时的样式,pointer是小手

no-drop表示禁止,在结算那里设置
 

 

 

三.使用js进行一些事件的控制。

(一)数量的加减,价格的变化。这里代码只显示了前部分。

function modifyCount(thisNode,id1,id2,id3){
    var num = thisNode.value;
    var regExp = /^[0-9][0-9]*$/
    var hNum = document.getElementById("h_" + thisNode.id);

    //正则判断
    var naoPrice = document.getElementById(id1);
    if (regExp.test(num)){
        if (num > 64){
            thisNode.value = 0;
            naoPrice.innerText = "¥" + 0
            hNum.value = num;
            return;
        }
……

先声明一个函数用来修改价格,其思路是,设置两个隐藏域,在这里隐藏域可以视为全局变量,分别藏数量和单价,然后经过计算显示在右边

 

然后这三处地方都可以调用这个函数进行修改,只要将文本框的value传进去就可以了。+ - 用onclick(),文本框用onkeyup()

(二)复选框的全选

window.onload = function (){
            //点击
            var zong = document.getElementById("zong");
            var aihaoEles = document.getElementsByName("aihao");
            zong.onclick = function (){
                for (var i = 0; i < aihaoEles.length; i++){
                    aihaoEles[i].checked = zong.checked;
                }
            }
            //循环套点击
            for (var i = 0; i < aihaoEles.length; i++){
                aihaoEles[i].onclick = function (){
                    var count = 0;
                    for (var j = 0; j < aihaoEles.length; j++){

                        if (aihaoEles[j].checked == true){
                            count++;
                        }
                    }
                    zong.checked = (count == aihaoEles.length);
                }
            }
        }

 基本思路是在点击大框时,将小框的checked属性设置为和大框一样,然后小框点击是要计数,如果勾选数目和总数目一致,就选上,否则,取消选中(对于大框)。

然后这里还要注意的就是,在复选框的checked改变后,有一些复选框是点击后会有事件发生的,这时候我们要手动调用函数。

 就像这个,点击大框后,小框选上,结算页面发生改变,我们要手动去调相关函数。

(三)结算页

效果:在我们选中商品之后,结算页要改动价格和数量,结算样式也要改变。

//结算页
    var payNum = document.getElementById("totalNum");
    var pay = document.getElementById("pay");
    if (parseInt(payNum.value) > 0){
        pay.style.cursor = 'pointer';
        pay.style.backgroundColor = '#E04E19';

    }else {
        pay.style.cursor = 'no-drop';
        pay.style.backgroundColor = '#868080';
    }

如果商品数量大于0,光标变为小手,颜色变为橙色,否则,光标变为红色的禁止,颜色变为灰色。关于颜色,可以百度搜色彩拾取器,比较方便。

还有结算的点击函数

window.onload = function (){
    let pay = document.getElementById("pay");
    pay.onclick = function (){
        let totalNum = document.getElementById("totalNum");
        if (totalNum.value > 0){
            alert("好的");
        }
    }
} 

如果商品数量大于0,则弹窗提示,否则,点击无反应。

(四). 对(一)中价格修改函数的完善。

          1.由于在商品选中时,商品数量改变后下方的结算页盒子要发生变化,所以我们在修改完商品数量后要判断是否选中,如果选中了,结算页要修改。修改则是把结算页的件数和总价隐藏域归零,然后将各个被选中的商品条目中的数量和总价加上去,再进行显示。这里代码行数较多,就不放了,思路最重要。

          2.在修改完价格后,对结算盒子的样式要修改,同样根据此时的商品数量来修改。就是再修改价格函数后部分加上前面的对结算样式的修改。

到这里就基本结束了,这是最终的页面,请大家多多指点。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值