商城项目日结5

今天完成了商城的购物车功能 ,并细化了css样式使页面看起来更加舒适。
项目地址
购物车代码如下:
html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../lib/bootstrap/dist/css/bootstrap.css">
    <link rel="stylesheet" href="../css/reset.css">
    <link rel="stylesheet" href="../css/common.min.css">
    <link rel="stylesheet" href="../css/index.css">
    <link rel="stylesheet" href="../css/footer.css">
    <link rel="stylesheet" href="../css/cart.css">
</head>
<body style="background-color: #fff;">
<!-- 头部 -->
<div class="layout-header-nav">
    <div class="container"> 
        <p class="header-benefit">
            商城优惠大酬宾,全场满59元包邮
        </p>
        <div class="header-cart">
            <a href="./cart.html" class="header-cart-link">
                <div class="header-cart-button">
                    <div class="header-cart-button-img"></div>
                    <span class="header-cart-button-word">
                      购物车
                    </span>
                </div>
            </a>
        </div>
        <div class="header-nav">
            <a href="./login.html" class="header-nav-item login">登录</a>
            <span class="header-nav-item">|</span>
            <a href="./register.html" class="header-nav-item">注册</a>
            <span class="header-nav-item">|</span>
            <a href="./cart.html" class="header-nav-item">我的订单</a>
            <span class="header-nav-item">|</span>
            <a href="#" class="header-nav-item">帮助中心</a>
            <span class="header-nav-item">|</span>
            <a href="#" class="header-nav-item">TP-LINK官网</a>
        </div>> 
    </div>
</div>

<div class="layout-header-search">
  <div class="container">
      <a href="./index.html">
        <img src="" alt="" class="header-logo">
      </a>
      
  </div>

</div>

<div class="nav_box"> 
    <ul class="container">

    </ul>
</div>
<!-- 购物车 -->
    <div class="container">
         <div class="cart" ></div>
    </div>

    <div class="container" style="height: 100px;">
    </div>
  <!-- footer -->
  <div class="footer-promise">
    <div class="container">
        <img src="http://www.tp-linkshop.com.cn/Content/themes/base/images/Shared/promise.jpg" alt="" class="footer-promise-img">
    </div>
  </div>
  
  <div class="layout-footer-service">
    <div class="container">
        <ul class="footer-service">
            
        </ul>
    </div>
  </div>

    <script src="../lib/jquery/dist/jquery.min.js"></script>
    <script src="../lib/jquery-cookie/jquery.cookie.js"></script>
    <script src="../js/footer.js"></script>
    <script src="../js/cart.js"></script>
</body>
</html>

js:

// 从localStorage中获取购物车列表
    var cartList = JSON.parse(localStorage.getItem('cartList'))
    var newCartList=JSON.parse(localStorage.getItem('cartList'))
    //判断购物车列表中是不是有东西
    if (!cartList) {
      alert('购物车空空如也')
    } else {
      // 渲染页面
      bindHtml()
      // 添加事件功能
      bindEvent()
    }

    function bindHtml() {
      // 整体渲染页面
      // 全选按钮需要渲染
      //   判断一下, 如果数组里面每一个数据的 isSelect 都是 true, 就渲染成 true
      //   只要有任意一个数组的 isSelect 是 false. 就渲染成 false
      let selectAll = cartList.every(item => {
        // 如果每一条都是 true, 就会返回 true
        // 如果任意一条是 false, 就会返回 false
        return item.isSelect === true
      })

      let str = `
        <div class="top">
          <input class="selectAll" type="checkbox" ${ selectAll ? 'checked' : '' }>   全选
        </div>
        <ul class="center">
      `

      cartList.forEach(item => {
        // 每一条数据的渲染, 根据每一条信息来渲染页面
        str += `
          <li>
            <div class="select">
              <input data-id=${ item.list_id } class="selectOne" type="checkbox" ${ item.isSelect ? 'checked' : '' } >
            </div>
            <div class="info">
              <div class="cart-product-img">
              <img src="${ item.list_url }" alt="" class="cart-product-img-item">
              </div>
              <div class="cart-product-name">
              <p>${ item.list_name }</p>
              </div>
            </div>
            <p class="price">¥${ item.list_price }</p>
            <div class="number">
              <button class="sub" data-id=${ item.list_id }>-</button>
              <input type="text" value="${ item.number }" class="cart-product-numbers">
              <button class="add" data-id=${ item.list_id }>+</button>
            </div>
            <p class="subtotal">¥${ item.subtotal.toFixed(2) }</p>
            <div class="del" data-id=${ item.list_id }">删除</div>
          </li>
        `
      })

      // 选中商品数量需要渲染
      //   要把数组中的 isSelect 为 true 的数据的 number 加再一起
      //   数组常用方法叫做 filter 就能筛选数据
      let selectArr = cartList.filter(item => item.isSelect)
      // console.log(selectArr)

      // 选中商品数量计算
      let selectNumber = 0
      // 选中商品总价
      let selectPrice = 0
      selectArr.forEach(item => {
        selectNumber += item.number
        selectPrice += item.subtotal
      })

      // 去支付要不要禁用, 如果没有选中的商品, 就应该禁用
      //   只要有选中的商品, 就应该不禁用
      //   直接使用 selectArr 的 length 来判断

      str += `
        </ul>
        <div class="bottom">
          <p class="select-num">选中商品数量:  <span class="select-num-p">${ selectNumber }</span></p>
          <p class="fee-total">总价: <span class="count-price">¥${ selectPrice.toFixed(2) }</span></p>
          <button class="clear">清空购物车</button>
          <button class="pay" ${ selectArr.length ? '' : 'disabled'}> 去结算 ></button>
        </div>
      `

      // 整体添加到页面的盒子里面
      $('.cart').html(str)
    }

    function bindEvent() {
      //  全选按钮的事件
      $('.cart').on('change', '.selectAll', function () {
        // 让数组里面的每一个数据的 isSelect 都变成 自己的状态
        cartList.forEach(item => {
          item.isSelect = this.checked
        })

        重新渲染页面
        bindHtml()

        // 在从新存储一遍 localStorage
        localStorage.setItem('cartList', JSON.stringify(cartList))
      })

      // 单选按钮的事件
      $('.cart').on('change', '.selectOne', function () {
        // console.log($(this).data('id'))
        // 你要知道你点击的是哪一个数据的单选按钮
        const id = $(this).data('id')

        // 找到数组中 id 一样的那一条数据改变一下 isSelect 属性
        cartList.forEach(item => {
          if (item.list_id === id) {
            item.isSelect = !item.isSelect
          }
        })

        //重新渲染页面
        bindHtml()

        // 存储在lcoalStorage 里面
        localStorage.setItem('cartList', JSON.stringify(cartList))
      })

      //  减少商品数量的事件
      $('.cart').on('click', '.sub', function () {
        const id = $(this).data('id')

        // 循环数组, 把 id 对应的这个数据的 number 和 小计修改了
        cartList.forEach(item => {
          if (item.list_id === id) {
            // 当 item.number === 1 的时候, 不需要 --
            item.number > 1 ? item.number-- : ''
            item.subtotal = item.list_price * item.number
          }
        })

        //重新渲染页面
        bindHtml()

        // 存储到 localStorage
        localStorage.setItem('cartList', JSON.stringify(cartList))
      })

      //添加商品数量按钮的事件
      $('.cart').on('click', '.add', function () {
        // 拿到自己身上存储的 id
        const id = $(this).data('id')

        // 循环数组找到一个id 对应的数据
        cartList.forEach(item => {
          if (item.list_id === id) {
            item.number++
            item.subtotal = item.number * item.list_price
            
          }
        })

        // 重新渲染页面
        bindHtml()

        // 存储到 localStorage
        localStorage.setItem('cartList', JSON.stringify(cartList))
      })

      //点击删除的事件 
     
      $('.cart').on('click', '.del', function () {
        // 获取 按钮id
        const id = $(this).data('id')
        
        
        // var len=cartList.length
        // for (var i=0;i<len;i++){
        //         if(cartList[i].list_id == id){
        //             cartList.splice(i,1)
        //         }
        //  }
        let newCartList= cartList.filter(item=>{
            return item.list_id !== id
        })
        
        cartList=newCartList

        console.log(cartList)
        console.log(newCartList)
    
    
        //渲染
       bindHtml()
         
       // 存储到 localStorage
       localStorage.setItem('cartList', JSON.stringify(cartList))
    })
   
      //清空购物车
      $('.cart').on('click', '.clear', function () {
        let newCartList3=[];

       cartList=[]

        bindHtml()

        // 存储到 localStorage
        localStorage.setItem('cartList', JSON.stringify(cartList))
        
      })
    }

css样式

.cart {
    width: 1200px;
    margin: 30px auto;
    display: flex;
    flex-direction: column;
   background-color: #fff;
}
.cart >.top{
    height: 60px;
    display: flex;
    align-items: center;
    font-size: 14px;
    color: #666;
    line-height: 20px;
    margin-top: 9px;
    
}
.cart >.top > input {
    width: 12px;
    height: 12px;
    margin-left: 55px;
  }
.cart >.top > p {
    padding-left: 40px;
  }

.cart >.center >li{
    display: flex;
    margin: 10px;
    border-top:1px solid #CCC ;
}
.cart >.center >li >.select{
    width: 100px;
    display: flex;
    justify-content: center;
    align-items: center;
}

.cart >.center >li >.select  > input {
    width: 12px;
    height: 12px;
    background-image: url(http://www.tp-linkshop.com.cn/shopping/cart/Content/themes/base/images/Shopping/Choose.png);
  }
/* .cart >.center >li >.select  > input:checked {
    background: lightskyblue;
} */
.checkbox{
    background-color: #fff;
        border: 1px solid #bfbfbf;
        display: inline-block;
        height: 0.9em;
        padding: 2px;
        border-radius: 100%;
        margin-right: 5px;
        margin-top: -2px;
        vertical-align: middle;
        width: 0.9em;
        line-height: 1;
        box-sizing: content-box;
}
.checkbox:checked{
    background-color: #ffd958;
    content: "";
    display: inline-block;
    height: 0.9em;
    width: 0.9em;
    vertical-align: top;
    border-radius: 100%;
}
.cart >.center >li > .info {
    display: flex;
    align-items: center;
    font-size: 30px;
    
  }

.cart >.center >li > .info > img {
    width: 100px;
    height: 100px;
    display: block;
    margin-right: 10px;
}

.cart >.center >li> .price {
    display: flex;
    align-items: center;
    margin-left: 50px;
    font-size: 14px;
    color: #FF3232;
    line-height: 20px;
    
  }
.cart >.center >li> .number {
    margin-left: 80px;
    display: flex;
    align-items: center;
}

/* .cart >.center >li> .number> input {
    height: 30px;
    border: none;
    outline: none;
    width: 100px;
    text-align: center;
    font-size: 20px;
} */

.cart >.center >li> .subtotal {
    display: flex;
    align-items: center;
    margin-left: 80px;
    font-size: 14px;
    color: #FF3232;
    line-height: 20px;
  }
.cart >.center >li> .del {
    margin-left: 80px;
    display: flex;
    align-items: center;
    cursor: pointer;
    font-size: 14px;
        color: #333;
}
.cart > .bottom {
    height: 120px;
    border-top:1px solid #CCC;
    font-size: 35px;
    display: flex;
    align-items: center;
}
.cart > .bottom > p {
    padding-right: 40px;
}
.cart > .bottom  > button {
    margin-right: 40px;
    
}



.cart-product-name{
    
        height: 120px;
        width: 300px;
        float: left;
        line-height: 120px;
        font-size: 14px;
        color: #333;
}
.cart-product-img {
    height: 120px;
    width: 172px;
    float: left;
}
.cart-product-img-item {
    display: block;
    width: 100px;
    height: 100px;
    margin-top: 10px;
}
.sub{
    width: 32px;
    height: 36px;
    background-color: #F7F7F7;
    font-size: 16px;
    line-height: 36px;
    text-align: center;
    color: #333;
    border: 1px solid #CCC;
    /* float: left; */
    cursor: pointer;
}
.add{
    width: 32px;
    height: 36px;
    background-color: #F7F7F7;
    font-size: 16px;
    line-height: 36px;
    text-align: center;
    color: #333;
    border: 1px solid #CCC;
    /* float: left; */
    cursor: pointer;
}
.cart-product-numbers{
    width: 52px;
    height: 36px;
    background-color: #FFF;
    font-size: 16px;
    color: #333;
    line-height: 36px;
    text-align: center;
    display: block;
    float: left;
    border: none;
    border-top: 1px solid #CCC;
    border-bottom:1px solid #CCC
}
.select-num{
    width: 200px;
    font-size: 14px;
    color: #333;
    line-height: 19px;
    float: left;
    margin-left: 55px;
}
.fee-total{
    width: 250px;
    font-size: 18px;
    margin-left: 500px;
    color: #333;
    line-height: 30px;
    
}
.count-price{
    font-size: 18px;
    color: #FF3232;
    line-height: 24px;
}
.clear{
    border: 1px solid #FF3232;
    border-radius: 2px;
    width: 160px;
    height: 48px;
    float: right;
    margin-right: 16px;
    font-size: 16px;
    color: #FF3232;
    line-height: 48px;
    text-align: center;
    background-color: #fff;
}
.pay{
    background-color: #FF3232;
    border: 1px solid #FF3232;
    border-radius: 2px;
    width: 160px;
    height: 48px;
    float: right;
    font-size: 16px;
    color: #FFF;
    line-height: 48px;
    text-align: center;
}
.select-num-p{
    color:blue;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值