关于H5实现微信长按图片拖动调整顺序

当你明白功能的实现逻辑的时候,往往实现的过程中会给你带来惊喜,所以先去明确功能的实现逻辑,剩下的事情会水到渠成
比如这个功能,开始的时候我是这样想的,第一张图片的左侧中点作为左侧触发边界点,右侧中点作为右侧触发边界点,当第一张图片的右侧边界点拖动到第二张图片的右半部分时,将第二张图片移动到左边,并交换两张图片的index和位置。当第二张图片的左侧边界点拖动到第一张图片的左半部分时,将第一张图片移动到右边,并较远两张图片的index和位置。但是实现后发现只能拖动一次,就是左边的拖到右边,右边的拖动到左边,出现第三张图片的时候就不行了,还有个问题就是拖动第一张图片到右边第二张图片移动到左边后,这时候拖动还没完成,再把第一张图片托回去后,移动到左边的第二张图片并不会回去。然后又想了想分别针对每张图片设置触发区间,当一张图片拖动时触发这些区间后移动,做着做着感觉做不动了。
然后又看了看微信的操作,发现是以每张图片的中心点做参考的,当你拖动一张图片的时候,其他图片的中心点就作为触发点,当其他图片的中心点处在拖动的图片内的时候把触发的图片和当前拖动的图片的index和位置互换。这样不考虑index顺序,当前拖动图片被动触发才是正确的思路

效果如下

代码如下,插入的图片元素需要有class和moveindex,插入后执行press函数,代码需要修改对应的图片class,moveindex属性对应上才能正常运行,主要还是看实现逻辑,有问题请提出,有不足和改进的建议也请提出

  1 $.fn.press = function () {
  2     var timeOutEvent = 0,startX,startY,offsetX,offsetY,moveX,moveY,imgOffsetTop,imgOffsetLeft,scrollTop,imgHeight,imgWidth,modalHeight,windowHeight,imgIndex,imgArr = [],imgStartOffsetLeft,imgStartOffsetTop,isLongPress;
  3     var img = $(this);
  4     var imgWidthHeight = img[0].clientWidth;
  5     $.each($(‘.imgClass‘),function (i,e) {
  6         $(this).css({
  7             ‘position‘ : ‘absolute‘,
  8             ‘left‘     : e.offsetLeft,
  9             ‘top‘      : e.offsetTop
 10         })
 11     })
 12     $(img).on({
 13         touchstart: function(e){
 14             timeOutEvent = setTimeout(function(){
 15                 timeOutEvent = 0;
 16                 $(img).css({‘width‘:‘3rem‘,‘height‘:‘3rem‘});
 17                 imgStartOffsetLeft = $(img)[0].offsetLeft;
 18                 imgStartOffsetTop = $(img)[0].offsetTop;
 19                 startX  = e.originalEvent.targetTouches[0].pageX;
 20                 startY  = e.originalEvent.targetTouches[0].pageY;
 21                 offsetX = startX - imgStartOffsetLeft;
 22                 offsetY = startY - imgStartOffsetTop;
 23                 imgIndex = parseInt($(img).attr(‘moveindex‘));
 24                 $(img).css({
 25                     ‘position‘:‘absolute‘,
 26                     ‘z-index‘:‘200‘,
 27                     ‘left‘:imgStartOffsetLeft + ‘px‘,
 28                     ‘top‘:imgStartOffsetTop + ‘px‘
 29                 });
 30                 //防止微信露底
 31                 document.body.ontouchmove = function (e) {
 32                     e.preventDefault();
 33                 };
 34                 //阻止长按默认行为,比如微信长按图片弹出菜单
 35                 $(img).bind(‘contextmenu‘, function(e) {
 36                     e.preventDefault();
 37                 })
 38                 //获取当前所有图片的占位位置,为长按拖动后的移动做准备
 39                 $.each($(‘.imgClass‘),function (i,e) {
 40                     var index = $(e).attr(‘moveindex‘);
 41                     imgArr[index] = {
 42                         x1 : e.offsetLeft,
 43                         x2 : imgWidthHeight,
 44                         y1 : e.offsetTop,
 45                         y2 : imgWidthHeight,
 46                         trigger : {
 47                             x : e.offsetLeft + imgWidthHeight / 2,
 48                             y : e.offsetTop + imgWidthHeight / 2
 49                         }
 50                     };
 51                 })
 52                 isLongPress = true;
 53             },200);
 54
 55         },
 56         touchmove: function(e){
 57             clearTimeout(timeOutEvent);
 58             timeOutEvent = 0;
 59             if(isLongPress) {
 60                 moveX = e.originalEvent.targetTouches[0].pageX;
 61                 moveY = e.originalEvent.targetTouches[0].pageY;
 62                 $(img).css({
 63                     ‘left‘: moveX - offsetX + ‘px‘,
 64                     ‘top‘: moveY - offsetY + ‘px‘
 65                 })
 66                 imgOffsetTop = $(img)[0].offsetTop;
 67                 imgOffsetLeft = $(img)[0].offsetLeft;
 68                 scrollTop = document.body.scrollTop;
 69                 imgHeight = $(img)[0].offsetHeight;
 70                 imgWidth = $(img)[0].offsetWidth;
 71                 windowHeight = window.innerHeight;
 72
 73
 74                 //判断当前图片是否移动到其它图片上面
 75                 if (imgArr.length > 1) {
 76                     for(var i = 0;i < imgArr.length;i++){
 77                         var trigger = imgArr[i].trigger;
 78                         if( i != imgIndex && trigger.x >= imgOffsetLeft && trigger.x <= (imgOffsetLeft + imgWidth) && trigger.y >= imgOffsetTop && trigger.y <= (imgOffsetTop + imgHeight)){
 79                             $(‘.imgClass[moveindex=‘ + i + ‘]‘).css(‘position‘, ‘absolute‘).attr(‘moveindex‘,imgIndex).animate({
 80                                 ‘left‘: imgArr[imgIndex].x1 + ‘px‘,
 81                                 ‘top‘: imgArr[imgIndex].y1 + ‘px‘
 82                             }, 300);
 83                             $(img).attr(‘moveindex‘, i);
 84                             imgIndex = i;
 85                         }
 86                     }
 87                 }
 88             }
 89
 90         },
 91         touchend: function () {
 92             clearTimeout(timeOutEvent);
 93             if(isLongPress){
 94                 var imgLeft = imgArr[ imgIndex ].x1 + ‘px‘;
 95                 var imgTop = imgArr[ imgIndex ].y1 + ‘px‘;
 96                 $(imgDiv).css({
 97                     ‘position‘: ‘absolute‘,
 98                     ‘width‘: ‘2.8rem‘,
 99                     ‘height‘: ‘2.8rem‘,
100                     ‘left‘:  imgLeft,
101                     ‘top‘: imgTop,
102                     ‘z-index‘: 0
103                 });
104             }
105             isLongPress = false;
106             document.body.ontouchmove = function (e) {
107                 e.stopPropagation();
108             };
109             if(timeOutEvent != 0){
110                 console.log(‘单击了‘)
111             }
112         }
113     })
114 }
时间: 2024-12-12 07:36:47

关于H5实现微信长按图片拖动调整顺序的相关文章

js实现图片拖动改变顺序

在web页面中,需要改变多个元素的位置,可以通过元素拖动来实现.HTML5中加入了一个全局属性draggable,通过设置true/false来控制元素是否可拖动. 下面以图片拖动为例,用jQuery来实现:页面上有多个图片,把一个图片拖动到其他两个图片中间,就可以将这个图片的位置插入到两图之间. <!DOCTYPE html> <html> <head> <style> .img-div img { width:200px; height:200px; f

javascript完美实现图片拖动改变顺序

在web页面中,需要改变多个元素的位置,可以通过元素拖动来实现.HTML5中加入了一个全局属性draggable,通过设置true/false来控制元素是否可拖动. 下面以图片拖动为例,用jQuery来实现:页面上有多个图片,把一个图片拖动到其他两个图片中间,就可以将这个图片的位置插入到两图之间. html> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js">&l

禁止微信长按保存图片

事情的经过是这样的,有一天我去公司其他部门咨询 链接底层服务的事情.正好当时他们部门的前端小伙伴遇到一个bug.这个bug是这样的,在微信里内嵌的H5页面中有一个图片.然而呢!图片绑定了一个点击事件.大家都知道,在手上访问H5页面的时候,长按图片就会把图片保存起来.为了能够让用户体验更好一些,我们需要长按的时候也不保存图片.还能触发点击事件.当时他们咨询我这Bug怎么解决,我呢回去就围绕事件这块做了测试,也行当时没用心,没思考.结果呢,肯定是没有解决掉. 今天在哪躺着回想之前的事情,想起来这个b

基于H5的微信支付开发详解

这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可供参考,有的朋友直接看文档就可以自己实现此支付接口的开发了. 一.前言 为何我还写一篇微信支付接口的博文呢?第一,我们必须知道,所谓的工作经验很多都是靠总结出来的,你只有总结了更多知识,积累了更多经验,你才能在该行业中脱颖而出,我个人觉得如今的招聘,很多都需要工作经验(1年.3年.5年....),其

****基于H5的微信支付开发详解[转]

这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可供参考,有的朋友直接看文档就可以自己实现此支付接口的开发了. 一.前言 为何我还写一篇微信支付接口的博文呢?第一,我们必须知道,所谓的工作经验很多都是靠总结出来的,你只有总结了更多知识,积累了更多经验,你才能在该行业中脱颖而出,我个人觉得如今的招聘,很多都需要工作经验(1年.3年.5年....),其

[Egret]长按图片分享、分享图片、本地存储

egret 分享有API可以把一个显示对象树渲染成一个位图纹理,我把它赋值给 HTML 的 Image 元素,就实现了图片的显示,在微信中,通过长按图片可以分享出去.当然在其他浏览器可以保存在本地. 第一步 添加HTML元素 <div id="divImage" style="background: #373737;display:none;text-align:center;z-index:99;width:100%;height:100%;position: abs

h5聊天室web端(仿微博、微信)|h5仿微信网页端|仿微信界面弹窗

html5开发的仿微博.微信聊天web端案例,h5仿微信聊天网页版,采用html5+css3+jquery+swiper+wcPop等技术进行布控架构开发,弹窗插件wcPop.js进行了一次全面api升级,修复编辑器插入表情时光标定位错误bug,新增了上传附件及自定义推送内容,另外也新增了个人名片.上传附件.分享等样式,功能上实现了消息.表情的发送,图片.视频全屏预览. 项目运行图: /* --- 用户设置.Start ---*/ // 联系人/群聊切换 $("body").on(&q

用H5开发微信还是开发APP?

用H5开发微信还是开发APP? 随着技术的飞速发展,HTML第五版技术标准的更新,在移动端,由于其相对较低的开发成本及强大的跨平台运行能力,越来越多的信息型产品也开始选择这样轻量级的H5页面进行快速迭代,同时借用微信等平台快速触达用户. 如今App的红利时期早己消失殆尽,大家下载应用的热情已经不再像刚开始那么火热,再加上那么多烧钱BAT产品大佬培养的用户习惯,没点补贴很难吸引用户.直接在应用市场推App的成本也很高,这时web的优势就体现出来了,它很轻,迭代还快,而且现在有微信这么好的入口.坐拥

微信小程序--图片相关问题合辑

图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.previewImage预览图片 微信小程序之预览图片 小程序开发:上传图片到腾讯云 .NET开发微信小程序-上传图片到服务器 微信小程序本地图片处理--按屏幕尺寸插入图片 [微信小程序]上传图片到阿里云OSS Python Flask小程序文件(图片)上传技巧 小程序图片上传阿里OSS使用方法 微信小程序问题汇