在html5之前,网页当中实现拖拽要借助到js中的(onmousedown+onmousemove),现在html5内部就支持了拖拽的功能,结合js调用脚本监听拖曳的事件,完成一些拖放的操作。同时,拖放功能还可以与Html5的文件操作相结合,实现拖曳文件上传。
(浏览器支持:Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 )
下面是一个图片拖拽排序的实例,拖动第一个图片,会变成透明,松开鼠标后会调换位置,完成一次排序
拖曳前 拖曳后
本例来自于:《HTML5网页开发实例详解》9.4
<script>
(function () {
var slice = Array.prototype.slice,
list = slice.call(document.getElementsByTagName('div'), 0), // 商品元素列表数组
move_item; // 当前拖动元素
list.forEach(function (item) { // 循环数组,监听元素事件
item.addEventListener('dragstart', function (e) { // 拖动开始触发
e.dataTransfer.effectAllowed = 'move'; // 设置拖动允许的事件行为
e.dataTransfer.setData('html', e.target.innerHTML); // 保存目标元素结构至拖拽数据中
this.style.opacity = '0.4';
this.classList.add('moving');
move_item = item; // 将目标元素保存在闭包变量中
}, false);
item.addEventListener('dragenter', function (e) { // 拖入元素边界内触发
e.target.classList.add('over');
}, false);
item.addEventListener('dragover', function (e) { // 元素在目标元素上移动
e.preventDefault(); // 阻止元素默认时间,保证drop被触发
e.target.classList.add('over');
}, false);
item.addEventListener('dragleave', function (e) { // 元素离开目标元素触发
e.target.classList.remove('over');
}, false);
item.addEventListener('drop', function (e) { // 拖拽元素放在目标元素内
var target = e.target;
if (move_item != target) { // 拖动元素与放置元不同
move_item.innerHTML = item.innerHTML; // 将被拖放元素结构填充为放置元素
item.innerHTML = e.dataTransfer.getData('html'); // 设置拖放元素结构为被拖放元素
};
}, false);
item.addEventListener('dragend', function (e) { // 拖拽完毕后触发
this.style.opacity = '1';
list.forEach(function (item) {
item.classList.remove('moving'); // 移除拖动样式
});
}, false);
});
})();
</script>


说点什么
欢迎讨论