上班以来看到了,写了很多的轮播图效果,实现方法大致有

1.将图片局对定位,利用z-index和opacity实现图片渐现

2.用css3 的transtion:Xx xx left/right,实现左右方向滑动轮播(淘宝)

3.在图片组的前后,各加一张图片,实现无缝连接

4.通过改变图片组外层的margin或者left值实现

今天我要写的是第四种,现在概观大部分网站,已经几乎没有这种实现方法了,因为逻辑比较复杂,而且比较消耗性能(需要不停的修改数组,然后遍历到页面上),今天写它的目的,只是想要挑战下自己,因为真的很久没有写过了

首先,先明确下实现思路

1.初始状态,如下图

红色是显示区域,需要设置overflow:hidden控制只显示一张

黑色的是四张图片,通过浮动,变成一排

html,css代码如下

        body,div{
padding:;
margin:;
}
.container{
width:560px;
margin:50px auto;
overflow:hidden;
position: relative; }
.after:after{
display: block;
clear:both;
content:'';
}
.img-box{ list-style: none;
padding:;
width:calc(560px*);
margin-left:;
}
.img-box li{
float:left;
}
.dot{
            position: absolute;
            bottom:30px;
            margin:auto;
            left:0;
            right:0;
            padding:0;
        }
        .dot li{
            list-style: none;
            padding:0;
            float:left;
            width:30px;
            height:30px;
            text-align: center;
            line-height:30px;
            border-radius: 50%;
            background:#ccc;
            color:#333;
            margin-left:5px;
            cursor:pointer;
        }
        .dot li:hover{
             background:#666;
            color:#fff;
        }
        .dot li.current{
            background:#666;
            color:#fff;
        }
  <div class='container'>
<ul class='img-box after'>
<li>
<img src="imgs/1.png" alt="">
</li>
<li>
<img src="imgs/2.png" alt="">
</li>
<li>
<img src="imgs/3.png" alt="">
</li>
<li>
<img src="imgs/4.png" alt="">
</li>
</ul>
   <ul class='dot after'>
        <li class='current'>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</div>

2,通过改变ul的margin-left值来实现图片移动,每隔固定的时间改变ul的margin值为图片的宽度

可是当移动到最后一张时,后面没有图片了,就会一片空白。

如果加上判断:移动到最后一张时,再进行移动就默认移入到第一张,虽然可以实现,但是效果很差,不是我想要的效果

利用js的数组可以实现预期的效果:

向左移动:

1.将轮播图的图片地址储存到数组arr中

2.每轮播一次,就将第一张图片放到最后,在数组中对应,将数组中的第一个元素删除,拼接到最后一个,将数组遍历到页面上;

3.重新设置margin-left为0;

如下图:

向右移动(ul向右移动):

向右移动和想左不同:

首先将最后一张图片放到最前面,对应数组就是将数组中最后一个元素删除拼接到arr的最前面,

然而此时ul的margin-left仍然是0;所以要将ul的margin-left改为负的图片宽度,(虽然移动了ul但是只是一瞬间的,而且当前图片没有变化)

最后将ul向右移动至margin-left改变至0;完成向右移动

思路明确后就可以一步一步的向下做了

1.首先实现自动轮播(每次想左轮播一张图片)

2.然后实现点击索引值轮播(想左轮播不止一张图片)

3.点击索引值实现向右轮播

js代码如下:

$(document).ready(function(){
var scroll={
ImgArr:[],//储存图片地址的数组
timer:null,//第一个定时器,表示每隔一段时间,轮播一次
distance:0,//轮播的距离
interval:20,//每段动画的时间
time:2000,//每段轮播的总时间
JG:4000,//每段轮播停留的时间
FIRST:1,
current:1,
timer2:null,//第二个定时器,轮播时的动画
init:function(){
var me=this;
me.calc();//计算下面索引所占的宽度
me.timer=setInterval(function(){//自动轮播
me.change_dot();//改变索引的状态
me.next(1);//每次轮播一张 },me.JG)
$(".dot li").mouseover(function(){//鼠标停留时,停止自动轮播
clearInterval(me.timer);
})
$(".dot li").click(function(){
clearInterval(me.timer);
me.timer=null;
console.log(me.timer2);
var num=$(this).text();
me.current=$(".dot li.current").text();
var step=num-me.current;
if(me.timer2===null){//只有当轮播结束时才能进行第二次轮播,以防止出现bug if(step>0){
me.next(step);
}else if(step<0){
me.prev(step);
} $(".dot li").removeClass("current");
$(this).addClass("current");
} })
},
sort_arr:function(step){//滚动后重新排列数组
var me=this;
for(var n=0;n<$(".container li img"). length;n++){
me.ImgArr[n]=$(".container li img").eq(n).attr("src");
}
var html='';
var slice=me.ImgArr.slice(0,step);
me.ImgArr=me.ImgArr.concat(slice);
me.ImgArr.splice(0,step);
for(var i=0;i<me.ImgArr.length;i++){
html+="<li><img src="+me.ImgArr[i]+"></li>";
}
$(".container .img-box").html("");
$(".container .img-box").append(html);
},
change_dot:function(){
var arr=$(".img-box li img").eq(0).attr("src").split("/");
console.log(arr[arr.length-1].split(".")[0]);
var num=arr[arr.length-1].split(".")[0];
if(num=='4'){
num=0; }
$(".dot li").removeClass("current");
$(".dot li").eq(num).addClass("current"); },
next:function(step){//向左移动
var me=this; me.distance=$(".container li img").eq(0).width(); var times=me.time/me.interval;
var smalldistance=(me.distance*step)/times;
me.timer2=setInterval(function(){
if(me.FIRST<=times){ $(".container .img-box").css("margin-left",'-'+me.FIRST*smalldistance+"px");
me.FIRST++; }else{
clearInterval(me.timer2)
me.timer2=null;
me.FIRST=1;
$(".container .img-box").css("margin-left","0")
me.sort_arr(step); }
},me.interval)
},
prev:function(step){//向右移动
var me=this;
me.distance=$(".container li img").eq(0).width();
var length=$(".container .img-box li").length;
for(var n=0;n<$(".container li img"). length;n++){
me.ImgArr[n]=$(".container li img").eq(n).attr("src");
}
var slice_arr=me.ImgArr.slice(me.ImgArr.length+step);
for(var m=1;m<=-step;m++){
$(".container li").eq(length-m).remove();
}
var html="";
for(var i=0;i<slice_arr.length;i++){
html+="<li><img src="+slice_arr[i]+"></li>";
}
$(".container .img-box").prepend(html);
$(".container .img-box").css("margin-left",step*me.distance+'px'); me.distance=$(".container li img").eq(0).width();
var times=me.time/me.interval;
var smalldistance=(me.distance*step)/times;//每次移动的小段距离
me.timer2=setInterval(function() {
if(me.FIRST<=times){
var px=me.FIRST*smalldistance
$(".container .img-box").css("margin-left",step*me.distance-me.FIRST*smalldistance+"px");
me.FIRST++;
}else{//轮播结束时清楚定时器
clearInterval(me.timer2);
me.timer 2=null;
me.FIRST=1;
$(".container .img-box").css("margin-left","0") } },me.interval) },
calc:function(){
var length=$(".dot li").length;
var every=parseInt($(".dot li").eq(0).width())+parseInt($(".dot li").eq(0).css("margin-left"))
$(".dot").width(every*length);
}
}
scroll.init();
})

用js数组实现最原始的图片轮播实现的更多相关文章

  1. 【原生JS】写最简单的图片轮播

    非常简单的一个大图轮播,通过将控制显示位置来进行轮播效果,写来给正在学习的新手朋友们参考交流. 先看效果:(实际效果没有这么快) 先看布局: <div id="display" ...

  2. js文本公告滚动展示,图片轮播....

    1.引入文件 <link rel="stylesheet" href="/css/liMarquee.css"> <script src=&q ...

  3. 实现一个图片轮播-3d播放效果

    前言:最近在做一个音乐播放器,首页要做一个图片轮播,看了bootstrap的carousel插件以及移动端的swipe.js库,都是平面图片轮播的效果,所以自己想着实现类似网易云app里那种3d图片轮 ...

  4. 原生js+css3实现图片自动切换,图片轮播

    运用CSS3transition及opacity属性 制作图片轮播动画 自己这两天根据用js来控制触发CSS3中transition属性,从而写出来的以CSS3动画为基础,js控制过程的图片轮播 运用 ...

  5. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  6. 图片轮播(左右切换)--JS原生和jQuery实现

    图片轮播(左右切换)--js原生和jquery实现 左右切换的做法基本步骤跟 上一篇文章  淡入淡出 类似,只不过修改了一些特定的部分 (1)首先是页面的结构部分 对于我这种左右切换式 1.首先是个外 ...

  7. 原生js和jquery实现图片轮播特效

    本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...

  8. js/jquery中实现图片轮播

    一,jquery方法 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&qu ...

  9. 原生js和jquery实现图片轮播特效(转)

    本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...

随机推荐

  1. POI问题总结,关于数字级联及多级级联(三级以上)

    目录 最近公司业务需要用到excel,并且要导出模板,今天为止所有的功能都已经实现了,在这里对出现的一些问题做一个总结. 效果图: 这是一个五级联动的数据,其中第一列是数字开头,实现了五级联动 问题1 ...

  2. maven项目变成web项目

    具体步骤如图所示: 第一步:建议一个Maven Webapp项目  第二步:右击项目,选择属性,找到project facets,点击tuntimes标签选择apache tomcat v6.0选中P ...

  3. python2执行程序报错:NameError: name 'y' is not defined

    然后运行一直报错 这个错误,是由于版本不同造成的语法错误,在python3中,输入可以使用input,但如果你的版本是python2,那么此时input就得改成raw_input,否则你输入数据会被当 ...

  4. 闲来无事做个C#小项目——1

    2020-05-10 12:25:47 项目背景就是最近和一些朋友在玩一个游戏,游戏中有一个囤货的东西,就是买进卖出的,然后为了方便计算,所以就先写一个简单的计算器用来算账, 这是界面图(最初形态,没 ...

  5. 【FreeRTOS学习04】小白都能懂的 Queue Management 消息队列使用详解

    消息队列作为任务间同步扮演着必不可少的角色: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 前言 2 xQUEUE 3 相关概念 3 ...

  6. DP之石子堆合并问题

    相邻 环形 总结 (1)相邻:在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得 ...

  7. [hdu2112]最短路

    相当于模板题了,用trie来完成字符串到数字的映射比map<string, int>要快不少,令外可以考虑hash. 运行时间对比: (1)(2)600ms左右 (3)3000ms左右(4 ...

  8. requestAnimationFrame/cancelAnimationFrame——性能更好的js动画实现方式

    用js来实现动画,我们一般是借助setTimeout或setInterval这两个函数,css3动画出来后,我们又可以使用css3来实现动画了,而且性能和流畅度也得到了很大的提升.但是css3动画还是 ...

  9. JS导出页面为PDF文件,该如何操作?来看一眼就明白啦!

    1.资源文件或依赖 <script type="text/javascript" src="./js/canvg2.js"></script& ...

  10. js日期格式与时间戳相互转换

    本文转自:https://blog.csdn.net/Lc_style/article/details/80626748 1.将日期格式转化为时间戳: var date = new Date('201 ...