Files
ClassContent/历届学生/逯帅帅/项目开发/上课项目/美食App/js/utils/swiper.js
2024-09-27 02:06:13 +08:00

311 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 保护
(function () {
// 类的构造函数
function swiper (el,option) {
this.defaultOption = {
el: '.swiper',
width () {
return $(this.el).clientWidth
},
timer: null,
time: 3000,
initialSlide: 0,
direction: 'vertical',
speed: 800,
grabCursor: false,
loop: false,
autoplay: false,
swiperWrapper: '.swiper-wrapper',
on: {
},
pagination: {
el: '.swiper-pagination',
},
// 如果需要前进后退按钮
navigation: {
nextEl: '.next',
prevEl: '.prev',
},
// 事件控制中心,主要保存事件的
eventList: {}
}
if (typeof el == "string") {
this.defaultOption.el = el || this.defaultOption.el;
this.defaultOption.time = option.time || this.defaultOption.time;
this.defaultOption.initialSlide = option.initialSlide || this.defaultOption.initialSlide;
this.defaultOption.direction = option.direction || this.defaultOption.direction;
this.defaultOption.speed = option.speed || this.defaultOption.speed;
this.defaultOption.grabCursor = option.grabCursor || this.defaultOption.grabCursor;
this.defaultOption.loop = option.loop || this.defaultOption.loop;
this.defaultOption.autoplay = option.autoplay || this.defaultOption.autoplay;
this.defaultOption.swiperWrapper = option.swiperWrapper || this.defaultOption.swiperWrapper;
if (option.hasOwnProperty("pagination")) {
this.defaultOption.pagination.el = option.pagination.el || this.defaultOption.pagination.el;
}
if (option.hasOwnProperty("navigation")) {
this.defaultOption.navigation.nextEl = option.navigation.nextEl || this.defaultOption.navigation.nextEl;
this.defaultOption.navigation.prevEl = option.navigation.prevEl || this.defaultOption.navigation.prevEl;
}
if (option.hasOwnProperty("on")) {
for (const key in option.on) {
this.defaultOption.on[key] = option.on[key]
}
}
this.next = $(this.defaultOption.navigation.nextEl);
this.wrapper = $(this.defaultOption.swiperWrapper);
this.prev = $(this.defaultOption.navigation.prevEl);
this.pagination = $(this.defaultOption.pagination.el);
this.el = $(this.defaultOption.el);
this.init();
} else {
throw new Error("最外层父节点的类名必传")
}
}
// 类的方法
swiper.prototype = {
init () {
this.CreatedPagination();
this.setInitialSlide();
this.setGrabCursor();
if (this.defaultOption.autoplay) {
this.autoPlay();
this.el.onmouseover = () => clearInterval(this.defaultOption.timer);
this.el.onmouseout = () => this.autoPlay();
}
this.nextClick();
this.prevClick();
this.initSwiperSlide();
},
/**
* 注册移动端滑动
*/
initSwiperSlide: function () {
var fa = this.el,
startX = 0,
startY = 0;
fa.addEventListener('touchstart', function (e) {
e.stopPropagation()
startX = e.targetTouches[0].pageX
startY = e.targetTouches[0].pageY
})
var getDirection = function (startx, starty, endx, endy) {
// 获得角度
var getAngle = function(angx, angy) {
return Math.atan2(angy, angx) * 180 / Math.PI;
};
var angx = endx - startx;
var angy = endy - starty;
var result = 0;
// 如果滑动距离太短
if (Math.abs(angx) < 2 && Math.abs(angy) < 2) {
return result;
}
var angle = getAngle(angx, angy);
if (angle >= -135 && angle <= -45) {
result = 1;
} else if (angle > 45 && angle < 135) {
result = 2;
} else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
result = 3;
} else if (angle >= -45 && angle <= 45) {
result = 4;
}
return result;
}
fa.addEventListener('touchmove', (e) => {
e.stopPropagation()
var endX = e.changedTouches[0].pageX;
var endY = e.changedTouches[0].pageY;
var direction = getDirection(startX, startY, endX, endY);
// if (direction == 3 || direction == 4) {
// var x = parseInt(endX - startX) - 40
// // this.$(this.defaultConf.wrapper).style.webkitTransform = `translate3d(${x}px,0px,0px)`;
// }
});
fa.addEventListener('touchend', (e) => {
e.stopPropagation()
var endX = e.changedTouches[0].pageX;
var endY = e.changedTouches[0].pageY;
var direction = getDirection(startX, startY, endX, endY);
switch (direction) {
case 0:
console.log("未滑动!");
break;
case 1:
console.log("向上!")
break;
case 2:
console.log("向下!")
break;
case 3:
console.log("向左!")
this.setSpeed();
this.animation(-this.defaultOption.width())
break;
case 4:
console.log("向右滑动");
this.setSpeed();
this.animation(this.defaultOption.width())
break;
default:
}
})
},
setInitialSlide() {
if (this.defaultOption.initialSlide != 0) {
this.changePagination(this.defaultOption.initialSlide)
}
},
setGrabCursor() {
this.defaultOption.grabCursor ? this.wrapper.style.cursor = "pointer" : ""
},
setSpeed() {
this.wrapper.style.transition = `all ease ${this.defaultOption.speed / 1000}s`;
},
nextClick() {
// this 指向
// var test = this;
// 1:保存this
// 2: =>
// 3: a().bind(this)
this.next != null ? this.next.onclick = () => {
this.setSpeed();
this.animation(-this.defaultOption.width())
} : ''
},
prevClick() {
this.prev != null ? this.prev.onclick = () => {
this.setSpeed();
this.animation(this.defaultOption.width())
} : ''
},
slideTo(index) {
this.setSpeed();
this.changePagination(index)
},
on (eventType,event) {
this.defaultOption.eventList[eventType] = event;
},
CreatedPagination() {
if (this.pagination != null) {
Array.from(this.wrapper.children).forEach((v,i) => {
this.pagination.innerHTML += ` <li class="${i == 0 ? 'active' : ''}"></li>`
});
this.BindPaginationClick();
}
},
BindPaginationClick() {
Array.from(this.pagination.children).forEach((v,i) => {
v.onclick = () => {
this.setSpeed();
this.changePagination(i)
}
})
},
changePagination(i) {
this.defaultOption.eventList.slideChange && this.defaultOption.eventList.slideChange(i);
this.defaultOption.on.slideChange && this.defaultOption.on.slideChange(i);
if (this.pagination != null) {
Array.from(this.pagination.children).forEach((item) => {
item.className = ""
});
Array.from(this.pagination.children)[i].className = "active";
}
this.wrapper.style.transform = `translateX(${i * -this.defaultOption.width()}px)`;
},
animation(offset) {
var val = parseInt(this.wrapper.style.transform.match(/translateX\(([\s\S]*?)\)/)[1]);
var newOffset = offset + val;
var maxWidth = -(this.wrapper.children.length - 1) * this.defaultOption.width();
if (newOffset > 0) {
if (this.defaultOption.loop) {
newOffset = maxWidth;
} else {
newOffset = 0
}
}
if (newOffset < maxWidth) {
if (this.defaultOption.loop) {
newOffset = 0;
} else {
newOffset = maxWidth
}
}
var index = Math.abs(newOffset / this.defaultOption.width());
this.changePagination(index);
this.defaultOption.eventList.slideChange && this.defaultOption.eventList.slideChange(index);
this.defaultOption.on.slideChange && this.defaultOption.on.slideChange(index)
},
autoPlay () {
this.defaultOption.timer = setInterval(() => {
this.animation(-this.defaultOption.width())
}, this.defaultOption.time);
}
}
function $(className) {
var newClassName = className.split(" ");
if (newClassName.length > 1) {
var father = newClassName[newClassName.length - 2];
var childrenList = document.querySelector(father).children;
var arr = Array.from(childrenList).filter(function (el){
if (
el.className.indexOf( (newClassName[newClassName.length-1]).replace(".", "") ) > -1
||
el.tagName.toLowerCase() == newClassName[newClassName.length-1]
) {
return el;
}
});
if (arr.length > 1) {
return document.querySelectorAll(className)
} else if (arr.length == 1){
return document.querySelector(className)
} else {
throw new Error(`${className} 不存在,请检查`)
}
} else {
return document.querySelector(newClassName);
}
}
window.Swiper = swiper;
})()