HTML5移动端touch滑动与重力/方向感应结合

引用了jquery、shake.js插件

shake.js : https://github.com/alexgibson/shake.js/blob/master/shake.js

图片尺寸1920 * 3000 px


<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HTML5移动端touch滑动与重力/方向感应结合</title>
<style type="text/css">
*{ margin:0; padding:0;}
html , body{ display:block; width:100%; max-width:640px; min-width:320px; margin:0 auto; height:100%;}

.box{ width:100%; height:100%; overflow:hidden; -webkit-overflow-scrolling:touch;}

.box_box{ width:300%; position:relative;}
.box_box img{ width:100%;}
.box_msg1 , .box_msg2 , .box_msg3 , .box_msg4 , .box_msg5 , .box_msg6{ display:block; width:60px; height:60px; line-height:60px; text-align:center; font-size:10px; border-radius:50%; position:absolute; left:350px; top:550px; background-color:#d00; color:#fff; cursor:pointer;
		 -webkit-animation:box_msg 2s .2s infinite; animation:box_msg 2s .2s infinite;
}
.box_msg2{ left:900px; top:900px;}
.box_msg3{ left:600px; top:800px;}
.box_msg4{ left:500px; top:1000px;}
.box_msg5{ left:700px; top:1100px;}
.box_msg6{ left:800px; top:1200px;}
@-webkit-keyframes box_msg{
	0% , 100%{ -webkit-transform:scale(1); opacity:1;}
	50%{ -webkit-transform:scale(0.9); opacity:.8;}
}
@keyframes box_msg{
	0% , 100%{ transform:scale(1); opacity:1;}
	50%{ transform:scale(0.9); opacity:.8;}
}
</style>
<script src="jquery2.1.js"></script>
<script src="shake.js"></script>
</head>

<body>
<div class="box">
	<div class="box_box">
        <img src="cs.jpg" />
        <div class="box_msg1" data-text="再接再厉">点我有惊喜~</div>
        <div class="box_msg2" data-text="恭喜你,获得XXXX">点我有惊喜~</div>
        <div class="box_msg3" data-text="再接再厉">点我有惊喜~</div>
        <div class="box_msg4" data-text="再接再厉">点我有惊喜~</div>
        <div class="box_msg5" data-text="再接再厉">点我有惊喜~</div>
        <div class="box_msg6" data-text="再接再厉">点我有惊喜~</div>
    </div>
</div>


</body>
</html>
<script>
window.onload = function() {
	var demo = $('.box_box');
	var demoW = demo.width();
	var demoH = demo.height();
	var winW = $(window).width();
	var winH = $(window).height();
	var spacing_l = demoW - winW;
	var spacing_t = demoH - winH;
	var x_bl;
	var y_bl;
	//手机感应动作
    var myShakeEvent = new Shake({
        threshold:0.3,
		 timeout:0
    });
    myShakeEvent.start();
    window.addEventListener('shake', shakeEventDidOccur, false);
    function shakeEventDidOccur () {
		deal_with(myShakeEvent.lastX , myShakeEvent.lastY , false);
    }
	
	//滑动动作
	document.body.addEventListener("touchstart", touchStart, false);
	document.body.addEventListener("touchmove", touchMove, false);
	document.body.addEventListener("touchend", touchEnd, false);
	function touchStart(e){
		var touch = e.touches[0];
		startX = touch.pageX;
		startY = touch.pageY;
		window.removeEventListener('shake', shakeEventDidOccur, false);
	}
	function touchMove(e){
		e.preventDefault();
		var touch = e.touches[0];
		endX = touch.pageX;
		endY = touch.pageY;
		deal_with(startX - endX , endY - startY , true);
	}
	function touchEnd(e){
		setTimeout(function(){
			window.addEventListener('shake', shakeEventDidOccur, false);
		},500)
	}
	
	//到达指定位置
	function deal_with(left_num , top_num , if_touch){
		if(if_touch){
			x_bl = 0.1;
			y_bl = 0.1;
		}else{
			x_bl = 5;
			y_bl = 5;
		}
//		var demo_l = parseFloat(demo.css("margin-left"));
//		var demo_t = parseFloat(demo.css("margin-top"));
		var demo_l = demo.offset().left;
		var demo_t = demo.offset().top;
		
		if(demo_l <= 0 && demo_l >= -spacing_l){
			var l_num = Math.abs(left_num) * x_bl;
			if(left_num > 0){
				l_num = demo_l - l_num;
			}else{
				l_num = demo_l + l_num;
			}
			if(l_num > 0){
				l_num = 0;
			}
			if(l_num < -spacing_l){
				l_num = -spacing_l;
			}
			//demo.css({"margin-left":l_num});
			demo_translate3d();
		}
		if(demo_t <= 0 && demo_t >= -spacing_t){
			var t_num = Math.abs(top_num) * y_bl;
			//手机感应动作  只设置横向感应,手指动作,上下左右都能滑动
			if(!if_touch){
				t_num = demo_t;
			}else{
				if(top_num > 0){
					t_num = demo_t + t_num;
				}else{
					t_num = demo_t - t_num;
				}
				if(t_num > 0){
					t_num = 0;
				}
				if(t_num < -spacing_t){
					t_num = -spacing_t;
				}
			}
			//demo.css({"margin-top":t_num});
			demo_translate3d();
		}
		function demo_translate3d(){
			var trans = "translate3d(" + l_num + "px," + t_num + "px,0)";
			demo.css({
				"-webkit-transition":"0ms",
				"-webkit-transform":trans,
				"transition":"0ms",
				"transform":trans
			});
		}
	}
	
	
	
};

$(".box_msg1 , .box_msg2 , .box_msg3 , .box_msg4 , .box_msg5 , .box_msg6").click(function(){
	alert($(this).attr("data-text"));
});
</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现移动端touch事件的横向滑动列表效果可以使用原生的JavaScript和CSS3来实现。 首先,我们需要在HTML中创建一个容器元素,用来包含列表项。容器元素需要设置overflow-x属性为scroll,使得内容超出容器范围时可以滚动。 ```html <div class="container"> <ul class="list"> <li>项1</li> <li>项2</li> <li>项3</li> <li>项4</li> <li>项5</li> </ul> </div> ``` 然后,在CSS中,我们需要设置容器元素和列表项的样式,以及使用CSS3的transition属性来实现平滑的过渡效果。 ```css .container { width: 100%; overflow-x: scroll; -webkit-overflow-scrolling: touch; /* 添加iOS滚动效果 */ } .list { display: flex; flex-wrap: nowrap; /* 设置列表项不换行 */ transition: transform 0.3s ease; /* 添加平滑的过渡效果 */ } .list li { width: 100px; height: 100px; margin-right: 10px; background-color: #ccc; } ``` 最后,在JavaScript中,我们需要监听容器元素的touchstart、touchmove和touchend事件,计算滑动距离并通过改变列表项的transform属性来实现横向滑动效果。 ```javascript const container = document.querySelector('.container'); const list = document.querySelector('.list'); let isDragging = false; let startPosition = 0; let currentTranslate = 0; let prevTranslate = 0; let animationId = 0; container.addEventListener('touchstart', touchStart); container.addEventListener('touchmove', touchMove); container.addEventListener('touchend', touchEnd); container.addEventListener('touchcancel', touchEnd); function touchStart(event) { if (event.target.classList.contains('list')) { isDragging = true; startPosition = event.touches[0].clientX; animationId = requestAnimationFrame(updateAnimation); container.classList.add('grabbing'); } } function touchMove(event) { if (isDragging) { const currentPosition = event.touches[0].clientX; currentTranslate = prevTranslate + currentPosition - startPosition; } } function touchEnd() { isDragging = false; cancelAnimationFrame(animationId); prevTranslate = currentTranslate; container.classList.remove('grabbing'); } function updateAnimation() { list.style.transform = `translateX(${currentTranslate}px)`; animationId = requestAnimationFrame(updateAnimation); } ``` 通过以上代码,我们就成功地实现了移动端touch事件的横向滑动列表效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值