JS实现轮播-初学笔记

前端学习时间不长,最近看完了第一遍高设,想着试着写一点东西,于是有了这个还不算好的轮播效果。(学习出处为慕课网)


实现过程

首先,应该清楚将要实现的功能,我实现的功能主要为:

  • 鼠标滑过图片时左右两边的箭头出现,并且鼠标放在箭头上时箭头透明度降低
  • 点击左右箭头实现图片无限轮播
  • 图片下方圆点按钮会随着图片轮播而变化
  • 点击任意圆点按钮,图片能正确定位到相关位置
  • 鼠标移出图片时,图片按照一定时间间隔自动轮播,鼠标放入图片时,暂停自动播放

接下来就是实现各个功能:
1、鼠标滑过效果
鼠标滑过效果可以直接通过伪类选择符hover实现

.arrow{
    cursor: pointer;//鼠标放入箭头时显示为小手的形状
    display: none;//鼠标未滑入图片时,不显示效果
        line-height: 40px;text-align: center;font-size: 36px;font-weight: bold;width: 40px;height: 40px;
    position: absolute;//说明以父容器为定位基准
    z-index: 2;//此标签说明本部分与其他部分相比更靠近人
    top: 180px;background-color:#000;
    opacity: 0.3; //设置箭头出现的透明度
    color:#fff;
}

在鼠标滑过箭头时只需要改变箭头的透明度

.arrow:hover{
    opacity: 0.7;
}

由于之前定义了display: none;,所以现在要将其显示出来

#carousel:hover .arrow{
    display: block;
}

2、点击箭头实现轮播
通过观察控制台可以发现,在进行图片轮播时,改变的其实是图片left:00px的值,也就是说只要能有一个函数,在鼠标点击箭头时准备定位此时图片的left值,就能实现图片的切换。

function animate(offset){
     var left = parseInt(picture.style.left) + offset;
     picture.style.left = left + 'px';
}
next.onclick = function() {
    animate(-600px);//点击右箭头
}
prev.onclick = function() {
    animate(600px);//点击左箭头
}

但是上述方法不能实现无限滚动的效果,也就是说鼠标一直往一个方向点击时,会出现空白页,所以进行以下优化:
在图片轮播到第一张后再次点击箭头,图片的left值将会变大,也就是说如果想要从第一张跳转到最后一张,可以加上最后一张的附属图,并将它的left值变为最后一张图的left值,从而实现跳转。

function animate(offset){
     var left = parseInt(picture.style.left) + offset;
     if (left >-600) {
          picture.style.left = -3000 + 'px';
      }
     if (left <-3000) {
          picture.style.left = -600 + 'px';
      }
}

3、点击圆点按钮实现图片切换
每一个按钮都设置了一个index值,用来显示图片序号。首先要实现圆点点亮功能。
在css定义了一个圆点亮起的效果:

#button .on{
    background: #fff;
}

定义一个方法来点亮圆点:

function showbutton(){
    for (var i = 0; i<button.length; i++) {//遍历圆点
        if (button[i].className == 'on') {//如果遍历到的圆点亮着,则去掉,防止圆点一起亮起
            button[i].className='';
            break;
        }
    }
    button[index-1].className='on';//将当前按钮变为亮着
}
prev.onclick=function(){
    if (index == 1) {//如果没有此判断,index值将会一直减小,如果当前index为1,说明是第一个按钮,下一个按钮的index值为5
        index = 5;
    }
    else{
        index -= 1;
    }
    showbutton();
    animate(600);
}

现在要实现圆点按钮的任意切换,此时图片切换的原理与上述箭头切换一样,都是通过偏移量来进行切换,此时是通过index的值进行切换。

for (var i = 0; i < button.length; i++) {
     button[i].onclick = function(){
        if (this.className == 'on') {
            return;//跳出函数,当点击当前页面的按钮时,不进行for循环
        }
        var newindex = parseInt(this.getAttribute('index'));//获取目标值
        var offset = -600 * (newindex - index);
        animate(offset);
        index = newindex;
        showbutton();//点击后需要显示按钮
        }

4、设置图片切换速度,CSS3有一个过渡属性transition属性,但这个属性不能用在这里,试过之后可以发现图片切换的顺序实际上是123454321,而我们要的效果是1234512345,所以这里需要使用js。本效果使用setTimeout()方法来实现,每隔10ms,执行一次go()

function animate(offset){
    if(offset == 0){
        return;
    }
    animated = true;
    var time =300;
    var interval = 10;//图片切换一下的时间
    var speed = offset/(time/interval);//设置图片的切换速度
    var left = parseInt(picture.style.left) + offset;
    var go = function(){
        if ((speed > 0 && parseInt(picture.style.left) < left) || (speed < 0 && parseInt(picture.style.left) > left)) {
            picture.style.left = parseInt(picture.style.left) + speed +'px';
                        setTimeout(go,interval);
        }
        else{
            picture.style.left = left +'px';
            if(left>-200){
                picture.style.left = -600 * len + 'px';
            }
            if (left<(-600 *len)) {
                picture.style.left = '-600px';
            }
                animated = false;
        }
    }
    go();
}

5、实现自动切换
自动切换使用了定时器,在一个时间间隔里,执行点击右箭头的方法。

function play(){
            var timer = setTimeout(function(){
                    next.onclick();
                    play();
                },interval);
            }

在鼠标放在图片上时,自动切换暂停,因此需要清楚定时器。

function stop(){
                clearTimeout(timer);
            }

最后通过以下方式,实现此功能:

carousel.onmouseover = stop;
  carousel.onmouseout = play;
  play();

学习心得

虽然成功实现了轮播效果,但是在代码优化上还有很多需要改进的地方。目前还处于前端小白阶段,希望在接下来的学习中能有所提高。
(本文可能存在很多漏洞,希望众大神能批评指出,感谢!)
个人主页

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

推荐阅读更多精彩内容

  • 原理 图片轮播原理:将一系列大小相等的图片平铺,利用css布局只显示一张图片,其他图片隐藏,通过计算偏移量利用定时...
    黎贝卡beka阅读 2,232评论 1 2
  • 通过学习,我理解了图片轮播原理,学习了setTimeout()、setInterval()函数设置定时器与清除定时...
    McRay阅读 2,116评论 0 7
  • 轮播呢,也是各种网站上常见的一种展示效果,这里我来写一写实现轮播的一些简单方法。//不知道为什么系统吃了代码里面的...
    zkhChris阅读 35,606评论 3 140
  • 进入前端将近一年了,js还是很弱,突发奇想写一个轮播图,就找到了这个博主的材料,和大家分享。 轮播图的原理: 一系...
    FRRRR阅读 3,654评论 0 11
  • 本文首发于我的博客,这是我的github,欢迎star。 这是一个轮播图组件,你可以直接下载使用,这里是代码地址,...
    空_城__阅读 1,547评论 2 5