原生JS实现轮播(上)

这是前阵子写的2款原生JS轮播,一个是渐变轮播预览,一个是滚动轮播预览,现在补充博文总结。

渐变轮播

因为是梳理自己的思路,以下内容不贴代码,具体效果和代码见Github,可能有更好更简洁的写法,希望互相指正。
预览效果 源码地址
兼容性:IE7及以上,火狐和谷歌等主流浏览器

HTML&CSS

  1. 最外面1个总容器#ad,里面放1个图片容器#list,1个按钮容器#btns,2个箭头#prev#next#ad相对定位,其他相对于#ad绝对定位。
  2. 所有图片都是绝对定位,会重叠在一起,默认z-index:0;给选中的图片和按钮分别设置classselectedon,其中选中图片的z-index:1,才会出现在顶层。

JS

  1. 手动轮播:把选中图片和按钮添加相应类名selectedon,把原来选中的按钮和图片取消相应类名。需要用循环,把所有按钮都遍历一遍,并且给每个按钮都定义一个索引index值。其中,需要判断选中当前已选中的,则不操作。
  2. 自动轮播。函数nextPic用于实现下一张图片,设置一个定时器,每隔一定时间就执行一次函数nextPic。注意处理移动到最后一张和第一张
  3. 注意:鼠标移入按钮时,自动轮播应该暂停;鼠标移出按钮时,自动轮播应该继续,且给一个当前的索引,告诉自动轮播从哪里开始播。
  4. 修改代码:将第1步和第2步中代码相似的部分合并写为一个函数show()
  5. 将图片和左右箭头鼠标悬停时清除计时器,写成函数pause,将图片和左右箭头鼠标离开时重启计数器,写成函数restart
  6. 给向左箭头写一个函数prevPic,用于显示上一张图片
  7. 设置左右箭头的开始和暂停
  8. 为了实现切换时的透明度渐变效果,需要给图片设置transition属性。只设置selected的话则会出现白底渐变效果,需要给所有图片也设置默认的transition属性。但只兼容IE10及以上,因为IE9不支持transition属性

兼容IE9及以下

因为IE9不支持transition属性,尝试用js实现渐入渐出,思路如下:

  1. 写透明度变化函数
function setOpacity(elem,level){
    if(elem.filters){ //IE9及以下有这个属性
        elem.style.filter="alpha(opacity="+level+")";
    }else{
        elem.style.opacity=level/100;
    }
}
  1. 透明度变化是动态的,隔一段时间就要变化,首先想到用setInterval
function fade_In(elem){
    setOpacity(elem,0); //初始透明
    var level=0;
    setInterval(function(){
        if(level<=95){
            level+=5;
            setOpacity(elem,level);
            console.log(level);
        }
    }, 300);
}
  1. 也可以用setTimout,感觉比较绕(挺有意思的,值得深究)。先考虑用循环,注意循环内的匿名函数问题,可以用括号的方法自执行。
//淡入效果
function fadeIn(elem){
    setOpacity(elem,0); //初始透明
    for(var i=0;i<=20;i++){
        (function(){
            var level=i*5;
            //try 1
            //console.log(level); //测试用,会一次性全部依次输出,如L61
            //setOpacity(elem,level);  //如果这样写,而不用L54的setTimeout的话是无效的,会一次性地全部实现,没有动画效果。

            //try 2
            /*if(level<=100){
                console.log(level);
                setInterval(setOpacity(elem,level), 300);  //每隔一定时间就执行依次函数,但这里level已经是100了。应该是每隔一段时间就变化level。另外写一个。
            }*/

            //正确:
            setTimeout(function(){
                setOpacity(elem,level)
            }, i*300);   //于是用setTimeout:i=0,间隔为0时,level=0;i=1,间隔为300时,level=5,依次……从而实现渐变。
        })(i);  //传入参数i,函数立即执行,会依次执行21次
    }
}
  1. 注意渐出的函数,容易写错,如下:
//淡出效果1:错误,实际是淡入效果
function fade_Out(elem){
    for(var i=20;i>=0;i--){
        (function(){
            var level=i*5;  //level从100到0
            setTimeout(function(){
                setOpacity(elem,level);
                //console.log(level); //测试用,这里却是从0到100
            }, i*300);
            //因为i=0时,即间隔时间为0,level=0;i=20,即间隔时间为6000,level=100。虽然for循环是从大到小,但setTimeout执行却是按照间隔时间的顺序的。所以实际上是淡入效果。
        })(i);
    }
}

正确的如下:

//淡出效果2:正确
function fadeOut(elem){
    for(var i=0;i<=20;i++){
        (function(){
            var level=100-i*5; //level从100到0
            setTimeout(function(){
                setOpacity(elem,level)
            }, i*300);
        })(i);
    }
}
  1. 在show函数里添加渐入和渐出,第一轮轮播切换时会出现第5张图闪一下再切换到目标图片,后面几轮轮播就不会了———因为CSS中没有设置默认透明度为0,选中透明度为1,切换的时候原来选中的一下子就变到底层了,所以会有第5张闪现。

  2. P.S.由于本例中尝试用setTimeout写渐出时的出错,引发的问题如:循环中的匿名函数问题,setTimeout的多次执行,另外补充博文分析。

滚动轮播

明天继续。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,628评论 2 17
  • http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">...
    love2013阅读 1,313评论 0 2
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,022评论 1 10
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 4,828评论 0 7
  • 进入前端将近一年了,js还是很弱,突发奇想写一个轮播图,就找到了这个博主的材料,和大家分享。 轮播图的原理: 一系...
    FRRRR阅读 3,578评论 0 11