专栏首页前端知识分享第54天:原生js实现轮播图效果

第54天:原生js实现轮播图效果

一、轮播图的原理:

一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏。通过计算偏移量利用定时器实现自动播放,或通过手动点击事件切换图片。

二、Html布局

    首先父容器container存放所有内容,子容器list存放图片。子容器buttons存放按钮小圆点。

 1 <div id="container">
 2         <div id="list" style="left: -600px;">
 3             <img src="img/5.jpg" alt="1" />
 4             <img src="img/1.jpg" alt="1" />
 5             <img src="img/2.jpg" alt="2" />
 6             <img src="img/3.jpg" alt="3" />
 7             <img src="img/4.jpg" alt="4" />
 8             <img src="img/5.jpg" alt="5" />
 9             <img src="img/1.jpg" alt="5" />
10         </div>
11         <div id="buttons">
12             <span index="1" class="on"></span>
13             <span index="2"></span>
14             <span index="3"></span>
15             <span index="4"></span>
16             <span index="5"></span>
17         </div>
18         <a href="javascript:;" id="prev" class="arrow">&lt;</a>
19         <a href="javascript:;" id="next" class="arrow">&gt;</a>
20     </div>

优化,无缝滚动。

当你从最后一张图切换回第一张图时,有很大空白,利用两张辅助图来填补这个空白。

这里补充下无缝滚动,直接看代码,复制最后一张图片放置第一张图片前,同时复制第一张图片放置最后一张图片的后面。并且,将第一张图片辅助图(实际上是实际显示的第5张图片隐藏起来,故设置style="left: -600px;"

三、CSS修饰

1、对盒子模型,文档流的理解,绝对定位问题。

2、注意list的overflow:hidden;只显示窗口的一张图片,把左右两边的都隐藏起来。

3、确保buttons中每个span所在层置顶,将其设置为最顶端。(z-index:999)我这里设置为z-index:2

* { margin: 0; padding: 0; text-decoration: none; } body { padding: 20px; } #container { position: relative; width: 600px; height: 400px; border: 3px solid #333; overflow: hidden; } #list { position: absolute; z-index: 1; width: 4200px; height: 400px; } #list img { float: left; width: 600px; height: 400px; } #buttons { position: absolute; left: 250px; bottom: 20px; z-index: 2; height: 10px; width: 100px; } #buttons span { float: left; margin-right: 5px; width: 10px; height: 10px; border: 1px solid #fff; border-radius: 50%; background: #333; cursor: pointer; } #buttons .on { background: orangered; } .arrow { position: absolute; top: 180px; z-index: 2; display: none; width: 40px; height: 40px; font-size: 36px; font-weight: bold; line-height: 39px; text-align: center; color: #fff; background-color: RGBA(0, 0, 0, .3); cursor: pointer; } .arrow:hover { background-color: RGBA(0, 0, 0, .7); } #container:hover .arrow { display: block; } #prev { left: 20px; } #next { right: 20px; }

四、Js

首先我们先实现出手动点击左右两个箭头切换图片的效果:

window.onload = function() { var list = document.getElementById('list');var prev = document.getElementById('prev'); var next = document.getElementById('next');

function animate(offset) { //获取的是style.left,是相对左边获取距离,所以第一张图后style.left都为负值, //且style.left获取的是字符串,需要用parseInt()取整转化为数字。 var newLeft = parseInt(list.style.left) + offset; list.style.left = newLeft + 'px'; }

prev.onclick = function() { animate(600); } next.onclick = function() { animate(-600); } }

运行后我们会发现,一直点击右箭头 ,会出现空白,而且,不能回到第一张图片。要点击左箭头才能回到第一张图片。

利用谷歌浏览器F12,原因是我们利用偏移量left来获取图片,当看到left值小于3600时,因为没有第8张图片就出现空白,所以这里我们需要对偏移量做一个判断。

在animate函数里加上这么一段:

if(newLeft<-3000){
      list.style.left = -600 + 'px';
 }
 if(newLeft>-600){
      list.style.left = -3000 + 'px';
 }

好,运行一下,没问题了。轮播图,顾名思义,是自己会动的图片,这个时候我们需要用到浏览器的内置对象定时器。

对于定时器,有必要说明一下setInterval()跟setTimeout的区别了。简单来说,setInterval()执行多次,setTimeout()只执行一次。

这里我是用setInterval(),因为图片需要循环滚动。插入下面

var timer; function play() { timer = setInterval(function () { prev.onclick() }, 1500) } play();

但是,当我们想仔细看某一张图片时候,要把图片停住,我们清楚定时器就可以了,这里用到window.clearInterval()这个方法。

这里,我们需要对其DOM操作,需要获取整个轮播图区域;

var container = document.getElementById('container');

function stop() { clearInterval(timer); } container.onmouseover = stop; container.onmouseout = play;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第123天:移动web开发中的常见问题

    准备编辑这段时发现简书上已经有作者写了关于rem布局的介绍,并且他的设置比我所用的更加简洁,贴上地址供大家学习参考。 手机端页面自适应解决方案—rem布局进阶...

    半指温柔乐
  • 第9天:CSS精灵图

    “CSS精灵”,英语css sprite,所以也叫做“CSS雪碧”技术。是一种CSS图像合并技术,该方法是将小图标和背景图像合并到一张图片上,然后利用css的背...

    半指温柔乐
  • 第145天:jQuery.touchSlider触屏满屏左右滚动幻灯片

    半指温柔乐
  • vuejs小例子之实现图片的切换

    绝命生
  • 手机端调用系统相册并上传图片

    css: 1 .upload-img{ 2 width:80%; 3 position:fixed; 4 top:50%; 5...

    蓓蕾心晴
  • jsp实现轮播图

    背景 支持ie老版本没办法使用比较新的框架,只能使用原始js实现。 演示地址 实现功能如下:

    崔笑颜
  • kafka consumer assign 和 subscribe模式差异分析

    转载请注明原创地址:http://www.cnblogs.com/dongxiao-yang/p/7200971.html

    sanmutongzi
  • 【实用】div选中添加√,并将选中的图片在其他地方显示

    凯哥Java
  • 【前端攻略--HTML/CSS】边框、文字效果与字体图标实例介绍

    字体:实际上是长得像图标的字体,占用的空间小,消耗的带宽小,能够更快的显示页面。字体是矢量的,所以不会失真,可以按照字体一样设置字体颜色和大小。

    小Gy
  • 实现拼图滑动验证码

    拼图滑动验证码的纯前端简单实现,重要部分都已标注注释,如果需要配合后端可以参考此思路,后端处理图片生成一个带缺口的背景图与一个符合缺口的拼图,并将取得拼图块的位...

    WindrunnerMax

扫码关注云+社区

领取腾讯云代金券