JQuery 封装一个移动端轮播图

510 阅读2分钟
<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>轮播图</title>
		<link rel="stylesheet" type="text/css" href="./css/index.css"/>
	</head>
	<body>

		<div class="am-swiper-container swiper-container-hot-events">
			<div class="am-swiper-body">
				<div class="am-swiper-content">
					<div class="am-swiper-slide">
						<img src="./img/9.png" alt="">
					</div>
					<div class="am-swiper-slide">
						<img src="./img/9.png" alt="">
					</div>
					<div class="am-swiper-slide">
						<img src="./img/9.png" alt="">
					</div>
				</div>
			</div>
			//下标,上面am-swiper-slide有几个就写几个
			<div class="am-swiper-item">
				<div class="item-button"></div>
				<div class="item-button"></div>
				<div class="item-button"></div>
			</div>
		</div>

	</body>
	<script src="./js/jquery-2.1.4.min.js.js"></script>
	<script type="text/javascript">
			function Swiper(container,index,showLength = 1){
				this.index = index;
				this.containerWidth = ($(container).width() + 1) / showLength;
				this.startX;
				this.moveEndX;
			    this.init = function(){
					var self = this;
					$(container).find('.am-swiper-slide').css('width', self.containerWidth + 'px');
					$(container).find('.am-swiper-item .item-button').eq(0).addClass('active');
					$(container).find('.am-swiper-slide').eq(0).addClass('active');
					var itemWidth = $(container).find('.am-swiper-item').width();
					$(container).find('.am-swiper-item').css('left','calc(50% - '+itemWidth/2+'px)');
					
					if(showLength > 1){
						$(container).find('.am-swiper-content').css('transform', 'translate3d(' + (-(self.index - 1) * self.containerWidth - 30) + 'px, 0px, 0px)');
					}
					
					$(container).find('.am-swiper-body').on('touchstart', function(e) {
						e.preventDefault();
						self.startX = e.originalEvent.changedTouches[0].pageX;
					});
					$(container).find('.am-swiper-body').on("touchmove", function(e) {
						e.preventDefault();
						self.moveEndX = e.originalEvent.changedTouches[0].pageX;
					});
					$(container).find('.am-swiper-body').on("touchend", function(e) {
						e.preventDefault();
						if (self.moveEndX - self.startX > 50) {
							self.index--;
						} else if(self.moveEndX - self.startX < -50) {
							self.index++;
						}
						
						if (self.index >= $(container).find('.am-swiper-slide').length - 1) {
							self.index = $(container).find('.am-swiper-slide').length - 1;
						}
						if (self.index <= 0) {
							self.index = 0;
						}
						$(container).find('.item-button').removeClass('active');
						$(container).find('.item-button').eq(self.index).addClass('active');
						$(container).find('.am-swiper-slide').removeClass('active');
						$(container).find('.am-swiper-slide').eq(self.index).addClass('active');
						if(showLength > 1){
							$(container).find('.am-swiper-content').css('transform', 'translate3d(' + (-(self.index - 1) * self.containerWidth - 30) + 'px, 0px, 0px)');
						} else {
							$(container).find('.am-swiper-content').css('transform', 'translate3d(' + (-self.index * self.containerWidth) + 'px, 0px, 0px)');
						}
					});
				}
			}
			var hotEvent  =  new Swiper('.swiper-container-hot-events',0); // 返回新对象的实例
			hotEvent.init();
			var hotEvent  =  new Swiper('.swiper-container-hot-recommend',0); // 返回新对象的实例
			hotEvent.init();
			var equity  =  new Swiper('.swiper-container-equity',0,3); // 返回新对象的实例
			equity.init();

	</script>
</html>

css:

* {
	margin: 0;
	padding: 0;
}

.am-swiper-container {
	width: 100%;
	height: 230px;
	position: relative;
}

.am-swiper-body {
	width: 100%;
	height: calc(100% - 30px);
	overflow: hidden;
	position: relative;
}

.am-swiper-container .am-swiper-content {
	position: relative;
	width: 100%;
	height: 100%;
	z-index: 1;
	display: flex;
	transition-property: transform;
	box-sizing: content-box;
	transition-duration: 300ms;
}

.am-swiper-container .am-swiper-content .am-swiper-slide {
	width: 100%;
	height: 100%;
	transition-property: transform;
	float: left;
	flex-shrink: 0;
}

.am-swiper-slide>div,
.am-swiper-slide>img {
	width: 100%;
	height: 100%;
}

.am-swiper-item {
	display: flex;
	justify-content: center;
	z-index: 9999;
	position: absolute;
	bottom: 10px;
}

.am-swiper-item div {
	flex-shrink: 0;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	background: rgba(0, 0, 0, 0.2);
	margin-right: 10px;
}

.am-swiper-item .item-button.active {
	background-color: #d20d17;
}