zoukankan      html  css  js  c++  java
  • JS实现购物车特效

    1. 实现兼容低版本IE的getElementsByClassName()方法

    2. JS表格操作

    3. 通过parseInt(),parseFloat()把字符串转换成数字

    4. 通过toFixed()把数字格式化成指定位数的小数

    5. 事件代理的运用

    效果图:

    border-collapse有两个值可以选择,分别是collapse和separate,就是合并边框和分离边框,分离边框之下又可以设置间距和边框样式
    border-spacing:2em 4em;(设置右间距和下间距)
    border-style:none solid dashed dotted;(分别设置上右下左的样式)

     html结构:

    复制代码
     1 <table id="cartTable">
     2     <thead>
     3         <tr>
     4            <th><label><input class="check-all check" type="checkbox"/>&nbsp;全选</label></th>
     5             <th>商品</th>
     6             <th>单价</th>
     7             <th>数量</th>
     8             <th>小计</th>
     9             <th>操作</th>
    10         </tr>
    11     </thead>
    12     <tbody>
    13         <tr>
    14             <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
    15             <td class="goods"><img src="images/1.jpg" alt="" /><span>Casio/卡西欧 EX-TR350</span></td>
    16             <td class="price">5999.88</td>
    17             <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td>
    18             <td class="subtotal">5999.88</td>
    19             <td class="operation"><span class="delete">删除</span></td>
    20         </tr>
    21         <tr>
    22             <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
    23             <td class="goods"><img src="images/2.jpg" alt="" /><span>Canon/佳能 PowerShot SX50 HS</span></td>
    24             <td class="price">3888.50</td>
    25             <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td>
    26             <td class="subtotal">3888.50</td>
    27             <td class="operation"><span class="delete">删除</span></td>
    28         </tr>
    29         <tr>
    30             <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
    31             <td class="goods"><img src="images/3.jpg" alt="" /><span>Sony/索尼 DSC-WX300</span></td>
    32             <td class="price">1428.50</td>
    33             <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td>
    34             <td class="subtotal">1428.50</td>
    35             <td class="operation"><span class="delete">删除</span></td>
    36         </tr>
    37         <tr>
    38             <td class="checkbox"><input class="check-one check" type="checkbox" /></td>
    39             <td class="goods"><img src="images/4.jpg" alt="" /><span>Fujifilm/富士 instax mini 25</span></td>
    40             <td class="price">640.60</td>
    41             <td class="count"><span class="reduce"></span><input class="count-input" type="text" value="1"/><span class="add">+</span></td>
    42             <td class="subtotal">640.60</td>
    43             <td class="operation"><span class="delete">删除</span></td>
    44         </tr>
    45     </tbody>
    46 </table>
    47 <div class="foot" id="foot">
    48     <label class=" fl select-all"><input type="checkbox" class="check-all check" />&nbsp;全选</label>
    49     <a class="fl delete" id="deleteAll" href="javascript:;">删除</a>
    50     <div class="fr closing">结 算</div>
    51     <div class="fr total">合计:¥<span id="priceTotal">0.00</span></div>
    52     <div class="fr select" id="selected">已选商品<span id="selectedTotal">0</span>件<span class="arrow up">︽</span><span class="arrow down">︾</span></div>
    53     <div class="selected-view">
    54         <div id="selectedViewList" class="clearfix">
    55             <div><img src="images/1.jpg"><span>取消选择</span></div>
    56         </div>
    57         <span class="arrow">◆<span>◆</span></span>
    58     </div>
    59 </div>
    复制代码

    css代码:

    复制代码
      1 *{
      2         margin: 0;
      3         padding: 0;
      4     }
      5     a{
      6         color: #666;
      7         text-decoration: none;
      8     }
      9     body{
     10         padding:20px;
     11         color: #666;
     12     }
     13     .fl{
     14         float: left;
     15     }
     16     .fr{
     17         float: right;
     18     }
     19     table{
     20         border-collapse: collapse;
     21         border-spacing: 0;
     22         border: 0;
     23         text-align: center;
     24          937px;
     25     }
     26     th,td{
     27         border: 1px solid #cadeff;
     28     }
     29     th{
     30         background: #e2f2ff;
     31         border-top: 3px solid #a7cbff;
     32         height: 30px;
     33     }
     34     td{
     35         padding: 10px;
     36         color: #444;
     37     }
     38     tbody tr:hover{
     39         background: RGB(238,246,255);
     40     }
     41     .checkbox{ 60px;}
     42     .goods{ 300px;}
     43     .goods span{
     44          180px;
     45         margin-top: 20px;
     46         text-align: left;
     47         float: left;
     48     }
     49     .price{ 130px;}
     50     .count{ 90px;}
     51     .count .add, .count input, .count .reduce{
     52         float: left;
     53         margin-left: -1px;
     54         position: relative;
     55         z-index: 0;
     56     }
     57     .count .add, .count .reduce{
     58         height: 23px;
     59          17px;
     60         border: 1px solid #e5e5e5;
     61         background: #f0f0f0;
     62         text-align: center;
     63         line-height: 23px;
     64         color: #444;
     65     }
     66     .count .add:hover, .count .reduce:hover{
     67         color: #f50;
     68         z-index: 3;
     69         border-color: #f60;
     70         cursor: pointer;
     71     }
     72     .count input{
     73          50px;
     74         height: 15px;
     75         line-height: 15px;
     76         border: 1px solid #aaa;
     77         color: #343434;
     78         text-align: center;
     79         padding: 4px 0;
     80         background-color: #fff;
     81         z-index: 2;
     82     }
     83     .subtotal{
     84          150px;
     85         color: red;
     86         font-weight: bold;
     87     }
     88     .operation{ 80px;}
     89     .operation span:hover, .a:hover{
     90         cursor: pointer;
     91         color: red;
     92         text-decoration: underline;
     93     }
     94     img{
     95          100px;
     96         height: 80px;
     97         margin-right: 10px;
     98         float: left;
     99     }
    100     .foot{
    101          935px;
    102         margin-top: 10px;
    103         color: #666;
    104         height: 48px;
    105         border: 1px solid #c8c8c8;
    106         background-image: linear-gradient(RGB(241,241,241),RGB(226,226,226));
    107         position: relative;
    108         z-index: 8;
    109     }
    110     .foot div, .foot a{
    111         line-height: 48px;
    112         height: 48px;
    113     }
    114     .foot .select-all{
    115          100px;
    116         height: 48px;
    117         line-height: 48px;
    118         padding-left: 5px;
    119         color: #666;
    120     }
    121     .foot .closing{
    122         border-left: 1px solid #c8c8c8;
    123          100px;
    124         text-align: center;
    125         color: #000;
    126         font-weight: bold;
    127         background: RGB(238,238,238);
    128         cursor: pointer;
    129     }
    130     .foot .total{
    131         margin: 0 20px;
    132         cursor: pointer;
    133     }
    134     .foot #priceTotal, .foot #selectedTotal{
    135         color: red;
    136         font-family: "微软雅黑";
    137         font-weight: bold;
    138     }
    139     .foot .select{
    140         cursor: pointer;
    141     }
    142     .foot .select .arrow{
    143         position: relative;
    144         top: -3px;
    145         margin-left: 3px;
    146     }
    147     .foot .select .down{
    148         position: relative;
    149         top: 3px;
    150         display: none;
    151     }
    152     .show .select .down{
    153         display: inline;
    154     }
    155     .show .select .up{
    156         display: none;
    157     }
    158     .foot .select:hover .arrow{
    159         color: red;
    160     }
    161     .foot .selected-view{
    162          935px;
    163         border: 1px solid #c8c8c8;
    164         position: absolute;
    165         height: auto;
    166         background: #fff;
    167         z-index: 9;
    168         bottom: 48px;
    169         left: -1px;
    170         display: none;
    171     }
    172     .show .selected-view{display: block;}
    173     .foot .selected-view div{height: auto;}
    174     .foot .selected-view .arrow{
    175         font-size: 16px;
    176         line-height: 100%;
    177         color: #c8c8c8;
    178         position: absolute;
    179         right: 330px;
    180         bottom: -9px;
    181     }
    182     .foot .selected-view .arrow span{
    183         color: #fff;
    184         position: absolute;
    185         left: 0;
    186         bottom: 1px;
    187     }
    188     #selectedViewList{
    189         padding: 20px;
    190         margin-bottom: -20px;
    191     }
    192     #selectedViewList div{
    193         display: inline-block;
    194         position: relative;
    195          100px;
    196         height: 80px;
    197         border: 1px solid #ccc;
    198         margin: 10px;
    199     }
    200     #selectedViewList div span{
    201         display: none;
    202         color: #fff;
    203         font-size: 12px;
    204         position: absolute;
    205         top: 0;
    206         right: 0;
    207          60px;
    208         height: 18px;
    209         line-height: 18px;
    210         text-align: center;
    211         background: RGBA(0,0,0,.5);
    212         cursor: pointer;
    213     }
    214     #selectedViewList div:hover span{
    215         display: block;
    216     }
    复制代码

    js部分:

    1)实现商品的全选功能及数量和价格的计算

    复制代码
     1 var cartTable = document.getElementById('cartTable');
     2         var tr = cartTable.children[1].rows;//获取table下的tbody下的每一行
     3         var checkInputs = document.getElementsByClassName('check');
     4         var checkAllInputs = document.getElementsByClassName('check-all');
     5         var selectedTotal = document.getElementById('selectedTotal');
     6         var priceTotal = document.getElementById('priceTotal');
     7         //计算总数和价格
     8         function getTotal(){
     9             var selected = 0;
    10             var price = 0;
    11             for(var i=0;i < tr.length; i++){
    12                 if(tr[i].getElementsByTagName('input')[0].checked){
    13                     selected += parseInt(tr[i].getElementsByTagName('input')[1].value);
    14                     price += parseFloat(tr[i].cells[4].innerHTML);//cells属性为获得tr下面的td
    15                 }
    16             }
    17             selectedTotal.innerHTML = selected;
    18             priceTotal.innerHTML = price.toFixed(2);//保留两位小数
    19         }
    20         for(var i=0;i<checkInputs.length;i++){
    21             checkInputs[i].onclick = function(){
    22                 if(this.className === 'check-all check'){//如果点击的是全选按钮,则使所有按钮的状态和它相同
    23                     for(var j=0;j<checkInputs.length;j++){
    24                         checkInputs[j].checked = this.checked;
    25                     }
    26                 }
    27                 if(this.checked == false){//如果其中一个变为未选中状态,则使全选按钮取消选中
    28                     for(var i=0;i<checkAllInputs.length;i++){
    29                         checkAllInputs[i].checked = false;
    30                     }
    31                 }
    32                 getTotal();
    33             }
    34         }
    复制代码

    2)点击已选商品实现商品预览浮层的功能

    点击已选商品时会显示出已选择商品的列表

    同时在getTotal()函数中增加新创建的div

    js代码:

    复制代码
     1 function getTotal(){
     2             var selected = 0;
     3             var price = 0;
     4             var HTMLstr = '';
     5             for(var i=0;i < tr.length; i++){
     6                 if(tr[i].getElementsByTagName('input')[0].checked){
     7                     tr[i].className = 'on';
     8                     selected += parseInt(tr[i].getElementsByTagName('input')[1].value);
     9                     price += parseFloat(tr[i].cells[4].innerHTML);//cells属性为获得tr下面的td
    10                     HTMLstr += '<div><img src="'+ tr[i].getElementsByTagName('img')[0].src + '"><span>取消选择</span></div>';
    11                 }
    12                 else{
    13                     tr[i].className = '';
    14                 }
    15             }
    16             selectedTotal.innerHTML = selected;
    17             priceTotal.innerHTML = price.toFixed(2);//保留两位小数
    18             selectedViewList.innerHTML = HTMLstr;
    19             if(selected == 0){
    20                 foot.className = 'foot';
    21             }
    22         }
    23         for(var i=0;i<checkInputs.length;i++){
    24             checkInputs[i].onclick = function(){
    25                 if(this.className === 'check-all check'){//如果点击的是全选按钮,则使所有按钮的状态和它相同
    26                     for(var j=0;j<checkInputs.length;j++){
    27                         checkInputs[j].checked = this.checked;
    28                     }
    29                 }
    30                 if(this.checked == false){//如果其中一个变为未选中状态,则使全选按钮取消选中
    31                     for(var i=0;i<checkAllInputs.length;i++){
    32                         checkAllInputs[i].checked = false;
    33                     }
    34                 }
    35                 getTotal();
    36             }
    37         }
    38 
    39         selected.onclick = function(){
    40             if(foot.className == 'foot'){
    41                 if(selectedTotal.innerHTML != 0){
    42                     foot.className = 'foot show';
    43                 }
    44             }else{
    45                 foot.className = 'foot';
    46             }
    47         }
    复制代码

     3)商品列表中的取消选择与事件代理

    已选商品列表中没有appendChild的时候div和span都不存在,所以要使用事件代理。

    复制代码
    1  selectedViewList.onclick = function(e){
    2             var el = e.srcElement;
    3             if(el.className == 'del'){
    4                 var index = el.getAttribute('index');
    5                 var input = tr[index].getElementsByTagName('input')[0];
    6                 input.checked = false;
    7                 input.onclick();
    8             }
    9         }
    复制代码

    4)实现增减商品数量及小计价格的计算

    复制代码
     1 //增减商品数量事件代理
     2         for(var i=0;i<tr.length;i++){
     3             tr[i].onclick = function(e){
     4                 e = e|| window.event;
     5                 var el = e.srcElement;
     6                 var cls = el.className;
     7                 var input = this.getElementsByTagName('input')[1];
     8                 var val = parseInt(input.value);
     9                 var reduce = this.getElementsByTagName('span')[1];
    10                 switch (cls){
    11                     case 'add':
    12                         input.value = val + 1;
    13                         reduce.innerHTML = '-';
    14                             getsubTotal(this);
    15                         break;
    16                     case 'reduce':
    17                         if(val > 1){
    18                             input.value = val - 1;
    19                             getsubTotal(this);
    20                         }else{
    21                             reduce.innerHTML = '';
    22                         }
    23                 }
    24                 getTotal();
    25             }
    26             tr[i].getElementsByTagName('input')[1].onkeyup = function(){
    27                 var val = parseInt(this.value);
    28                 var tr = this.parentNode.parentNode;//this指的是当前的input,其父节点的父节点就是当前的tr
    29                 var reduce = tr.getElementsByTagName('span')[1];
    30                 if(isNaN(val) || val < 1){
    31                     val = 1;
    32                 }
    33                 this.value = val;//保证输入框中都是大于1的纯数字
    34                 if(val <= 1){
    35                     reduce.innerHTML = '';
    36                 }
    37                else{
    38                     reduce.innerHTML = '-';
    39                 }
    40                 getsubTotal(tr);
    41                 getTotal();
    42             }
    43         }
    复制代码

     5)实现删除商品功能

    学会用for循环删除数组中的一些数据时要回置下标 i 。

    复制代码
     1  //删除商品
     2         deleteAll.onclick = function(){
     3             if(selectedTotal.innerHTML != '0'){
     4                 var conf = confirm("确定要删除所选商品吗");
     5                 if(conf){
     6                     for(var i=0;i<tr.length;i++){
     7                         var input = tr[i].getElementsByTagName('input')[0];
     8                         if(input.checked){
     9                             tr[i].parentNode.removeChild(tr[i]);
    10                             i --;//因为删除数组中的一个后,后面的索引就会向前移,此时要让i也向前移一个,回置下标i
    11                         }
    12                     }
    13                     getTotal();
    14                 }
    15             }
    16         }
    复制代码
  • 相关阅读:
    ABAP Webdynpro Interface View的用法
    ABAP Webdynpro的跟踪工具WD_TRACE_TOOL
    git 速查
    Python 解析含有命名空间(xmlns)的xml文件(基于ElementTree)
    完全显示DataFrame中行、列内容
    解决Jupyter Notebook中for循环输出DataFrame不够美观
    git配置别名
    元素可拖拽(移动端与pc端)
    pointer network和recursive神经网络
    ELMO,BERT和GPT简介
  • 原文地址:https://www.cnblogs.com/Jansens520/p/6685733.html
Copyright © 2011-2022 走看看