使用touch操作图片
Posted zhoushangwu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用touch操作图片相关的知识,希望对你有一定的参考价值。
功能:
1、图片放大缩小
2、图片移动
3、图片上做点标记
PS
1、后端程序员不容易,且行且珍惜
2、代码不想封装,累
js代码
/**************************calc picture start****************************************/ //图片拖动开始位置 var startx = 0; var starty = 0; //图片原始定位 var oLeft = 0; var oTop = 0; //图片移动后的位置 var imgLeftPx = 0; var imgTopPx = 0; //图标的位置 var markerLeft = 0; var markerTop = 0; //手指缩放,记录两根手指的位置 var pageX, pageY, initX, initY, isTouch = false; var start = []; var touchNumber = 0; function picMove() { $("#floor_backgroup").on("touchstart", function(e) { //判断手指数 //if(e.changedTouches.length == 1) { var ttg = e.changedTouches[0]; //计算相对的位置 startx = ttg.pageX starty = ttg.pageY var el = $("#floor_backgroup"); oLeft = el.css("left"); oTop = el.css("top"); //} //手指按下时的手指所在的X,Y坐标 pageX = e.targetTouches[0].pageX; pageY = e.targetTouches[0].pageY; //初始位置的X,Y 坐标 initX = e.target.offsetLeft; initY = e.target.offsetTop; //记录初始 一组数据 作为缩放使用 start = e.touches; //得到第一组两个点 if(start.length == 2) { //表示手指已按下 isTouch = true; } touchNumber = start.length; return false; }) $("#floor_backgroup").on("touchmove ", function(e) { //calcPoint(e); //if(e.touches.length == 1) { if(!isTouch && touchNumber == 1) { var ttg = e.touches[0]; //计算相对的位置 var x = ttg.pageX - startx; var y = ttg.pageY - starty; x = x + parseInt(oLeft.replace("px", "")) y = y + parseInt(oTop.replace("px", "")) $("#floor_backgroup").css({ "left": x + "px", "top": y + "px" }) } //if(e.touches.length == 2) { if(isTouch) { //得到第二组两个点 var now = e.touches; //得到缩放比例, getDistance 是勾股定理的一个方法 var p2 = now[1]; var p1 = now[0]; var x = (p2.pageX - p1.pageX) var y = (p2.pageY - p1.pageY) var value01 = Math.sqrt((x * x) + (y * y)) p2 = start[1] p1 = start[0] x = (p2.pageX - p1.pageX) y = (p2.pageY - p1.pageY) var value02 = Math.sqrt((x * x) + (y * y)) var scale = (value01 / value02); scale = scale.toFixed(8); scale = (scale - 1) / 80 + 1 //console.log(scale) var image = new Image() image.src = $("#floor_picture").attr("src") //console.log(image.height) if($("#floor_backgroup").height() * scale > image.height) { return false; } if($("#floor_backgroup").height() * scale < ($("#floor_img").height() * 0.7) && $("#floor_backgroup").width() * scale < ($("#floor_img").width() * 0.7)) { return false; } $("#floor_backgroup").css({ "height": ($("#floor_backgroup").height() * scale) + "px", "width": ($("#floor_backgroup").width() * scale) + "px" }) } return false; }) $("#floor_backgroup").on("touchend ", function(e) { if(isTouch) { isTouch = false; } if(!isTouch && touchNumber == 1){ console.log(1111) var ttg = e.changedTouches[0]; var x = ttg.pageX - startx; var y = ttg.pageY - starty; imgLeftPx = parseInt($("#floor_backgroup").css("left").replace("px", "")) imgTopPx = parseInt($("#floor_backgroup").css("top").replace("px", "")) if(x == 0 && y == 0) { //$("#floor_img").click(); calcPoint(e); } } return false; }) //图标touch事件 $("#floor_marker").on("touchstart", function(e) { var ttg = e.changedTouches[0]; //记录手指放下去的位置 markerLeft = ttg.pageX markerTop = ttg.pageY // //e.preventDefault(); return false; }) $("#floor_marker").on("touchmove", function(e) { var ttg = e.changedTouches[0]; //拖动过程中获取到的位置 var x = ttg.pageX; var y = ttg.pageY; //计算拖动的距离 x = x - markerLeft; y = y - markerTop; markerLeft = ttg.pageX; markerTop = ttg.pageY; //在原基础上增加移动的距离 var mleft = $("#floor_marker").css("left").replace("%", "") var mtop = $("#floor_marker").css("top").replace("%", "") var h = $("#floor_backgroup").height() var w = $("#floor_backgroup").width() x = x + parseFloat(mleft) / 100 * w; y = y + parseFloat(mtop) / 100 * h; imgleft = x / w * 100; imgtop = y / h * 100; //console.log(x) $("#floor_marker").css({ "left": imgleft + "%", "top": imgtop + "%" }) //e.preventDefault(); return false; }) $("#floor_marker").on("touchend", function(e) { //e.preventDefault(); return false; }) } var imgleft = 0; var imgtop = 0; function calcPoint(e) { var ttg = e.changedTouches[0]; var curr = e.target; var x0 = curr.offsetLeft + imgLeftPx var y0 = $("#item2").height() + imgTopPx //curr.offsetTop //计算相对的位置 var x = ttg.pageX - x0; var y = ttg.pageY - y0; var h = $("#floor_picture").height() var w = $("#floor_picture").width() imgleft = x / w * 100; imgtop = y / h * 100; //console.log(x) $("#floor_marker").css({ "left": imgleft + "%", "top": imgtop + "%" }) } /**************************calc picture end****************************************/
html代码
<div id="floor_img" style="height: 100%;width: 100%; position: relative; z-index: 3; display: block; background-color:rgba(0,0,0,0.7);overflow: hidden;"> <div id="floor_backgroup" style="position: absolute;width: 100%; " > <!--图片--> <img id="floor_picture" style="max-height: 100%; max-width: 100%;" src="../images/bg.png"> <!--标记图片--> <img id="floor_marker" src="http://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png" style="position: absolute; height: 68px; margin: -64px 0 0 -26px ; width: 53px; left: 0; top: 0;"> </div> </div>
以上是关于使用touch操作图片的主要内容,如果未能解决你的问题,请参考以下文章
解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……(代码片段
重写 View 的 Touch 方法,实现一个酷炫的九宫格图片