1. 程式人生 > >H5移動端開發基礎(一)事件基礎

H5移動端開發基礎(一)事件基礎

事件基礎

移動端基礎事件

手指按下:touchstart <==> mousedown
手指擡起:touchend <==> mouseup
手指移動:touchmove <==> mousemove

——touch事件 在chrome的模擬器下,部分版本通過on的方式來新增事件無效,有時候時好時壞,on的方式還會出現事件覆蓋
——addEventListener(‘事件名’, 函式, 冒泡或捕獲)

1) 不會存在前後覆蓋問題
2) 在chrome的模擬器下可以一直識別
3) false-冒泡,true-捕獲
        **冒泡**:點選元素,它會把一個事件一直向上傳遞,從下向上傳遞
        **捕獲**:從上向下傳遞
4) 事件函式中 預設的第一個引數是event物件
5) e.preventDefault():阻止預設事件
        阻止掉 document touchstart的預設事件,可以解決:
        ①阻止頁面上文字被選中,②阻止頁面上的系統選單
        隱患:頁面上的所有滾動條失效
6) e.stopPropagation():阻止冒泡事件
7) 阻止document的touchmove或者touchstart,可以清除系統預設的回彈

——事件點透:PC端的滑鼠事件 在移動端也可以正常使用,但是注意:事件的執行會有300ms的延遲

我們點選了頁面後,瀏覽器會記錄點選下去的座標,然後300ms後,在該座標找到現在在這裡的元素 執行事件
解決辦法:1) 阻止預設事件(部分安卓機型不支援)
                   2) 不在移動端使用滑鼠事件,不用a標籤做頁面跳轉

——touchEvent

touches:當前螢幕上的手指列表
targetTouches:當前元素的手指列表
changedTouches:觸發當前事件的手指列表

滑屏原理

① 手指按下去的時候,記錄下手指座標
② 移動的時候,記錄下手指座標
③ 用移動後的座標 - 移動前的座標 = 手指移動的距離
④ 手指按下去的時候,記錄下元素的位置
⑤ 移動之後,用手指移動的距離 + 元素的初始位置 = 元素現在所要在的位置

transform 與 transition

(1)transform/-webkit-transform(移動端):
		rotate:旋轉 deg(度數)
		scale:縮放
		scaleX:X縮放
		scaleY:Y縮放
		translateX:X位移(px)
		translateY:Y位移(px)
		skewX:x斜切(度數)
		skewY:y斜切(度數)
(2)transition:
		transition-duration:動畫時間
		transition-delay:延遲時間
		transition-property:要動畫的樣式
		transtion-timing-function:動畫形式

無縫滑屏自動播放幻燈片

<!DOCTYPE html>
<html>
<head>
<title>滑屏的幻燈片-自動播放</title>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, user-scalable=no"/>
<style type="text/css" id="css">
body{
	margin: 0;
}
#wrap{
	overflow: hidden;
	position: relative;
}
#list{
	position: absolute;
	left: 0;
	top: 0;
	margin: 0;
	padding: 0;
	list-style: none;
}
#list li{
	float: left;
}
#list img{
	width: 100%;
	display: block;
}
#nav{
	position: absolute;
	left: 0;
	bottom: 3px;
	width: 100%;
	line-height: 10px;
	text-align: center;
}
#nav span{
	display: inline-block;
	width: 10px;
	height: 10px;
	background: #c00;
	border-radius: 5px;
}
#nav .active{
	background: #0f0;
}
</style>
<script type="text/javascript" src="transform.js"></script>
<script type="text/javascript">
document.addEventListener('touchstart', function(e){
	e.preventDefault();
});
window.onload = function(){
	var wrap = document.querySelector('#wrap');
	var list = document.querySelector('#list');
	list.innerHTML += list.innerHTML;
	var lis = document.querySelectorAll('#list li');
	var css = document.querySelector('#css');
	var navSpan = document.querySelectorAll('#nav span')
	wrap.style.height = lis[0].offsetHeight + 'px';
	list.style.width = lis.length + '00%';
	var style = '#wrap{height: '+ lis[0].offsetHeight+'px}';
	var timer = 0;
	style += '#list{width: '+ lis.length +'00%}';
	style += '#list li{width:'+(1/lis.length*100)+'%}';
	css.innerHTML += style;
	var startPoint = 0;
	var startX = 0;
	var now = 0;
	cssTransform(list, 'translateX', 0);
	auto();
	wrap.addEventListener('touchstart', function(e){
		clearInterval(timer);
		list.style.transition = 'none';
		var translateX = cssTransform(list, 'translateX');
		now = Math.round(-translateX/wrap.offsetWidth);
		if(now == 0){
			now = navSpan.length;
		}
		if(now == lis.length-1){
			now = navSpan.length-1;
		}
		cssTransform(list, 'translateX', -now*wrap.offsetWidth);
		startPoint = e.changedTouches[0].pageX;
		startX = cssTransform(list, 'translateX');
		});
		wrap.addEventListener('touchmove', function(e){
		nowPoint = e.changedTouches[0].pageX;
		var dis = nowPoint - startPoint;
		cssTransform(list, 'translateX', startX + dis);
	});
	wrap.addEventListener('touchend', function(e){
		var translateX = cssTransform(list, 'translateX');
		now = Math.round(-translateX/wrap.offsetWidth);
		tab();
		auto();
		});
		function auto(){
		clearInterval(timer);
		timer = setInterval(function(){
	       if(now == lis.length-1){
	       	now = navSpan.length-1;
	       }
	       list.style.transition = 'none';
	       cssTransform(list, 'translateX', -now*wrap.offsetWidth);
	       setTimeout(function(){
	           now++;
	           tab();
	       }, 30);
		}, 2000);
	}
	function tab(){
		list.style.transition = '.5s';
		cssTransform(list, 'translateX', -now*wrap.offsetWidth);
		for(var i=0;i<navSpan.length;i++){
			navSpan[i].className = '';
		}
		navSpan[now%navSpan.length].className = 'active';
	}
}
</script>
</head>
<body>
<div id="wrap">
	<ul id="list">
		<li>
			<a href="#">
				<img src="img/1.jpg">
			</a>
		</li>
		<li>
			<a href="#">
				<img src="img/2.jpg">
			</a>
		</li>
		<li>
			<a href="#">
				<img src="img/3.jpg">
			</a>
		</li>
		<li>
			<a href="#">
				<img src="img/4.jpg">
			</a>
		</li>
		<li>
			<a href="#">
				<img src="img/5.jpg">
			</a>
		</li>
	</ul>
	<nav id="nav">
		<span class="active"></span>
		<span></span>
		<span></span>
		<span></span>
		<span></span>
	</nav>
</div>
</body>
</html>
function cssTransform(el, attr, val){
	if(!el.transform){
	        el.transform = {};
	}
	if(arguments.length>2){
		el.transform[attr] = val;
		// console.log(el.transform);
		var sVal = '';
		for(var s in el.transform){
			switch(s){
				case 'rotate':
				case 'skewX':
				case 'skewY':
					sVal += s+'('+el.transform[s]+'deg) ';
					break;
				case 'translateX':
				case 'translateY':
					sVal += s+'('+el.transform[s]+'px) ';
					break;
				case 'scaleX':
				case 'scaleY':
				case 'scale':
					sVal += s+'('+el.transform[s]+') ';
					break;
			}
			// console.log(sVal);
			el.style.WebkitTransform = el.style.transform = sVal;
		}
	}else{
		var val = el.transform[attr];
		if(typeof val == 'undefined'){
			if(['scale', 'scaleX', 'scaleY'].indexOf(attr)>-1){
				val = 1;
			}else{
				val = 0;
			}
		}
		return val;
	}
}