Hammer.js 移动端手势库,多点触控插件
jquery用法:
引入3个JS:
<script src="jquery.js"></script>
<script src="hammer.js"></script>
<script src="jquery.hammer.js"></script>
$(".myElement").hammer().bind("tap", function(ev) {
$(this).addClass("red");
console.log(ev);
}).bind("press", function(ev) {
$(this).removeClass("red");
console.log("press");
});
//下面写在一起
拖动:
<div id="myElement" style="position:fixed;"> </div> var getCss = function(o,key){
return o.currentStyle? o.currentStyle[key] : document.defaultView.getComputedStyle(o,false)[key];
}; function drag(element){
element.style.top = getCss(element,"top");
element.style.left = getCss(element,"left");
var hammer = new Hammer(element);//hammer实例
var x = ;
var y = ;
hammer.on('panstart',function(event){
console.log("panstart");
x = parseInt(element.style.left);
y = parseInt(element.style.top);
});
hammer.on('panmove',function(event){
console.log("panmove");
element.style.top = y + event.deltaY + "px";
element.style.left = x + event.deltaX + "px";
});
hammer.on('panend',function(event){
console.log("panend");
});
}
var myElement = document.getElementById("move-box");
drag(myElement);
一般用法:
<script src="hammer.js"></script> var myElement = document.getElementById('myElement');
var mc = new Hammer(myElement); mc.get('pan').set({ direction: Hammer.DIRECTION_ALL });
mc.on("panleft panright panup pandown tap press", function(ev) {
if(ev.type == "press"){
obj.addClass("red")
}else {
obj.removeClass("red");
}
});
官网:
在线调试:
http://codepen.io/jtangelder/pen/lgELw
网上:
http://www.tuicool.com/articles/VNRjym7
http://blog.csdn.net/kongjiea/article/details/43016085
----------------- 原生JS:
JS拖拽移动位置(手机端)
<div id="div" style="width:100px;height:100px;background-color:red;position:absolute;"></div>
<script>
var div = document.getElementById('div');
div.addEventListener('touchmove', function(event) {
event.preventDefault();//阻止其他事件
// 如果这个元素的位置内只有一个手指的话
if (event.targetTouches.length == ) {
var touch = event.targetTouches[]; // 把元素放在手指所在的位置
div.style.left = touch.pageX + 'px';
div.style.top = touch.pageY + 'px';
div.style.background = "green";
}
}, false);
</script>
JQUERY手机长按触发事件(手机端)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" Content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0">
<title>fdsa</title>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
</head>
<body>
<div id="div" style="width:100px;height:100px;background:#ddd;position:absolute;"></div>
<script>
//长按事件
$.fn.longPress = function (fn) {
var timeout = undefined;
var $this = this;
for (var i = ; i < $this.length; i++) {
$this[i].addEventListener('touchstart', function (event) {
timeout = setTimeout(fn, );
}, false);
$this[i].addEventListener('touchend', function (event) {
clearTimeout(timeout);
}, false);
}
}; //阻止浏览器 复制粘贴等事件
window.ontouchstart = function (e) { e.preventDefault(); }; //触发事件
$("#div").longPress(function () {
console.log("long");
alert("Ok");
});
</script>
</body>
</html>
JQUERY手机长按并移动触发事件(手机端)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" Content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0">
<title>长按并移动</title>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<style>
.mydiv{
position:absolute;
left:10px;
top:10px;
background-color:gray;
width:100px;
height:80px;
z-index:;
display:block;
}
</style>
</head> <body> <div class="mydiv">out</div>
<div class="mydiv" style="top:200px;">out</div> <script>
$.fn.longPress = function (fn) { /*设置一个长按的计时器,如果点击这个图层超过2秒则触发,mydiv里面的文字从out变in的动作*/
var timeout = undefined;
var state = ; var $this = this;
for (var i = ; i < $this.length; i++) {
$this[i].addEventListener('touchstart', function (event) { clearTimeout(timeout);
state = ;
timeout = setTimeout(function () {
state = ;
}, ); }, false); $this[i].addEventListener('touchmove', function (event) { if (state == ) {
console.log("move");
} }, false); $this[i].addEventListener('touchend', function (event) { clearTimeout(timeout); if (state == ) {
console.log("end");
state = ;
} }, false); } }; //阻止浏览器 复制粘贴等事件
window.ontouchstart = function (e) {
e.preventDefault();
}; //触发事件
$(".mydiv").longPress(function () { console.log("long"); }); </script>
</body>
</html>
JS拖拽交换位置(电脑端)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>孚盟CRM</title>
<meta name="viewport" Content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"> <title></title>
<style type="text/css">
*{ margin: ; padding: ; -moz-user-select:none;}
ul{ margin: 100px; border: 1px solid #adff2f; list-style: none;}
li{ height: 30px; line-height: 30px; padding: ; list-style: none;}
li:hover{ background: #bdb76b; cursor: move;}
</style>
</head>
<body> <ul id="outer_wrap">
<li>第一条</li>
<li>第二条</li>
<li>第三条</li>
<li>第四条</li>
<li>第五条</li>
<li>第六条</li>
<li>第七条</li>
<li>第八条</li>
</ul> <script type="text/javascript">
function $(id){
return document.getElementById(id);
}
//获取鼠标位置
function getMousePos(e){
return {
x : e.pageX || e.clientX + document.body.scrollLeft,
y : e.pageY || e.clientY + document.body.scrollTop
}
}
//获取元素位置
function getElementPos(el){
return {
x : el.offsetParent ? el.offsetLeft + arguments.callee(el.offsetParent)['x'] : el.offsetLeft,
y : el.offsetParent ? el.offsetTop + arguments.callee(el.offsetParent)['y'] : el.offsetTop
}
}
//获取元素尺寸
function getElementSize(el){
return {
width : el.offsetWidth,
height : el.offsetHeight
}
}
//禁止选择
document.onselectstart = function(){
return false;
}
//判断是否有挪动
var MOVE = {};
MOVE.isMove = false; //就是创建的标杆
var div = document.createElement('div');
div.style.width = '400px';
div.style.height = '1px';
div.style.fontSize = '';
div.style.background = 'red'; var outer_wrap = $('outer_wrap');
outer_wrap.onmousedown = function(event){
//获取列表顺序
var lis = outer_wrap.getElementsByTagName('li');
for(var i = ; i < lis.length; i++){
lis[i]['pos'] = getElementPos(lis[i]);
lis[i]['size'] = getElementSize(lis[i]);
}
event = event || window.event;
var t = event.target || event.srcElement;
if(t.tagName.toLowerCase() == 'li'){
var p = getMousePos(event);
var el = t.cloneNode(true);
el.style.position = 'absolute';
el.style.left = t.pos.x + 'px';
el.style.top = t.pos.y + 'px';
el.style.width = t.size.width + 'px';
el.style.height = t.size.height + 'px';
el.style.border = '1px solid #d4d4d4';
el.style.background = '#d4d4d4';
el.style.opacity = '0.7';
document.body.appendChild(el); document.onmousemove = function(event){
event = event || window.event;
var current = getMousePos(event);
el.style.left =t.pos.x + current.x - p.x + 'px';
el.style.top =t.pos.y + current.y - p.y+ 'px';
document.body.style.cursor = 'move'; //判断插入点
for(var i = ; i < lis.length; i++){
if(current.x > lis[i]['pos']['x'] && current.x < lis[i]['pos']['x'] + lis[i]['size']['width'] && current.y > lis[i]['pos']['y'] && current.y < lis[i]['pos']['y'] + lis[i]['size']['height']/){
if(t != lis[i]){
MOVE.isMove = true;
outer_wrap.insertBefore(div,lis[i]);
} }else if(current.x > lis[i]['pos']['x'] && current.x < lis[i]['pos']['x'] + lis[i]['size']['width'] && current.y > lis[i]['pos']['y'] + lis[i]['size']['height']/ && current.y < lis[i]['pos']['y'] + lis[i]['size']['height']){
if(t != lis[i]){
MOVE.isMove = true;
outer_wrap.insertBefore(div,lis[i].nextSibling);
}
}
}
}
//移除事件
document.onmouseup = function(event){
event = event || window.event;
document.onmousemove = null;
if(MOVE.isMove){
outer_wrap.replaceChild(t,div);
MOVE.isMove = false;
}
document.body.removeChild(el);
el = null;
document.body.style.cursor = 'normal';
document.onmouseup = null;
}
}
}
</script>
</body>
</html>
jQuery 拖拽交换位置(电脑端)
<!doctype html>
<html>
<head>
<meta charset='utf-8' />
<meta name="viewport"
content="
width = device-width ,
height = device-height ,
initial-scale = ,
minimum-scale = ,
maximum-scale = ,
user-scalable =no, "
/>
<title></title> <style>
* { padding:;margin:;list-style: none }
html,body { height:%; overflow:hidden; }
ul { margin:50px auto;position:relative; width:1100px; height:500px;}
ul li { float:left; width:%; cursor:pointer; padding:10px; box-sizing:border-box; height:%}
ul img { height:%;width:%; box-shadow: 3px 4px rgba(,,,0.5) }
</style>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
</head>
<body> <script>
$(function(){ var ps={L:[],R:[],T:[],B:[]};
for(var i=; i>=; i--){
var oLi = $('li').eq(i),
gLi = oLi.get(); oLi.css({'left':gLi.offsetLeft+'px','top':gLi.offsetTop+'px','position':'absolute','margin':});
ps.L.push(gLi.offsetLeft);
ps.T.push(gLi.offsetTop);
ps.R.push(gLi.offsetLeft + gLi.offsetWidth);
ps.B.push(gLi.offsetTop + gLi.offsetHeight);
};
ps.L = ps.L.reverse();
ps.R = ps.R.reverse();
ps.T = ps.T.reverse();
ps.B = ps.B.reverse(); //储存位置 //初始化
var b = ; $(document).on('mousedown','li',function(e){
e.preventDefault();
var _this = this;
if(_this.setCapture){_this.setCapture()};
var X = e.clientX - _this.offsetLeft,
Y = e.clientY - _this.offsetTop,
oList = $('li'),
attr = [];
my_index = $( _this ).attr('index'); //初始保存一个原来的Index,回到原来的数组(位置)
$(_this).css({'opacity':0.9,'zIndex':});
document.index = my_index; //目的是为了脱离变量作用域 $('li').each(function() {
attr.push( $(this).attr('index') )
}); $(document).on('mousemove',function(e){
var lt = e.clientX - X,
tp = e.clientY - Y,
screen_l = e.clientX - _this.parentNode.offsetLeft,
screen_t = e.clientY - _this.parentNode.offsetTop;
$(_this).css({'left':lt+'px','top':tp+'px'}); for(var i=;i<;i++){ var he_index = parseInt(oList.eq(i).attr('index'));
if(screen_l>ps.L[he_index]&&screen_l<ps.R[he_index]&&screen_t>ps.T[he_index]&&screen_t<ps.B[he_index]){
var i_index = parseInt($(_this).attr('index'));
if(he_index == i_index)continue;
document.index = he_index; //当找到元素保存要抵达的位置的index
document.flag = false;
var test = function (num,j){
var he_Li = $('li[index='+j+']');
$(he_Li).stop();
he_Li.animate({
left:ps.L[j+num],
top:ps.T[j+num]
},'fast');
he_Li.attr('index',j+num);
};
//利用属性选择器找到对应index(也就是找到数组相应位置)的元素;并且变换属性index到相应的数组索引; if(i_index>he_index){
for(var j=i_index-; j>=he_index; j--){
test(,j);
}
}else{
for(var j=i_index+; j<he_index+; j++){
test(-,j);
}
};
$(_this).attr('index',he_index); //变换_this的index
document.flag = true; }else{
if(document.flag){
var parent = _this.parentNode,
parent_X = e.clientX - parent.offsetLeft,
parent_Y = e.clientY - parent.offsetTop;
if( parent_X<||parent_X>parent.offsetWidth||parent_Y<||parent_Y>parent.offsetHeight ){
oList.not(_this).each(function(index, element) {
var a = $(element).index();
$(element).animate({
left:ps.L[attr[a]],
top:ps.T[attr[a]]
},'fast').attr('index',attr[a])
});
document.index = my_index;
$(_this).attr('index',my_index);
document.flag = false;
//当移出父节点还原
} }
}; };
});
$(document).on('mouseup',function(){
if(_this.releaseCapture){
_this.releaseCapture();
};
$(this).off('mousemove');
$(this).off('mouseup'); $(_this).animate({
left:ps.L[document.index],
top:ps.T[document.index]
},'fast',function(){
$(_this).css({'opacity':,'zIndex':})
});
delete document.index;
delete document.flag; });
}); })
</script> <ul>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li>
<li index=""><img src="http://www.baidu.com/img/bd_logo1.png" title="百度" /></li> </ul>
</body>
</html>
拖放移动位置如:(移动端拖拽的实现效果)
http://blog.csdn.net/xyphf/article/details/51988947
移动端 javascript 实现长按拖动
https://segmentfault.com/q/1010000008667545
。
Hammer.js 移动端手势库,多点触控插件的更多相关文章
- hammer.js移动端手势库
hammer.js 是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove ...
- 与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触控
原文:与众不同 windows phone (25) - Input(输入)之捕获 UIElement 之外的触控操作, Silverlight 方式捕获手势操作, XNA 方式捕获手势操作, 多点触 ...
- 多点触控插件Hammer.js
插件描述:Hammer.js是一个开源的,轻量级的javascript库,它可以在不需要依赖其他东西的情况下识别触摸,鼠标事件. 使用方法: <script src=<span class ...
- Hammer.js移动端触屏框架的使用
hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...
- Android 多点触控与简单手势(一)
现在一般的Android手机都会使用电容触摸屏最少可以支持两点触摸,多的可能是七八个,所以基本上都会支持多点触控, android系统中应用程序可以使用多点触控的事件来完成各种手势和场景需求. And ...
- Android多点触控手势基础
处理多点触控手势 多点触控就是同时把一根以上的手指放在屏幕上. 再继续往下以前需要补充一些名词: 触控手势:就是把一根或者几根手指放在屏幕上做各种动作,其中包括保留一根手指的前提下,拿起或者放下其余的 ...
- 在 Mac 上使用多点触控手势
使用多点触控触控板或妙控鼠标,可以通过轻点.轻扫.捏合或开合一根或多根手指进行有用的操作. 触控板手势 有关这些手势的更多信息,请选取苹果菜单 () >“系统偏好设置”,然后点按“触控板”.您 ...
- windows8 开发教程 教你制作 多点触控Helper可将任意容器内任意对象进行多点缩放
http://blog.csdn.net/wangrenzhu2011/article/details/7732907 (转) 实现方法: 对Manipulation进行抽象化 使不同容器可共用多点缩 ...
- Android 多点触控错误处理(java.lang.IllegalArgumentException: pointerIndex out of range)
最近做View的多点触控时,每次第一次触控事件完美运行,第二次就直接崩了,错误信息如下: 01-03 00:05:44.220 4377-4410/system_process E/AndroidRu ...
随机推荐
- Jquery Ajax xml版Get请求PHP
<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8&qu ...
- MySQL分区管理
以下是我看MySQL官方文档的时候整理的笔记,仅作参考保留. RANGE,LIST分区管理 1:为未分区表创建分区 ; 2:删除某个分区的数据 ALTER TABLE tr DROP PARTITIO ...
- xhtml 意義
xhtml是html和xml的結合體. xhtml包含所有xml和html4.0結合的部分. xml是描述語言,html是顯示語言.二者結合可以產生形式良好的文檔. 不僅可以適用與電腦瀏覽器,也可以適 ...
- Bootstrap洼地
前面的话 这是一个轻量.灵活的组件,它能延伸至整个浏览器视口来展示网站上的关键内容.本文将详细介绍Bootstrap洼地 概述 洼地(Well)样式的效果和巨幕jumbotron样式类似,不同点是we ...
- gbk、utf-8、utf8mb4区别
1. 存储大小(1). GBK编码专门用来解决中文编码的,是双字节的.不论中英文都是双字节的.(2). UTF-8 编码是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用2 ...
- linux sed的一些技巧
sed -i '$a # This is a test' regular_express.txt 由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增『# This is a test ...
- jenkins--svn+Email自动触发1(作业设置)
项目名称设置: svn设置: 触发构建设置: 构建加入sonar-scanner代码扫描: 邮件设置: 邮件触发器配置:
- spring boot 系列之一:spring boot 入门
最近在学习spring boot,感觉确实很好用,开发环境搭建和部署确实省去了很多不必须要的重复劳动. 接下来就让我们一起来复习下. 一.什么是spring boot ? spring boot是干嘛 ...
- Rsync 服务器端配置
Centos 6.3 已经自带Rsync服务 安装xinetd # yum -y install xinetd 编辑/etc/xinetd.d/rsync文件,把disable = yes修改为dis ...
- FreeRTOS 中 systick 相关配置
@2018-7-16 > systick 属性配置 在文件 <port.c> 中函数 void vPortSetupTimerInterrupt( void ) 中配置计数周期.时钟 ...