原生js实现拖动图片左右弹性切换(模仿iPhone弹性拖拽的功能)

news/2024/7/19 12:58:14 标签: js, 弹性运动

因为弹性运动我在弹性菜单实例中已经列过详细的步骤了,所以此处不再赘述,有不懂的或有兴趣的请点击原生js实现弹性菜单

这个例子里面我们主要解决的问题有

1、弹性运动的实现(不再详细讲解)

2、怎样判断鼠标是向左拖动还是向右拖动

  • 当抬起鼠标的位置大于按下鼠标的位置时,则判断为向左拖拽,当抬起鼠标的位置小与按下鼠标的位置时,则判断为向右拖拽。

解决了上面两个问题,然后我们直接上代码

HTML代码

<div id="iphone" >
	<div id="wrap">
		<ul id="ul1">
			<li style="background:url(images/pic1.png);" title="妙味课堂"></li>
			<li style="background:url(images/pic2.png);" title="妙味课堂"></li>
			<li style="background:url(images/pic3.png);" title="妙味课堂"></li>
			<li style="background:url(images/pic4.png);" title="妙味课堂"></li>
		</ul>
	</div>
</div>
CSS代码
* { padding: 0; margin: 0; }
li { list-style: none; }
body { background: #333; }
#iphone { width: 900px; height: 600px; background: url(images/bg.png); position: absolute; top: 50%; left: 50%; margin: -300px 0 0 -450px; }
#wrap { width: 238px; height: 360px; position: absolute; top: 121px; left: 326px; overflow:hidden; }
#iphone ul { width: 960px; height: 361px; cursor: pointer; position: absolute; top: 0px; left: 0px; }
#iphone li { float: left; width:240px; height:360px; overflow:hidden; }

JS代码

<script>
window.onload = function(){
	var oUl = document.getElementById('ul1');
	var aLi = oUl.getElementsByTagName('li');	
	var disX = 0;
	var downX = 0;
	var iNow = 0;
	var timer = null;
	var iSpeed = 0;	
	oUl.onmousedown = function(ev){
		var ev = ev || window.event;
		disX = ev.clientX - oUl.offsetLeft;//记录鼠标按下的位置到ul左侧是位置
		downX = ev.clientX;//记录鼠标按下时的位置	
		clearInterval(timer);	
		document.onmousemove = function(ev){
			var ev = ev || window.event;
			oUl.style.left = ev.clientX - disX + 'px';//鼠标移动时,ul随着鼠标的移动而偏移
		};
		document.onmouseup = function(ev){
			document.onmousemove = null;
			document.onmouseup = null;//鼠标抬起时,取消鼠标移动和抬起时的事件
			var ev = ev || window.event;		
			if( ev.clientX < downX ){
				//alert('←');
				if( iNow != aLi.length-1 ){
					iNow++;
				}
				
				startMove( - iNow * aLi[0].offsetWidth  );//鼠标抬起时,让ul进行移动
			}
			else{
				//alert('→');
				
				if( iNow != 0 ){
					iNow--;
				}				
				startMove( - iNow * aLi[0].offsetWidth  );				
			}
			
		};
		return false;//取消默认行为
	};
	
	function startMove(iTarget){//下面为弹性运动的封装
		clearInterval(timer);//清空定时器
		timer = setInterval(function(){	//开启定时器	
			iSpeed += (iTarget - oUl.offsetLeft)/6;
			iSpeed *= 0.75;		
			if( Math.abs(iSpeed)<=1 && Math.abs(iTarget - oUl.offsetLeft)<=1 ){
				clearInterval(timer);
				iSpeed = 0;
				oUl.style.left = iTarget + 'px';
			}
			else{
				oUl.style.left = oUl.offsetLeft + iSpeed + 'px';
			}
			
		},30);
	}
	
};
</script>


http://www.niftyadmin.cn/n/952215.html

相关文章

报文加解密原理_通讯安全 - TLS基本原理

㈠ TLS 的成长史TLS 全称为Transport Layer Security&#xff0c;意指传输层安全&#xff0c;是解决网络安全的重量级武器。传输层安全最早由网景公司所开发&#xff0c;那时的名字还不叫TLS&#xff0c;而是SSL Secure Sockets Layer&#xff0c;即安全套接字层。 TCP/IP 的四…

转:ASP.Net下两种全局变量的设置和读取方法

本文介绍两种ASP.Net项目中全局变量使用的方式。web.config文件 和 Gloab文件。以下分别说明&#xff1a;方法一&#xff1a;web.config文件——设置&#xff1a;在web.config文件里添加关键字key是通过<appSettings>标记来实现的&#xff0c;但是appSettings标记通常放在…

原生js实现分页的效果

想必大家都用过百度查找过我们想要的信息&#xff0c;每次我们查找东西的时候&#xff0c;百度都会返给我们很多很多相似和有关的结果&#xff0c;而这些结果是不可能一页就显示完全的&#xff0c;一般都会分很多很多页&#xff0c;效果图如下。所以我们今天就是要分享一下&…

控制台接收信息转发_一张图告诉你组播报文转发和RPF检查原理

组播转发区别于单播转发&#xff0c;单播转发是基于报文目标IP地址查表转发的过程&#xff0c;而组播转发是根据报文源IP地址查表转发的过程&#xff0c;报文沿远离源的方向转发&#xff0c;可避免环路。PIM协议使用RPF机制确定转发路径。看这张图前&#xff0c;先了解一下RPF的…

深入理解js基本类型和引用类型的区别

1、基本类型&#xff1a;我们知道基本的数据类型有&#xff1a;undefined&#xff0c;boolean&#xff0c;number&#xff0c;string&#xff0c;null.按值访问&#xff0c;可操作保存在变量中的实际的值。基本类型值指的是简单的数据段。基本类型的值是不可变的&#xff1a;在…

终于可以回家了!

今天是春节前工作的最后一天&#xff0c;离下班也没有几个小时了&#xff0c;真块&#xff0c;一年就这样过去了&#xff0c;马上就可以回家了。 转载于:https://www.cnblogs.com/zhangzheny/archive/2007/02/14/650495.html

python语言所使用特殊含义符号的是_智慧职教云课堂品类管理(广东农工商职业技术学院)题库及答案...

【填空题】请缩写以下代码: .box { background-position: 10px 20px; background-repeat: no-repeat; back【判断题】质量管理部门应当参与所有与质量有关的活动,负责审核所有与本规范有关的文件,质量管理部门人员可以将职责委托给其他部门的人员。【判断题】同时具有细菌和真核…

转: 大年三十整理的asp.net资料!(经典)

使用SqlBulkCopy类加载其他源数据到SQL表 在数据回发时&#xff0c;维护ASP.NET Tree控件的位置 vagerent的vs2005网站开发技巧 ASP.NET2.0小技巧&#xff0d;&#xff0d;内部控件权限的实现 图片滚动代码。 css——之三行三列等高布局 Datagird TemplateColumn类型列中…