Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件,是纯javascript打造的滑动特效插件,面向手机、平板电脑等移动终端。Swiper能实现触屏焦点图、触屏Tab切换、触屏多图切换等常用效果。
在工作的过程中遇到需要实现一个阶梯式的轮播效果,思索后决定使用swiper来解决这个问题。需要实现的效果大致如下图。
一、加载swiper插件,需要用到的有 swiper.min.css和swiper.min.js两个文件,可以通过官网下载到本地使用,下载地址。也可以直接使用CDN,CDN地址。
通过在html文件中引入swiper插件,并简单的初始化swiper,基本上可以得到一个可以进行轮播的效果。
@charset "utf-8";
/* CSS Document */
/* 定义样式,包括整体样式,分页器样式和前进后退按钮样式等内容 */
#certify {
position: relative;
width: 1200px;
margin: 0 auto
}
#certify .swiper-container {
padding-bottom: 60px;
}
#certify .swiper-slide {
width: 520px;
height: 408px;
background: #fff;
box-shadow: 0 8px 30px #ddd;
}
#certify .swiper-slide img{
display:block;
}
#certify .swiper-slide p {
line-height: 98px;
padding-top: 0;
text-align: center;
color: #636363;
font-size: 1.1em;
margin: 0;
}
#certify .swiper-pagination {
width: 100%;
bottom: 20px;
}
#certify .swiper-pagination-bullets .swiper-pagination-bullet {
margin: 0 5px;
border: 3px solid #fff;
background-color: #d5d5d5;
width: 10px;
height: 10px;
opacity: 1;
}
#certify .swiper-pagination-bullets .swiper-pagination-bullet-active {
border: 3px solid #00aadc;
background-color: #fff;
}
#certify .swiper-button-prev {
left: -30px;
width: 45px;
height: 45px;
background: url(../images/wm_button_icon.png) no-repeat;
background-position: 0 0;
background-size: 100%;
}
#certify .swiper-button-prev:hover {
background-position: 0 -46px;
background-size: 100%
}
#certify .swiper-button-next {
right: -30px;
width: 45px;
height: 45px;
background: url(../images/wm_button_icon.png) no-repeat;
background-position: 0 -93px;
background-size: 100%;
}
#certify .swiper-button-next:hover {
background-position: 0 -139px;
background-size: 100%
}
// js 初始化Swiper,包括配置是否自动播放,是否循环,是否显示分页器和前进后退按钮等内容
var certifySwiper = new Swiper('#certify .swiper-container', {
watchSlidesProgress: true,
slidesPerView: 'auto',
centeredSlides: true,
loop: true,
autoplay: true,
loopedSlides: 5,
autoplay: true,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
pagination: {
el: '.swiper-pagination',
//clickable :true,
},
})
完成这些工作后,你得到了一个可以轮播但是大小一致,并排排列的效果。
要达到预期的效果还需要使用注册事件,swiper4.0开始使用关键词this指代Swiper实例,大致使用方法为:
目前,轮播的各个项目之间是并排的关系,需要成阶梯形状呈现就需要在合适的机会改变各个项目的大小
var certifySwiper = new Swiper('#certify .swiper-container', {
watchSlidesProgress: true,
slidesPerView: 'auto',
centeredSlides: true,
loop: true, autoplay: true,
loopedSlides: 5,
autoplay: true,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
pagination: {
el: '.swiper-pagination',
//clickable :true,
},
on: {
progress: function (progress) {
for (i = 0; i < this.slides.length; i++) {
var slide = this.slides.eq(i);
var slideProgress = this.slides[i].progress;
modify = 1;
if (Math.abs(slideProgress) > 1) {
modify = (Math.abs(slideProgress) - 1) * 0.3 + 1;
}
translate = slideProgress * modify * 260 + 'px';
scale = 1 - Math.abs(slideProgress) / 5;
slide.transform('translateX(' + translate + ') scale(' + scale + ')');
}
},
setTransition: function (transition) {
for (var i = 0; i < this.slides.length; i++) {
var slide = this.slides.eq(i)
slide.transition(transition);
}
}
}
})
成功的改变大小后你会发现,后面的永远盖在前一个的上面,导致看起来并不是我们想要的结果,这个时候显然还需要在合适的机会改变各个项目的层级,也就是最中间的在最上面,剩下的往两边递减。
var certifySwiper = new Swiper('#certify .swiper-container', {
watchSlidesProgress: true,
slidesPerView: 'auto',
centeredSlides: true,
loop: true, autoplay: true,
loopedSlides: 5,
autoplay: true,
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
pagination: {
el: '.swiper-pagination',
//clickable :true,
},
on: {
progress: function (progress) {
for (i = 0; i < this.slides.length; i++) {
var slide = this.slides.eq(i);
var slideProgress = this.slides[i].progress;
modify = 1;
if (Math.abs(slideProgress) > 1) {
modify = (Math.abs(slideProgress) - 1) * 0.3 + 1;
}
translate = slideProgress * modify * 260 + 'px';
scale = 1 - Math.abs(slideProgress) / 5;
zIndex = 999 - Math.abs(Math.round(10 * slideProgress));
slide.transform('translateX(' + translate + ') scale(' + scale + ')');
slide.css('zIndex', zIndex);
slide.css('opacity', 1);
if (Math.abs(slideProgress) > 3) {
slide.css('opacity', 0);
}
}
},
setTransition: function (transition) {
for (var i = 0; i < this.slides.length; i++) {
var slide = this.slides.eq(i)
slide.transition(transition);
}
}
}
})
这样,就基本实现了我想要的效果了。
Swiper的切换