热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JS实现轮播图思路整理

html结构层

html结构层


css表现层

.index-banner {
position: relative;
width:1610px;
height: 461px;
margin:0 auto;
overflow: hidden;
}
.index-banner .banner-list{
position: absolute;
width:8050px;
height: 461px;
z-index: 1;
}
.index-banner .banner-list a{
display: block;
float: left;
width:1610px;
height:461px;
}
.banner1{
background: url("../images/banner1.jpg") no-repeat;
}
.banner2{
background: url("../images/banner2.jpg") no-repeat;
}
.banner3{
background: url("../images/banner3.jpg") no-repeat;
}
.index-banner .slide{
position: absolute;
z-index: 2;
left:50%;
margin-left:-5px;
bottom: 20px;
}
.index-banner .slide span{
display: inline-block;
cursor: pointer;
margin-right: 10px;
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #fff;
}
.index-banner .slide .active{
background-color: #000;
}
.arrow {
cursor: pointer;
position: absolute;
z-index: 2;
top: 180px;
display: none;
line-height: 70px;
text-align: center;
vertical-align: middle;
font-size: 35px;
font-weight: bold;
width: 50px;
height: 70px;
background-color: RGBA(0,0,0,.3);
color: #fff;
}
.arrow:hover { background-color: RGBA(0,0,0,.7);}
.index-banner:hover .arrow { display: block;}
#prev { left: 20px;}
#next { right: 20px;}

JS实现原理:通过改变图片的偏移量来实现图片的切换
实现步骤:1、通过documnet.getElementById()获取页面需要操作的元素

window.Onload=function(){
var banner=document.getElementById("banner");//获取轮播图父容器;
var list=document.getElementById("banner_list");//获取图片列表;
var buttOns=document.getElementById("slideBtn").getElementsByTagName("span");//获取图片切换圆点按钮;
var pre=document.getElementById("prev");//获取向左切换箭头
var next=document.getElementById("next");//获取向右切换箭头;

2、实现左右箭头的切换:给左右箭头绑定点击事件;
问题:在左右切换过程中会在图片切换完会显示空白?
解决方法:使用无限滚动的技巧,即实现循环无缝切换:
1)在页面图片列表的开始加上最后一张图片的附属图,在最后加上第一张图片的附属图
2)每次切换时判断切换后的位置是否大于-1610px或是小于-4830px(即是否切换到附属图的位置):
如果大于-1610px,就把图片重新定位到真正的最后一张图的位置:-4830px;
如果小于-4830px,就把图片重新定位到真正的第一张图的位置:-1610px;

var index=1;//用于存放当前要显示的图片,初始值为第一张图片
var animated=false;//优化动画执行效果,只有当前切换动画未执行时,才能被执行。解决当前动画执行未完成时,多次点击切换按钮导致的页面卡图现象,初始值为false
pre.Onclick=function(){
//切换到当前图片左边的图片,如果当前是第一张,会切换到最后一张
if(index==1){
index=3;
}
//否则会切换到前一张,即index-1
else{
index-=1;
}
//每次点击时,判断animated为false时执行切换
if(!animated){
animate(1610);
}

//设置当前圆点按钮样式切换到选中状态,其他圆点为未选中状态
showBtn();
}
next.Onclick=function(){
//切换到当前图片右边的图片,如果当前是最后一张,会切换到第一张
if(index==3){
index=1;
}
//否则会切换到下一张,即index+1
else{
index+=1;
}
//每次点击时,判断animated为false时执行动画
if(!animated){
animate(-1610);
}
//设置当前圆点按钮样式切换到选中状态,其他圆点为未选中状态
showBtn();
}
//将偏移的动作封装到函数animate()中
function animate(offset){
animated=true;//调用animate()切换时设置为true;
var newleft=parseInt(list.style.left)+offset;//偏移之后的位置
var time=500;//位移总时间
var interval=10;//位移间隔时间
var speed=offset/(time/interval);//每次位移量 =总偏移量/次数
function go(){//递归,在函数内部调用自身实现入场图片500ms淡入的效果
//判断偏移量是否达到了目标值,如果没有,在原来的基础上继续移动
if((speed<0 && parseInt(list.style.left)>newleft)||(speed>0 && parseInt(list.style.left) list.style.left=parseInt(list.style.left) + speed +'px';
//设置定时器,每隔interval的时间调用一下go()函数
//setTimeout()函数只会被执行一次
setTimeout(go,interval);
}
//如果达到了目标值,就将newleft值设置为目标值,
else{
animated=false;//切换结束,设置为false;
//获取当前图片的left值:用list.style.left获取left的字符串,需要parseInt()函数将字符串转换为数值
list.style.left = newleft+'px';

//设置无缝切换
if( newleft > -1610 ){
list.style.left='-4830px';
}
if( newleft <-4830){
list.style.left='-1610px';
}
}
}
go();//调用animate()时执行go()函数
}
//将圆点按钮样式切换封装到showBtn()函数中
function showBtn(){
//遍历圆点按钮数组
for(var i=0;i var button=buttons[i];
//取消之前按钮设置的active状态
if(button.className == 'active'){
button.className='';
break;
}
}
//设置当前图片对应的圆点按钮状态为active
buttons[index-1].className='active';
}

3、实现圆点按钮点击切换:遍历底部圆点按钮数组,为每个按钮添加点击事件

for(var i=0;i var button=buttons[i];
button.Onclick=function(){
//程序优化:如果点击当前处于active状态的按钮,则不执行任何操作
if(this.className=='active'){
return;//当程序执行到这里时会退出当前函数,不会再执行后面的语句
}
//问题:如何在点击圆点按钮时,定位切换到对应的图片上?
//解决方法:获取html页面按钮上自定义的index属性值,通过该index值可以算出每次点击的按钮距之前按钮的偏移量,
var myIndex=parseInt(this.getAttribute('index'));//获取自定义的属性的值并转换为数字
var offset=-1610 * (myIndex-index);//算出偏移量
if(!animated){
animate(offset);//调用animate实现切换
}
index=myIndex;//更新当前的index值
showBtn();//调用showBtn实现按钮的样式切换
}
}

4、实现图片自动切换:实现每5s切换图片,图片循环播放;

var timer;//设置自动播放的定时器
function play(){
//设置定时器,每隔5s点击右键头切换按钮
timer=setInterval(function(){
next.onclick();
},5000);
}
function stop(){
//暂停自动播放
clearInterval(timer);
} banner.Onmouseover=stop;//鼠标悬停某张图片,则暂停切换;
banner.Onmouseout=play;//鼠标移除时,继续自动切换; play();//初始化时执行自动播放

}//window.onload加载完成

使用jquery实现如下,思路不变:

$(function () {
var banner= $('#banner');
var list = $('#banner_list');
var buttOns= $('#slideBtn span');
var prev = $('#prev');
var next = $('#next');
var index = 1;
var interval = 5000;
var timer;
function animate (offset) {
var left = parseInt(list.css('left')) + offset;
if (offset>0) {
offset = '+=' + offset;
}
else {
offset = '-=' + Math.abs(offset);
}
list.animate({'left': offset}, 500, function () {
if(left > -1610){
list.css('left',-4830);
}
if(left <4830) {
list.css('left',-1610);
}
});
}
function showButton() {
buttons.eq(index-1).addClass('active').siblings().removeClass('active');
}
function play() {
timer = setTimeout(function () {
next.trigger('click');
play();
}, interval);
}
function stop() {
clearTimeout(timer);
}
next.bind('click', function () {
if (list.is(':animated')) {
return;
}
if (index == 3) {
index = 1;
}
else {
index += 1;
}
animate(-1610);
showButton();
});
prev.bind('click', function () {
if (list.is(':animated')) {
return;
}
if (index == 1) {
index = 3;
}
else {
index -= 1;
}
animate(1610);
showButton();
});
buttons.each(function () {
$(this).bind('click', function () {
if (list.is(':animated') || $(this).attr('class')=='active') {
return;
}
var myIndex = parseInt($(this).attr('index'));
var offset = -1610 * (myIndex - index);
animate(offset);
index = myIndex;
showButton();
})
});
banner.hover(stop, play);
play();
});

推荐阅读
  • 前端不规则图像点击_如何在前端开发的潮流中快速学习学好学以致用?
    大家好,我是致力于前端开发,前端设计,前端入门的前端小姐姐,今天为大家带来的前端新知识是【雪碧图和滑动门】,不 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 标题: ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • css自适应字体样式?如果是一排文字,一个background‘red’;就搞定了。是多行的话,只有根据文字行高,用一张背景图横向重复。css样式自适应分辨率高度和宽度尽量使用百分 ... [详细]
author-avatar
小賑賑_533
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有