移动端触摸移动小demo

根据项目需要自己尝试做了一个div块的触摸移动效果,用原生js写的。

效果如下:

页面的html文档:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <title>拖动Demo</title>
    <style type="text/Css">
    body{padding: 0;margin: 0;}
        .dragme{z-index:9999;position:fixed;top:30px;right: 5px;background:url(‘img/testbg.png‘) no-repeat;background-size:cover;width:80px;height:80px;}
    </style>   

</head>
<body>
     <div id="moveid"  class="dragme">  </div>
    <div style="height: 1000px;background: pink;"></div>
    <script type="text/javascript" src="js/dragFun.js" ></script>
</body>
</html> 
其中这行<div style="height: 1000px;background: pink;"></div>非常重要(单就这个demo来说),如果缺少这行代码,那么图片只能拖动一次,再次触摸拖动就失效了,这应该是和文档的高度有关。
js/dragFun.js实现原理分析:
1、需要知道开始触摸时手指的初始位置(clientX、clientY)2、滑动过程中需要记录下手指的位置3、手指离开屏幕时根据边界判断确定div的位置4、边界判断是重点5、滑块的移动改变的是transform:translate(x,y);

示意图:

我分为两部分判断:初始值:
var dragElem=document.getElementById(id) || document.querySelector(‘.‘+elemName),
        tempX=0,
        tempY=0,
        startX,
        startY,
        dirX,
        dirY;
    var clientW=document.documentElement.clientWidth,
        clientH=document.documentElement.clientHeight,
        eleW=dragElem.offsetWidth,
        eleH=dragElem.offsetHeight,
        offset_l=dragElem.offsetLeft,
        offset_t=dragElem.offsetTop;   
大方向: 1)div初始位置在右边  1.1 一屏幕的中心线区分    1.1.1 屏幕的右侧(1/2W范围内)去除掉y轴方向的上方eleH和下方的eleH(也就是右边上下黄线包围的范围)      如果他超出了屏幕右边界,那么X的最大偏移值为(clientW-offset_l-eleW);
 if(offset_l>clientW/2){//div的初始位置在屏幕右侧
            if(dirX>-(clientW/2-eleW/2) && dirY>-offset_t && dirY<clientH-(eleH+offset_t)){
                dirX=clientW-offset_l-eleW;
             }
}            
    1.1.2 屏幕的左侧(1/2W范围内)去除掉y轴方向的上方eleH和下方的eleH(也就是左边上下黄线包围的范围)      如果他超出了屏幕左边界,那么X的最大偏移值为-(clientW-eleW);
if(offset_l>clientW/2){
      if(dirX<-(clientW/2-eleW/2) && dirY>-offset_t && dirY<clientH-(eleH+offset_t)){
           dirX=-(clientW-eleW);
      }
}
    1.1.3 屏幕剩余的上下eleH部分(上黄线与顶部、下黄线与底部包围的区域,它的高度是div的高)      因为之前我没有对这个区域做判断,所在在测试的时候,如果把div拖到四个边角,超出范围后,他就会消失不见,不会再弹回边界,所以我才知道我忘记判断了,判断如下:
if(dirX>=clientW-offset_l-eleW){
     dirX=clientW-offset_l-eleW;}else if(dirX<=-(clientW-eleW)){
     dirX=-(clientW-eleW);
}
 2)div初始位置在左边(与上面的判断差不多主要是注意位移偏移量的大小,方向,正负)

 3)y轴方向的判断不用区分左右边,只需一次判断即可。
if(dirY<=-offset_t){
     dirY=-offset_t;
}else if(dirY>=clientH-(eleH+offset_t)){
     dirY=clientH-(eleH+offset_t);
}    

4)如果想让div块释放的时候有缓动效果,就给它加个transition属性

这个也得注意一下,在div块刚刚触摸时,得设置transition的duration为0s(单位不能少哦),不然拖动的过程会很慢,只需要在释放后再加上就可以啦。

整个过程就这样子结束啦,做完后想想还是挺容易的,就是在判断的时候花费了点时间。不过过程还是学到了很多。

如果想知道完整代码,到这里下载吧!!!

https://coding.net/u/U_can/p/mobieDragDemo/git


 
时间: 2024-10-09 20:33:43

移动端触摸移动小demo的相关文章

HTTP转发小Demo

工作中一个方案可行性预研写的小Demo,一晚上搞定的小程序. 主要功能是一个Http透明转发: 1.监听一个端口, 接收浏览器的连接请求. 2. 接收浏览器发出的请求数据, 将这些转发给一个指定的服务器. 3. 接收服务器的应答,将应答发送给浏览器. 代码都在一个文件中: // httptranschannel.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "httptranschannel.h" #inc

移动端触摸滑动插件Swiper

移动端触摸滑动插件Swiper 04/02/2015 一.了解Swiper 目前移动端项目一般都需要具有触屏焦点图的效果,如果你也需要实现这一功能的话,Swiper是一个不错的选择. 1.他不需要加载任何公共库(如jQuery)即可运行,这保证了Swiper的轻量和运行速度.Swiper也可以在加载了公共库的环境下安全的动行,如jQuery,Zepto,jQuery Moblie等. 2.Swiper默认的触摸比例为1:1,你可以通过修改Swiper的设置来改变这个比例. 3.Swiper 增加

移动端触摸(touch)事件

移动端时代已经到来,作为前端开发的我们没有理由也不应该坐井观天,而是勇敢地跳出心里的那口井,去拥抱蔚蓝的天空.该来的总会来,我们要做的就是接受未知的挑战.正如你所看到的,这是一篇关于移动端触摸事件的文章,也就是我们平时在手机中用得最多的动作:touch.现在让我们开始 touch touch touch 吧! Touch 事件 首先 touch 包含三类事件,它们分别是:touchstart.touchmove.touchend .望文生义这种本能相信你应该会有,但在这里我还是有必需对这三个词进

SpringBoot-Vue实现增删改查及分页小DEMO

前言 主要通过后端 Spring Boot 技术和前端 Vue 技术来简单开发一个demo,实现增删改查.分页功能以及了解Springboot搭配vue完成前后端分离项目的开发流程. 开发栈 前端 开发工具:WebStorm 开发框架:vue + axios 包管理工具: npm 打包工具:webpack 后端 开发工具:IDEA 开发框架:Springboot + mybatis 打包工具:maven 数据库: MySQL PS:假设以上的的工具你都安装好啦,写CRUD小DEMO时进坑了,这篇

Nancy之基于Self Hosting的补充小Demo

前面把Hosting Nancy with ASP.NET.Self Hosting Nancy和Hosting Nancy with OWIN 以demo的形式简单描述了一下. 这篇是为Self Hosting Nancy.和Owin 下面的Self Hosting作个补充. 首先是Self Hosting Nancy的补充: 这里主要是介绍一下Topshelf 官网:http://topshelf-project.com/ GitHub地址:https://github.com/Topshe

用backbone实现的一个MVC的小demo

一.Apache配置 本实例需要使用php支持.要现在Apache中配置虚拟目录,在Apache下的httpd-vhosts.conf文件中添加如下代码 <VirtualHost *:80> DocumentRoot "D:/htdocs/backbone_demo" ServerName www.backbonedemo.cn </VirtualHost> 在windows的hosts文件中添加配置,hosts文件的位置在c:\windows\system32

结对项目小DEMO

这次小DEMO主要实现下面两个功能: 实现两个页面的相互跳转 通过多线程实现网络发送请求 本人负责界面与说明文档编写,搭档负责java代码的具体实现. xml代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_

React问答小demo

在学习react初期,看了一些视频和资料,react基础知识差不多学完,跟着网上的一个教程,做了一个小型的问答demo. 需求看图说: 1.点击"添加"按钮,显示问题输入表单,再次点击,隐藏表单.同时,点击"取消"按钮,隐藏表单. 2.输入问题标题和内容后,点击"确认"按钮,将问题显示在下方(按照投票数从高到低). 3.每个问题有加票和减票功能,在点击的同时,将问题按照投票数从高到低排序. 实现过程: 一.开发环境和工具 1.npm init (

Nancy之基于Nancy.Owin的小Demo

前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katana 什么是Owin呢? 官网地址:http://owin.org OWIN在.NET Web Servers与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application. 什么是Katana呢? 官网地址:http://kata