Web前端设计模式--购物车拖拽的实现...

设计场景:

           Ben负责的书城网用户量不断增加,书城书籍的类型和数量也在不断扩大,这时候就有客户抱怨,说书城网站的购物车不够智能,体现在需点击图书项上的+号小标才能将它加入购物车,而且如果想要查看自己的购物车内容,还需点击页面购物车图标跳转到购物车内容列表去查看,这种跳转的效果相当糟糕,令一些老年客户抱怨不已,因为他们记忆力不佳,经常要返回查看自己买了什么...

 

设计目标:

          实现购物车智能化...

 

解决方案:

         Ben开始着手来解决,初步构思是建立一个可供商品拖拽的购物车...在这样,在原来的商品列表上只要轻轻一拖,就把商品拖进购物车,直观,方便,关键是可见性好...

        1、 Ben先写了三个样式,商品列表的样式,商品列表副本的样式,购物车中商品列表的样式...

            

 商品列表样式和商品列表副本的样式(副本的样式绝对定位)       

.leftContent 
{
	width:400px;
	height:466px; 
    margin-left:56px; 
	padding:18px;
	border-top:solid 3px #09acf7;
	border-bottom:solid 3px #09acf7;
	border-left:solid 1px #09acf7;
	border-right:solid 1px #09acf7;
	float:left;	
	margin-right:60px;
}

 .BookItem  /*商品列表的样式,绝对定位*/
{
  width:180px;
  height:125px;	
  float:left; overflow:hidden;
  margin-right:20px;
  margin-bottom:20px;
  cursor:move;
}
 
 .BookItemMove /*商品列表副本的样式,相对定位*/
{
  width:180px;
  height:125px;	
  float:left; overflow:hidden;
  margin-right:20px;
  margin-bottom:20px;
  position:absolute;
  background-color:White;
}

.BookItem dl,.BookItemMove dl 
{
  float:left; width:180px; height:125px; float:left; overflow:hidden;
}
.BookItem dl dt,.BookItemMove dl dt
{
	float:left; height:120px; width:80px; margin-right:12px;
}

.BookItem dl dt img,.BookItemMove dl dt img
{ 
	width:80px; height:120px;
}

.BookItem dl dd,.BookItemMove dl dd
{
    height:120px;  line-height:1.8em; font-size:12px; text-decoration:underline; 
}

 

 购物车的样式:

.rightContent
{
    width:430px;
    float:left;
    overflow:hidden;
    height:auto;
    min-height:200px;
 	border-top:solid 3px #09acf7;
	border-bottom:solid 3px #09acf7;
	border-left:solid 1px #09acf7;
	border-right:solid 1px #09acf7;
	padding:18px;
	font-size:12px;
 }


.BookItemN
{
  width:180px;
  height:150px;	
  float:left; overflow:hidden;
  margin-right:20px;
  margin-bottom:20px;
  cursor:move;
  border:solid 1px #09acf7;
}

 .BookItemN img /*删除按钮的样式*/
 {
   float:right; margin:0; padding:0; cursor:pointer; margin-right:5px; margin-top:5px;
 }
 
 
.BookItemN dl 
{
  float:left; width:180px; height:125px; overflow:hidden;padding:0px; margin-left:8px; margin-top:0px;
}
.BookItemN dl dt
{
	float:left; height:120px; width:80px; margin-right:12px;
}

.BookItemN dl dt img
{ 
	width:80px; height:120px;
}

.BookItemN dl dd
{
    height:120px;  line-height:1.8em; font-size:12px; text-decoration:underline; 
}

#container
{
  margin-top:66px;	
}

 

下面是脚本,具体思路是在图书栏中的图书项上建立副本,它的绝对定位的,位置与图书项的位置一样,内容也一样,当鼠标点击副本的时候唤醒副本,副本随着鼠标的移动而移动

如果鼠标移入购物车范围内并点击释放水鼠标左键的时候,就会追加副本的内容到购物车,副本回到原来位置;如过不在购物车范围内,则副本返回原来位置,不执行任何操作...

代码如下:

 //遍历书架,为每个图书项(.BookItem)创建副本
   var ItemNum=$(".BookItem").length;
   var ItemBook=$(".BookItem");            
   for(var i=0;i < ItemNum ; i++)
   {
      var CopyItem=ItemBook.eq(i);
      var left = CopyItem.offset().left;
      var top = CopyItem.offset().top;
      $('body').append('<div class="BookItemMove" id="'+i+'">'+CopyItem.html() +'</div>');//副本绝对定位,位置浮动在原图书项(.BookItem)的上面
      $("#"+i).css({left:left,top:top});
   }
   
     
     
     var currentItem;//当前图书项的全局变量
     var moveStatu=false; areaStatu=false;//moveStatu:判断是否处在移动状态;areaStatu:判断鼠标是否移入购物车范围内
     var objMove= $(".BookItemMove");
     var xx,yy,oriX,oriY;xx,yy,oriX,oriY//分别代表移动项移动之后的坐标值和原始的坐标值
     
     var cartPosition=$(".rightContent").offset();//获取购物车在页面上的位置(上下左右的坐标)
     var carLeft=cartPosition.left; var cartTop=cartPosition.top;     
     var cartRight=carLeft+$(".rightContent").width();
     var cartBottom=cartTop+$(".rightContent").height();
   
     
     
       
      objMove.mousedown(function(e){
           moveStatu=true;//设置移动状态为true
           xx=e.clientX-$(this).offset().left;//获取鼠标到移动项左坐标的距离
           yy=e.clientY-$(this).offset().top; //获取鼠标到移动项顶坐标的距离
           currentItem = $(this);//设置当前的图书项
           currentItem.fadeTo(5,0.5);//  移动时设置半透明度
       })   
       
           
           $(document).mousemove(function(e){
              if(moveStatu)
              {         
                var xxM=e.clientX - xx; //移动后的左坐标
                var yyM=e.clientY - yy; //移动后的顶坐标
                currentItem.css({left:xxM,top:yyM});
                
                if(e.clientX > carLeft && e.clientX < cartRight && e.clientY > cartTop && e.clientY < cartBottom)//这一段很重要,判断移动项目是否在购物车的热点区域内,如果在,areaStatu设置为true,加上边框
                {                
                    areaStatu=true;
                    currentItem.css({border:"dashed 1px #09acf7"}); 
                } 
                
                else {  currentItem.css({border:"none"}); areaStatu=false;}     
                
              }
           })     
           
                      
           
                         vernier=100;//设立游标,为购物车添加的项设立id
                         
           $(document).mouseup(function(){//当鼠标键释放时,见该项追加到购物车内                      
                  if(moveStatu)
                    {  
                                            
                       moveStatu=false;
                       var id = currentItem.attr("id");
                       lefts =  $(".BookItem").eq(id).offset().left;
                       tops = $(".BookItem").eq(id).offset().top;
                       currentItem.css({left:lefts,top:tops,border:"none"});         
                      
                       if(areaStatu)//判断移动项目是否在购物车的热点区域内
                       {     
                         vernier=vernier+1;                 
                          var newItem ='<div class="BookItemN"><img id="'+vernier+'"  src="images/close.jpg" onclick="lala('+vernier+')"/>'+currentItem.html()+'</div>';
                           $('.rightContent').append(newItem);                        
                        } 
                     }   
                     
                          carLeft=cartPosition.left;    
                         cartTop=cartPosition.top;
                         cartRight=carLeft+$(".rightContent").width();
                         cartBottom=cartTop+$(".rightContent").height();
          })       



         function lala(idObj)//根据游标的值来删除购物车内的相应项...
         {
           $("#"+idObj).parents(".BookItemN").remove();          
         }

 

最终效果:

 

 

 

 

设计小结:

          实际项目中购物车的数量超过6条是呈列表显示状态,这边就不弄了,代码比较粗糙,主要是介绍一种思路,这是我在做自己项目中的总结,希望有更好的办法...

 

源码下载:(https://files.cnblogs.com/wzh2010/Drag.rar

posted @ 2010-11-29 09:09  Hello-Brand  阅读(1885)  评论(2编辑  收藏  举报