html5 拖拽demo,HTML5拖拽+demo

有两个星期没写博客了,今天晚上和兄弟出去喝了几杯酒,乘着酒意写下这篇两个星期前一直想写的博客,再坚持一会就双12了,抢个商品,哎不废话了,说正经事。 拖拽事件类似于鼠标的一系列事件,有

ondragstart,对象是被拖拽元素

ondrag,对象是被拖拽元素

ondragenter,对象是目标元素

ondragover,对象是目标元素

ondragleave,对象是目标元素

ondrop,对象是目标元素

ondragend,对象是被拖拽元素

拖拽(拖放)大致分为两个过程,即拖(drag)与放(drop),所以下文都称为拖放,HTML5的拖放事件用起来简单,主要得益于可以通过event对象获得拖拽的相关数据,即获取到被拖对象和目标位置对象。

ev.dataTransfer.setData("Text",ev.target.id);

ev.dataTransfer.getData("Text");

而获得目标对象是通过ev.target方法,所以认识到了这两点就抓住了拖放的主要内容。 下面是我自己写的一个小demo。 html代码如下:

拖动客户制定计划

  • 拖拽我1
  • 拖拽我2
  • 拖拽我3
  • 拖拽我4

周一

周二

周三

周四

周五

周六

周日

css代码如下:

#left_out{

width: 180px;

height: 400px;

float: left;

border: 1px solid #cccccc;

margin-right: 5PX;

}

#header_name{

padding: 10px;

text-align: center;

background: #cccccc;

}

#left_out #header_name h2{

font-weight: 900;

font-size: 16px;

}

#left_out ul{

width: 180px;

height: 400px;

}

#left_out ul li{

margin-top: 3px;

font-size: 14px;

}

#left_out ul li:hover{

background-color: #bababa;

cursor: move;

}

.weekBox{

float: left;

width: 150px;

border: 1px solid #bababa;

height: 400px;

}

#right_out h2{

width:100%;

height: 40px;

line-height: 40px;

font-weight: 900;

text-align: center;

background: #cccccc;

}

js代码如下(得引入jQuery包):

// 给li元素添加拖拽相关的属性

$("#left_out ul li").attr("draggable","true").attr("ondragstart","drag(event)").each( function (index,ele){

$(this).attr("id",'li'+index);

});

// 给右边目的地添加拖拽相关的属性

$("#right_out .weekBox").attr("ondragover","allowDrop(event)").attr("ondrop","drop(event)");

// 给左边目的地添加拖拽相关的属性

$("#left_out ul").attr("ondragover","allowDrop(event)").attr("ondrop","dropRemove(event)");

// 下面都是原生js

function allowDrop(ev)

{

ev.preventDefault();

ev.stopPropagation();

}

function drag(ev)

{

ev.dataTransfer.setData("Text",ev.target.id);

}

function dragRemove(ev)

{

ev.dataTransfer.setData("Text",ev.target.id);

}

// enter右边元素时高亮

function dragenter(ev){

// 需判断,如果被拖拽元素来源于左边才高亮

var data=ev.dataTransfer.getData("Text");

console.log(data)

var drapNode=document.getElementById(data);

console.log(drapNode)

var drapNodeId=$(drapNode).attr("id") || "";

console.log(drapNodeId)// getAttribute()这方法谷歌不兼容

if(!(drapNodeId.indexOf("Right")==-1)){

return false

}

$(ev.target).css({

"color":"#FFFFFF", //Object.style这方法火狐不兼容

"backgroundColor":"red"

});

}

// leave右边元素时恢复,不高亮

function dragleave(ev){

$(ev.target).css({

"color":"#000000",

"backgroundColor":"#FFFFFF"

});

}

var index=0;

function drop(ev)

{

// 克隆拖动的元素,如果拖动的元素来源于左边,则添加到右边或替换右边的元素,如果不是,则return false。

ev.preventDefault();

ev.stopPropagation();

var data=ev.dataTransfer.getData("Text");

var drapNode=document.getElementById(data).cloneNode(true);

var drapNodeId=drapNode.id;

if(!(drapNodeId.indexOf("Right")==-1)){

return false

}

// 给准备拖放在右边的元素添加可以拖回左边的属性

drapNode.setAttribute("id",drapNodeId+"Right"+index);

index++;

drapNode.setAttribute("ondragstart","dragRemove(event)")

drapNode.style.cursor="move";

drapNode.title="拖拽我回家"

drapNode.style.border="1px solid #cccccc"

drapNode.style.marginTop="2px"

if(ev.target.id.indexOf("li")==-1){

//添加

ev.target.appendChild(drapNode); // 在目标位置上添加

}else{

//替换

ev.target.parentNode.insertBefore(drapNode,ev.target)

ev.target.parentNode.removeChild(ev.target);

}

var rightList=document.getElementById("right_out").getElementsByTagName("li");

for(var i=0;i

rightList[i].setAttribute("ondragenter","dragenter(event)");

rightList[i].setAttribute("ondragleave","dragleave(event)");

}

}

// 这个函数用于实现将右边的元素拖回左边的功能,判断拖动的元素是否来源于右边,若是则删除拖动的元素,否则返回false。

function dropRemove(ev)

{

ev.preventDefault();

ev.stopPropagation();

var data=ev.dataTransfer.getData("Text");

var drapNode=document.getElementById(data);

var drapNodeId=drapNode.id;

if(drapNodeId.indexOf("Right")==-1){

return false

}

drapNode.parentNode.removeChild(drapNode);

}

效果图如下:

2e74a944dc393f726bb85a836728b3bb.png

效果为:最左侧的li元素可以拖到右侧的七个div中,还可以进行替换并且高亮,右侧七个div中的li元素可以拖回最左侧进行删除。 感觉js写的有点乱,后面有时间再改吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值