Web APIs:移动端网页特效--移动端常见特效移动端轮播图和返回顶部及 click 延时解决方案

案例:移动端轮播图

基本PC端一致。 1. 可以自动播放图片 2. 手指可以拖动播放轮播图

移动端轮播图-结构搭建

移动端轮播图-布局分析

就是我们想要图片显示在同一行,用了浮动,但是父元素的宽度不够,因此给他设置宽度,有多少图片,它父元素的宽度就是多少,我们有5张图片,因此是500%,但是有发现是图片放大了,原来img的找他的父元素li如果没有设置宽度,它就会去找ul的宽度,因此最后是img=500%,所有要设置li的宽度,而li的宽度是将一个块区域分成5等分,每等分占20%,所有li的宽度为25%,最后还要清除浮动,如果没有清除,后面的元素也会跟着浮动。 

移动端轮播图-滚动图片

案例分析

① 自动播放功能 ② 开启定时器 ③ 移动端移动,可以使用translate 移动 ④ 想要图片优雅的移动,请添加过渡效果

 transform: translateX(200px); CSS3里面的样式,之前考虑到了兼容性问题,所有没有使用这个,而移动端没有这个问题

window.addEventListener('load', function() {
	// 1.获取元素
	var focus=document.querySelector('.focus');
	var ul=focus.children[0];
	var w=focus.offsetWidth;
	// 2.利用定时器自动轮播图图片
	var index=0;
	var timer=setInterval(function(){
		index++;
		var translatex=-index*w;
		// 延迟3秒
		ul.style.transition='all .3s';
		ul.style.transform='translateX('+translatex+'px)';
	},2000);
})

移动端轮播图-无缝滚动

window.addEventListener('load', function() {
	// 1.获取元素
	var focus=document.querySelector('.focus');
	var ul=focus.children[0];
	var w=focus.offsetWidth;
	// 2.利用定时器自动轮播图图片
	var index=0;
	var timer=setInterval(function(){
		index++;
		var translatex=-index*w;
		// 延迟3秒
		ul.style.transition='all .3s';
		ul.style.transform='translateX('+translatex+'px)';
	},2000);
	// 等我们过渡完成之后,再去判断,监听过渡完成的事件 transitionend
	ul.addEventListener('transitionend',function(){
		console.log(index)
		// 无缝滚动
		if(index==3){
			index=0;
			// 去掉过渡效果,这可以让我们快速跳到目标位置
			ul.style.transition='none';
			// 利用最新的索引号乘以宽度,去滚动图片
			ul.style.translatex=-index*w;
			ul.style.transform='translateX('+translatex+'px)'
		}else if(index<0){
			index=2;
			ul.style.translatex=-index*w;
			ul.style.transform='translateX('+translatex+'px)'
		}
	})
})

classList类名操作

classList属性是HTML5新增的一个属性,返回元素的类名。但是ie10以上版本支持。 该属性用于在元素中添加,移除及切换 CSS 类。有以下方法

添加类:

element.classList.add(’类名’);

移除类:

element.classList.remove(’类名’);

切换类:

element.classList.toggle(’类名’);

注意以上方法里面,所有类名都不带点


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .bg {
            background-color: black;
        }
    </style>
</head>

<body>
    <div class="one two"></div>
    <button> 开关灯</button>
    <script>
        // classList 返回元素的类名
        var div = document.querySelector('div');
        // console.log(div.classList[1]);
        // 1. 添加类名  是在后面追加类名不会覆盖以前的类名 注意前面不需要加.
        div.classList.add('three');
        // 2. 删除类名
        div.classList.remove('one');
        // 3. 切换类
        var btn = document.querySelector('button');
        btn.addEventListener('click', function() {
            document.body.classList.toggle('bg');
        })
    </script>
</body>

</html>

 

移动端轮播图-小圆圈跟随变化

① 小圆点跟随变化效果

② 把ol里面li带有current类名的选出来去掉类名 remove

③ 让当前索引号 的小li 加上 current add

④ 但是,是等着过渡结束之后变化,所以这个写到 transitionend 事件里面

// 3.小圆点跟随变化
		// 离除所有licurrent类名选出来,然后去掉类名
		ol.querySelector('li.current').classList.remove('current');
		// 让当前索引号 的小li 加上current add
		ol.children[index].classList.add('current');

 移动端轮播图-手指拖动轮播图

① 手指滑动轮播图

② 本质就是ul跟随手指移动,简单说就是移动端拖动元素

③ 触摸元素 touchstart: 获取手指初始坐标

④ 移动手指 touchmove: 计算手指的滑动距离,并且移动盒子

var startX=0;
	var moveX=0;//后面要使用这个移动距离所有要定义一个全局变量
	ul.addEventListener('touchstart',function(e){
		startX=e.targetTouches[0].pageX;
		clearInterval(timer);
		// 手指移动就停止定时器
	})
	ul.addEventListener('touchmove',function(e){
		moveX=e.targetTouches[0].pageX-startX;
		var translatex=-index*w+moveX;
		// 手指移动不需要过渡动画
		ul.style.transition='none';
		ul.style.transform='translateX('+translatex+'px)'
	})

 移动端轮播图-手指滑动播放上一张下一张

⑤ 离开手指 touchend: 根据滑动的距离分不同的情况

⑥ 如果移动距离小于 某个像素 就回弹原来位置

⑦ 如果移动距离大于某个像素就上一张下一张滑动。

⑧ 滑动也分为左滑动和右滑动 判断的标准是 移动距离正负 如果是负值就是左滑 反之右滑

⑨ 如果是左滑 就播放下一张 (index++)

⑩ 如果是右滑 就播放上一张 (index--)

// 手指离开 根据移动距离去判断是回弹还是播放上一张下一张
	ul.addEventListener('touchend',function(e){
		// (1)如果移动距离大于50px就播放上一张或下一张
		if(Math.abs(moveX)>50){
			// 如果是右滑 播放上一张 moveX就是正值
			if(moveX>0){
				index--;
			}else{
				// 如果是左滑 播放下一张 moveX就负值
				index++;
			}
			var translatex=-index*w;
			ul.style.transition='all .3s';
			ul.style.transform='translateX('+translatex+'px)'
		}
	})

移动端轮播图-回弹效果

小于50就让它回弹,而不是让它傻蛋蛋的在原地

完整代码

window.addEventListener('load', function() {
	// 1.获取元素
	var focus=document.querySelector('.focus');
	var ul=focus.children[0];
	var ol=focus.children[1];
	var w=focus.offsetWidth;
	// 2.利用定时器自动轮播图图片
	var index=0;
	var timer=setInterval(function(){
		index++;
		var translatex=-index*w;
		// 延迟3秒
		ul.style.transition='all .3s';
		ul.style.transform='translateX('+translatex+'px)';
	},2000);
	// 等我们过渡完成之后,再去判断,监听过渡完成的事件 transitionend
	ul.addEventListener('transitionend',function(){
		// console.log(index)
		// 无缝滚动
		if(index>=3){
			index=0;
			// 去掉过渡效果,这可以让我们快速跳到目标位置
			ul.style.transition='none';
			// 利用最新的索引号乘以宽度,去滚动图片
			var translatex=-index*w;
			ul.style.transform='translateX('+translatex+'px)'
		}else if(index<0){
			index=2;
			ul.style.translatex=-index*w;
			ul.style.transform='translateX('+translatex+'px)'
		}
		// 3.小圆点跟随变化
		// 离除所有licurrent类名选出来,然后去掉类名
		ol.querySelector('li.current').classList.remove('current');
		// 让当前索引号 的小li 加上current add
		ol.children[index].classList.add('current');
	});
	// 手指滑动轮播图
	var startX=0;
	var moveX=0;//后面要使用这个移动距离所有要定义一个全局变量
	var flag=false;
	ul.addEventListener('touchstart',function(e){
		startX=e.targetTouches[0].pageX;
		clearInterval(timer);
		// 手指移动就停止定时器
	})
	ul.addEventListener('touchmove',function(e){
		moveX=e.targetTouches[0].pageX-startX;
		var translatex=-index*w+moveX;
		// 手指移动不需要过渡动画
		ul.style.transition='none';
		ul.style.transform='translateX('+translatex+'px)'
		flag=true ;//如果用户手指移动过,就去判断
		e.preventDefault();
	})
	
	// 手指离开 根据移动距离去判断是回弹还是播放上一张下一张
	ul.addEventListener('touchend',function(e){
		if(flag){
			// (1)如果移动距离大于50px就播放上一张或下一张
			if(Math.abs(moveX)>50){
				// 如果是右滑 播放上一张 moveX就是正值
				if(moveX>0){
					index--;
				}else{
					// 如果是左滑 播放下一张 moveX就负值
					index++;
				}
				var translatex=-index*w;
				ul.style.transition='all .3s';
				ul.style.transform='translateX('+translatex+'px)'
			}else{
				var translatex=-index*w;
				ul.style.transition='all .3s';
				ul.style.transform='translateX('+translatex+'px)'
			}
		}
		// 当手指离开时候后重新开启定时器
		clearInterval(timer)
		timer=setInterval(function(){
			index++;
			var translatex=-index*w;
			// 延迟3秒
			ul.style.transition='all .3s';
			ul.style.transform='translateX('+translatex+'px)';
		},2000);
	})
})

返回顶部模块制作 

当页面滚动某个地方,就显示,否则隐藏

点击可以返回顶部

 案例分析

① 滚动某个地方显示

② 事件: scroll 页面滚动事件

③ 如果被卷去的头部(window.pageYOffset )大于某个数值

④ 点击, window.scroll(0,0) 返回顶部

// 返回顶部模块制作
	var goBack=document.querySelector('.goBack');
	var nav=document.querySelector('nav')
	window.addEventListener('scroll',function(){
		if(window.pageYOffset>=nav.offsetTop){
			goBack.style.display='block';
		}else{
			goBack.style.display='none';
		}
	})
	goBack.addEventListener('click',function(){
		window.scroll(0,0)
	})

 click 延时解决方案

移动端 click 事件会有 300ms 的延时,原因是移动端屏幕双击会缩放(double tap to zoom) 页面。

当我们点击时,它会考虑我们是不是要双击,因此就会有延迟

解决方案:

1. 禁用缩放。 浏览器禁用默认的双击缩放行为并且去掉 300ms 的点击延迟。

<meta name="viewport" content="user-scalable=no">

  2. 利用touch事件自己封装这个事件解决 300ms 延迟。

原理就是:

1. 当我们手指触摸屏幕,记录当前触摸时间

2. 当我们手指离开屏幕, 用离开的时间减去触摸的时间

3. 如果时间小于150ms,并且没有滑动过屏幕, 那么我们就定义为点击

//封装tap,解决click 300ms 延时
function tap (obj, callback) {
 var isMove = false;
 var startTime = 0; // 记录触摸时候的时间变量
 obj.addEventListener('touchstart', function (e) {
 startTime = Date.now(); // 记录触摸时间
 });
 obj.addEventListener('touchmove', function (e) {
 isMove = true; // 看看是否有滑动,有滑动算拖拽,不算点击
 });
 obj.addEventListener('touchend', function (e) {
 if (!isMove && (Date.now() - startTime) < 150) { // 如果手指触摸和离开时间小于150ms 算点击
 callback && callback(); // 执行回调函数
 }
 isMove = false; // 取反 重置
 startTime = 0;
 });
}
//调用 
 tap(div, function(){ // 执行代码 });

3. 使用插件。 fastclick 插件解决 300ms 延迟。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值