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 ...
随机推荐
- 测试 多线程 实现 callable 带返回值
package threadTest; import java.util.ArrayList; import java.util.Date; import java.util.concurrent.C ...
- ORA-01654 : 表空间不足
参考: Oracle表空间不足ORA-01654 查看表空间和表的使用率 ORA-01654 索引 无法通过 表空间扩展 Oracle 查看表空间的大小及使用情况sql语句 一.基础查询 1.查看表空 ...
- MES架构
FlexWeaver作为速威公司全新一代MES的技术平台,提供MES所需的全系列平台服务,针对工业大数据提供分布式计算环境.统一数据库引擎.大数据及云计算支撑等等. ● 同时适应企业内网服务器及云部署 ...
- SAP入行就业
就大局势来说, 缺乏人最多的模块有abap 还有就是FICO 和MM. 如果您 英语水平特别高的话,建议您学习FICO HR 或BW. 如果您想追求高薪,那就是FICO无疑了.想快速就业或者有编程基础 ...
- ubuntu iftop工具安装和参数
安装iftop有很多依赖关系: sudo apt-get install flex bison wget http://www.tcpdump.org/release/libpcap-1.5.3.ta ...
- python---str和repr
在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即 str() 或者 repr() . 区别与使用 函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为 ...
- BZOJ1041 HAOI2008圆上的整点(数论)
求x2+y2=r2的整数解个数,显然要化化式子.考虑求正整数解. y2=r2-x2→y2=(r-x)(r+x)→(r-x)(r+x)为完全平方数→(r-x)(r+x)/d2为完全平方数,d=gcd(r ...
- MVC 多语言
最近项目需要用到多语言. 研究了一下,也参考了很多技术文章. 这里贴一下参考地址:http://www.cnblogs.com/unintersky/p/3969612.html 主要步骤我这里简述一 ...
- Enum 扩展
项目中,用到枚举值,并且增加中英文描述. 一般的[Description]属性,无法满足中英文,所以进行了简单扩展. 继承DescriptionAttribute,增加了英文描述description ...
- 学习Spring Boot:(二十五)使用 Redis 实现数据缓存
前言 由于 Ehcache 存在于单个 java 程序的进程中,无法满足多个程序分布式的情况,需要将多个服务器的缓存集中起来进行管理,需要一个缓存的寄存器,这里使用的是 Redis. 正文 当应用程序 ...