图片轮播,信手拈来(jquery)
制作图片轮播,可以说是js或者jquery学习者应该掌握的技巧。但惭愧的是本菜之前一直一知半解,这回抽了半天多总结了下分享给大家。虽然标题比较吹牛,但目的是希望大家看了之后制作图片轮播会非常迅速。
首先申明几点:
1.既然使用了jquery,制作方法就不再是最基础的那种将图片列表的位置一直改变,比如:切第二张图片left:-100px,切第三种图片left:-200px,切第四张图片left:-300px。
这种方法在从最后一张图回第一张图时会快速倒回去,搓爆了。
2.制作目标是轮播基本的三个功能:1)自动播放 2)光标移入停止播放,移开继续播放 3)按钮操作前/后张图片切换
3.制作图片轮播的方法网上非常多,我的写法不一定是最简单的,但确实比较少,思路也算清晰。
准备工作:
1.body中写入如下内容:
<div id="container">
<ul id="picList">
<li><img src="data:images/1.png"></li>
<li><img src="data:images/2.png"></li>
<li><img src="data:images/3.png"></li>
<li><img src="data:images/4.png"></li>
<li><img src="data:images/5.png"></li>
<li><img src="data:images/6.png"></li>
<li><img src="data:images/7.png"></li>
</ul>
</div>
其中外部div表示我们需要的“相框”,ul列表即是图片列表
2.将相框尺寸设为单张图片的尺寸;ul宽度设为图片列表的总宽度,可以在CSS中设置,不过写在javascript中动态添加也比较好;
var picArr=$("#picList li");
$("#picList").css("width",picArr.length*120);
最后让ul下的li float:left使图片横排。
完成之后效果如上,淡绿色的边框部分就是我们的“相框”。
普通写法:
这种写法个人认为比较简单,也比较实用。后面有个高级点的写法,虽然唬人但也麻烦一些。
function next(){
$("#picList li:first-child").animate({
marginLeft:"-120px"
},1000,function(){
var temp=$(this).clone();
$(this).remove();
temp.css({marginLeft:"0"});
$("#picList").append(temp);
});
}
解释下上面的代码,本例中单张图片宽120px高190px。
这个next函数即向后播的函数,首先jquery中的animate自定义动画使图片列表的第一列左移120px,用时1000毫秒,左移完成后执行接下来的函数:
将图片列表的第一列克隆存在名为temp的变量中,将第一列删除。此时克隆后的temp依然保持着之后marginLeft:"-120px"的css样式,先将其回0,否则在将插到队尾时会盖在前一张上。
最后将克隆后的列通过append()插入队尾。
使用setInterval循环执行next函数:
var intervalObj=window.setInterval(next,2000);
这里之所有用了setInterval是为了之后鼠标放上去后能停止轮播,setInterval的执行间隔时间减去动画执行过程所用时间即为图片的切换延迟时间。效果:
将setInterval赋给全局变量intervalObj为了接下来的停止功能:
$("#container").mouseover(function(){
window.clearInterval(intervalObj);
});
$("#container").mouseout(function(){
intervalObj=window.setInterval(next,2000);
});
效果:
接下来在id为container的div中添加按钮:
<button onclick="prev()" id="goLeft">←</button>
<button onclick="next()" id="goRight">→</button>
向右的按钮即执行上面所写的next函数,把两个按钮加在div中有个好处就是:之前我们是在div上加的mouseover事件,也就是说当我们想要点击切换上下张时自动播放也会停止,不会和我们的操作起冲突。
向左翻的函数:
function prev(){
var temp=$("#picList li:last-child").clone();
$("#picList li:last-child").remove();
temp.css({marginLeft:"-120px"});
$("#picList").prepend(temp);
$("#picList li:first-child").animate({
marginLeft:"0"
},1000);
}
这里和向右的函数稍微有些区别,我们得在图片列表右移之前先完成克隆。
首先将图片列表的最后一列克隆,并将最后一列移除。将克隆后的temp样式设为-120px,否则插到队头时会盖住第一张。
将克隆的temp通过prepend插入队头,注意此时图片列表的第一张不再是原始的第一张而是刚才插到队头的temp,由于temp的marginLeft为-120px,将其变为0。整个图片列表自然会右移,显示上一张。
最后将“相框”的overflow设为hidden,一个较完整的轮播就完成了:
整理后的代码,方便大家一次性COPY:
var intervalObj=window.setInterval(next,2000);
var picArr=$("#picList li");
$("#picList").css("width",picArr.length*120);
function next(){
$("#picList li:first-child").animate({
marginLeft:"-120px"
},1000,function(){
var temp=$(this).clone();
$(this).remove();
temp.css({marginLeft:"0"});
$("#picList").append(temp);
});
}
function prev(){
var temp=$("#picList li:last-child").clone();
$("#picList li:last-child").remove();
temp.css({marginLeft:"-120px"});
$("#picList").prepend(temp);
$("#picList li:first-child").animate({
marginLeft:"0"
},1000);
}
$("#container").mouseover(function(){
window.clearInterval(intervalObj);
});
$("#container").mouseout(function(){
intervalObj=window.setInterval(next,2000);
});
进阶写法:
原理基本是一样的,只是这回在ul中需要加入两个li,分别装第一张、第二张图片即可。
<ul id="picList">
<li><img src="data:images/1.png"></li>
<li><img src="data:images/2.png"></li>
</ul>
在js中将所有的图片地址装入数组中:
var srcArr=['images/1.png','images/2.png','images/3.png','images/4.png','images/5.png','images/6.png','images/7.png']
定义全局变量picNo=1,在之前所写的next及prev函数中加入判断条件:
function next(){
picNo++;
if(picNo==7){
picNo=0;
}else if(picNo==8){
picNo=1;
}
$("#picList li:first-child").animate({
marginLeft:"-120px"
},1000,function(){
var temp=$(this).clone();
$(this).remove();
temp.css({marginLeft:"0"}).children().attr("src",srcArr[picNo]);
$("#picList").append(temp);
});
}
function prev(){
picNo--;
if(picNo<1){
picNo=7;
}
var temp=$("#picList li:last-child").clone();
$("#picList li:last-child").remove();
temp.css({marginLeft:"-120px"}).children().attr("src",srcArr[picNo-1]);
$("#picList").prepend(temp);
$("#picList li:first-child").animate({
marginLeft:"0"
},1000);
}
这里picNo作用是提供图片地址数组的下标索引,这部分有点难讲清楚,我也是当初测试了很久才找到了规律。
先看next函数,picNo初值为1,第一次执行next函数时加1变为2,也就是说在接下来要插入的图片应该为第三张图片,因为第一、二张已经存在了。
if(picNo==7){picNo=0}表示向下切换到头时,添加第一张图片地址。
else if(picNo==8){picNo=1},加这句是因为在切换时发现个BUG,在从第一张倒切到最后一张,再从最后一张切回第一张时,新插入的不是第二张,而还是第一张。
再看prev函数,由于这里要插入的图片地址是前一张,所以在最后srcArr的下标索引应为picNo-1。
。。。我讲都讲晕了,看不懂就看不懂吧,直接拿去用吧。。。
上效果:
总的来说,这种写法上加入了判断会稍麻烦点,而且如果网页没有刷新好或者点击过快很容易出现图片顺序错乱。“炫技”的成份比较重,没有第一种做法好用。
感谢您的浏览,也感谢每一个给本菜提出意见的人。
图片轮播,信手拈来(jquery)的更多相关文章
- 图片轮播器——jquery插件
下载:http://files.cnblogs.com/files/wordblog/jiaoben828.rar
- 纯javaScript、jQuery实现个性化图片轮播
纯javaScript实现个性化图片轮播 轮播原理说明<如上图所示>: 1. 画布部分(可视区域)属性说明:overflow:hidden使得超出画布部分隐藏或说不可见.position: ...
- jQuery个性化图片轮播效果
jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...
- jquery 图片轮播demo实现
转载注明出处!!! 转载注明出处!!! 转载注明出处!!! 图片轮播demo,弄清楚过程其实是一个很简单的东西,看网上都没有什么实质性的代码,就自己把过程捋了一遍实现了. 这次因为随手写的,所以没有做 ...
- PgwSlideshow-基于Jquery的图片轮播插件
0 PgwSlideshow简介 PgwSlideshow是一款基于Jquery的图片轮播插件,基本布局分为上下结构,上方为大图轮播区域,用户可自定义图片轮播切换的间隔时间,也可以通过单击左右方向按键 ...
- 12款经典的白富美型—jquery图片轮播插件—前端开发必备
图片轮播是网站中的常用功能,用于在有限的网页空间内展示一组产品图片或者照片,同时还有非常吸引人的动画效果.本文向大家推荐12款实用的 jQuery 图片轮播效果插件,帮助你在你的项目中加入一些效果精美 ...
- JQuery slidebox实现图片轮播
jQuery图片轮播(焦点图)插件jquery.slideBox,简单设置下参数就可以多个多种动画效果,左右,上下,速度,还可指定默认显示第N张,点击的按钮在现代浏览中可以实现圆形或圆角效果,插件代码 ...
- 基于jquery的图片轮播 (IE8以上)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Nivo Slider - 世界上最棒的 jQuery 图片轮播插件
Nivo Slider 号称世界上最棒的图片轮播插件,有独立的 jQuery 插件和 WordPress 插件两个版本.目前下载量已经突破 1,800,000 次!jQuery 独立版本的插件主要有如 ...
随机推荐
- MySql报2006error错误的解决方法(数据过大)
最近迁移项目中发现,转移数据库出现的几个问题,其中之一就是 2006 error,解决过程如下: 首先贴出报错结果 [Msg] Finished - Unsuccessfully 出现这个结果,首先检 ...
- C++中数字与字符串之间的转换(转)
http://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2621803.html 1.字符串数字之间的转换 (1)string --> char ...
- Git Hooks、GitLab CI持续集成以及使用Jenkins实现自动化任务
Git Hooks.GitLab CI持续集成以及使用Jenkins实现自动化任务 前言 在一个共享项目(或者说多人协同开发的项目)的开发过程中,为有效确保团队成员编码风格的统一,确保部署方式的统一, ...
- SQL触发器与CLR的使用
在数据库的日常操作中,面对复杂业务的情况下,总会有用sql语句或存储过程不是那么方便的时候,所以这时候就会想到在数据库中调用CLR,也就是调用程序集,此处用C#实现来讲解一个测试案例 测试案例的业务是 ...
- Oracle-本地连接没问题,远程连接有问题解决方式
1. 问题 我的环境是oracle11gr2,本地用plsql还是toad连接都没有不论什么问题,而用别的机器远程连接就提示 无监听程序等错误. 2. 原因 oracle安装路径 --- 比如: F ...
- Hive学习之路 (十一)Hive的5个面试题
一.求单月访问次数和总访问次数 1.数据说明 数据字段说明 用户名,月份,访问次数 数据格式 A,, A,, B,, A,, B,, A,, A,, A,, B,, B,, A,, A,, B,, B ...
- DNS_PROBE_FINISHED_NXDOMAIN 问题解决
手动设置 (说明:如果您使用DNS有特殊设置,请保存设置后再进行操作) 1.打开[控制面板]→[网络连接]→打开[本地连接]→[属性]:2.双击[Internet 协议(TCP/IP)]→选择[自 ...
- jenkins+pytest+ allure运行多个py文件测试用例
jenkins的pytest运行多个py文件,导出allure报告方法,只需改下job的配置中的构建即可(pytest会运行指定文件下的所有test开头的py文件),如下: ...
- 矩阵求逆·学习笔记 $\times$ [$LuoguP4783$]矩阵求逆
哦?今天在\(luogu\)上fa♂现了矩阵求逆的板子--于是就切了切. 那么我们考虑一个矩阵\(A\),它的逆矩阵记作\(A^{-1}\),其中对于矩阵这个群来讲,会有\(A \cdot A^{-1 ...
- openstack的网络模式(转)
单节点上虚拟机和虚拟机之间通信 直接同过linuxbridge转发数据,即可通信 虚拟机跨物理节点通信 利用交换机的包转发机制,在大二层网络中转发数据包 虚拟机跟外网通信 同样利用交换机转发,将数据包 ...