一个基于jQuery的简单轮播图效果

一、loops.js源码(轮播主要动作文件)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
$(function () {
$('#longImg').width($('#allBox').width()*10);
$('#longImg img').width($('#allBox').width());
//默认第一个圆点状态为选中
var $stratli = 1;
//修复初始化的时候等待时间太长
$('#btnr').bind('click',function(){
$('#longImg').finish()
riLoop()
})
$('#btnl').bind('click',function(){
$('#longImg').finish()
leLoop(1,true)
})
function riLoop(rage,rage2) {
if(rage){
licolor('r');
}
$('#btnr').off();
$('#btnl').off();
console.log('动画执行中',(parseInt($('#longImg').css('left').slice(0,-2)))+'px',ristate,$('#allBox').width()*rage2,rage2)
$('#longImg').animate({
left:(parseInt($('#longImg').css('left').slice(0,-2)) - $('#allBox').width()*rage2)+'px',
},500,function () {
if(parseInt($('#longImg').css('left').slice(0,-2)) < -8000){
$('#longImg').css('left','-1000px');
}
//动画完成后才能重新启用点击功能
$('#btnr').bind('click',function(){
$('#longImg').finish()
riLoop(true,1)
})
$('#btnl').bind('click',function(){
$('#longImg').finish()
leLoop(1,true)
})
$rage2 = 1;
clickli();
});
}
var ristate = setInterval(riLoop,2000,true,1);
//左边滑动效果
function leLoop(range,auto) {
console.log(range)
if(auto){
licolor('l');
}
$('#btnr').off();
$('#btnl').off();
$('#loopli li').off();
console.log('左动画执行中',(parseInt($('#longImg').css('left').slice(0,-2)))+'px',ristate)
$('#longImg').animate({
left:(parseInt($('#longImg').css('left').slice(0,-2)) + $('#allBox').width()*range)+'px',
},500,function () {
if(parseInt($('#longImg').css('left').slice(0,-2)) > -1000){
$('#longImg').css('left',-$('#allBox').width()*8);
}
//动画完成后才能重新启用点击功能
$('#btnr').bind('click',function(){
$('#longImg').finish()
riLoop(true,1)
})
$('#btnl').bind('click',function(){
$('#longImg').finish()
leLoop(1,true)
})
clickli();
});
}
for (var i = 0;i < $('#longImg img').length - 2;i++){
$('#loopli').append('<li id=li'+(i+1)+'>'+(i+1)+'</li>')
}
$('#loopli li').eq($stratli-1).addClass('active')
//动态添加li圆点
//圆点跟着变色函数
function licolor(dr){
if(dr == 'r'){
$('#loopli li').removeAttr('class');
if ($stratli == $('#loopli li').length){
$stratli = 1;
}else{
$stratli++;
}
$('#loopli li').eq($stratli-1).addClass('active')
}else if(dr == 'l'){
$('#loopli li').removeAttr('class');
if ($stratli == 1){
$stratli = $('#loopli li').length;
}else{
$stratli--;
}
$('#loopli li').eq($stratli-1).addClass('active')
}
}
//给圆点添加点击事件
function clickli(){
$('#loopli li').bind('click',function () {
if ($stratli > parseInt($(this).attr('id').slice(2,))){
//向左移动
console.log('向左移动',parseInt($(this).attr('id').slice(2,)),$(this),$stratli - parseInt($(this).attr('id').slice(2,)));
$('#loopli li').removeAttr('class');
$(this).addClass('active');
var $rage = $stratli - parseInt($(this).attr('id').slice(2,));
$stratli = parseInt($(this).attr('id').slice(2,));
$('#longImg').finish()
leLoop($rage,false);
}else if($stratli < parseInt($(this).attr('id').slice(2,))){
//向右移动
console.log('向右移动');
console.log('向右移动',parseInt($(this).attr('id').slice(2,)),$(this));
$('#loopli li').removeAttr('class');
$(this).addClass('active');
var $rage = parseInt($(this).attr('id').slice(2,)) - $stratli;
$stratli = parseInt($(this).attr('id').slice(2,));
$('#longImg').finish()
riLoop(false,$rage);
}
});
}
clickli();
//注册鼠标悬停事件
$('#allBox').bind('mouseenter',function () {
$('#btnr').finish()
$('#btnl').finish()
$('#btnr').animate({
right:'0px',
},500);
$('#btnl').animate({
left:'0px',
},500);
clearInterval(ristate);
});
//注册鼠标离开事件
$('#allBox').bind('mouseleave',function () {
$('#btnr').animate({
right:'-120px',
},500);
$('#btnl').animate({
left:'-120px',
},500);
ristate = setInterval(riLoop,2000,true,1);
});
});

二、说明

因为时间比较短,所以写出来的代码没有进行优化,可能很多地方有重复步骤,或者可以用比较简单的方法代替,你们也可以去自己修改,主要说的是这种轮播图的原理。首先这种轮播的话图片添加要多两张重复的,目的就是在最后一张切换第一张,或者第一张回退到最后一张时能达到无缝切换的效果,原理就是当你切换到尾部时,这个动画效果一完成,马上就会将头部重复的图片切换过来,在你进行下一张切换的时候,其实又重新在头部往下切换了,如果对这个概念比较模糊的可以在Github中将该项目clone下去,或者去其他网站(某宝)的首页用开发者模式中选中轮播的模块然后看他的left或者其他的属性变化,原理其实很简单,但是要做到没有任何bug还是要认真一下的,这个轮播在我残酷的测试下仍能做到平滑切换,基本没有bug,欢迎大佬测试。

题外话:本来是做一个轮播框架的,用Ajax来自动获取本地图片数量然后根据配置文件自动生成轮播图,但是发现Ajax的本地请求有很多坑,时间又不充足,所以写着写着Ajax就不见了>_<…..所以最后写完就只有简单轮播,框架还没开始就已经不见了,希望后面有时间了能把这个框架完成。

三、仓库地址

地址:https://github.com/zhangao4833/Jquery-Rotation-chart.git

感谢您的阅读,本文由 ZhangAo`s Blog 版权所有。如若转载,请注明出处:ZhangAo`s Blog(https://www.imzhangao.com/2019/02/28/一个基于jQuery的简单轮播图效果/
Python Scrapy爬虫爬取抖音指定用户所有作品