前端-移动端滑动图片-原生简单版

先看效果,图片跟着手指位置移动,然后显示

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
	/* 设置外层盒子、图片盒子居中 */
	#main, #touch_div {
	    display: flex;
	    justify-content: center;
	    align-items: center;
	}
	/* 设置图片大小、位置为根据父元素对齐 */
        img {
            width: 50%;
            height: 200px;
            position: absolute;
            top: 10%;
        }
    </style>
</head>
<body style="overflow: unset">
<div id="main">
    <div id="touch_div">
        <img class="img_" src="bg00.jpg">
        <img class="img_" src="bg01.jpg">
        <img class="img_" src="bg02.jpg">
    </div>
</div>
<script>
// 获取屏幕尺寸
    let w = window.innerWidth;
    let h = window.innerHeight;
	// 设置页面尺寸
    document.getElementById("main").style.height = w;
    document.getElementById("main").style.width = h;
	// 获取图片盒子
    let div_ = document.getElementById('touch_div');
	// 获取所有图片
    let imgs = document.getElementsByClassName("img_");
	changeImage(imgs,div_,w,h);
	function changeImage(images,touch_div,width,height){
		// 为了移动端滑动更加平滑,设置事件捕捉方式,当true时为capture(由外向内,取消冒泡),默认为false时为bubbling(由内向外,也就是冒泡)
		document.addEventListener('touchstart', () => {
		}, true); 
		document.addEventListener('touchmove', () => {
		}, true); 
		document.addEventListener('touchend', () => {
		}, true); 
		// 手指按下位置
		let position_start = {};
		// 图片位置
		let image_potition = images[0].getBoundingClientRect().left;
		// 图片索引值
		let index = 0;
		// 图片初始处理
		for (let i = 0; i < images.length; i++) {
			// 假如不是第一幅图则隐藏
		    if (index != i) images[i].style.display = 'none';
			// 设置所有图片的左边距
		    images[i].style.left = width / 2 - images[i] + 'px';
		}
		// 手指按下事件
		touch_div.addEventListener('touchstart', (e) => {
		    position_start.x = parseInt(e.changedTouches[0].clientX);
		    images[index].style.zIndex = '1';
		    if (images[index + 1]) images[index + 1].style.zIndex = '0';
		});
		// 手指滑动事件
		touch_div.addEventListener("touchmove", (e) => {
			// 获取手指按下位置
		    let x = parseInt(e.changedTouches[0].clientX);
		    // 手指向左滑动
		    if (x > position_start.x) {
		        images[index].style.transform = 'translateX(' + parseInt(x - image_potition * 1.3) + 'px)';
		        if (images[index - 1]) images[index - 1].style.display = 'block';
		        else images[images.length - 1].style.display = 'block';
		    }
			// 手指向右滑动
			if (x < position_start.x) {
				// 图片右移(手指触摸位置-图片位置)
			    images[index].style.transform = 'translateX(' + parseInt(x - image_potition * 2.5) + 'px)';
				// 向左滑动时将下一张图片显示,假如不存在下一站则第一张显示
			    if (images[index + 1]) images[index + 1].style.display = 'block';
			    else images[0].style.display = 'block';
			}
		});
		// 手指松开事件
		touch_div.addEventListener('touchend', (e) => {
			// 获取手指滑动值
		    let distance = parseInt(e.changedTouches[0].clientX) - position_start.x;
			// 获取屏幕宽/5
		    let step = parseInt(-(width / 5));
			// 当前图片恢复初始位置
		    images[index].style.transform = 'translateX(0)';
			// 上一张
		    if (step > distance) {
				// 当索引值不超过图片数量时索引值递增
		        if (index < images.length - 1) index += 1;
				// 否则赋值0
		        else index = 0;
				// 循环处理图片
		        for (let i = 0; i < images.length; i++) {
					// 索引值变化后根据索引值变化图片
					// 不是当前显示的图片全部隐藏
		            if (index != i) images[i].style.display = 'none';
					// 当前显示图片
		            else images[i].style.display = 'block';
		        }
		    } 
			// 下一张
			if(step < distance){
				// 当图片索引值为0时,index==图片数量-1
		        if (index == 0) index = images.length - 1;
				// 否则递减
		        else index -= 1;
				// 循环处理图片
		        for (let i = 0; i < images.length; i++) {
					// 索引值变化后根据索引值变化图片
					// 不是当前显示的图片全部隐藏
		            if (index != i) images[i].style.display = 'none';
									// 当前显示图片
		            else images[i].style.display = 'block';
		        }
		    }
		});
	}
</script>
</body>
</html>

版权声明:本文为weixin_45843676原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。