很多网站上都有轮播图,但却很难找到一个系统讲解的,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出。

原理:

将一些图片在一行中平铺,然后计算偏移量再利用定时器实现定时轮播。

步骤一:建立html基本布局

如下所示:

轮播图

1

2

3

4

5

<

>

只有五张图片,却使用7张来轮播,这是为了实现无缝轮播,后面会详细介绍。

而5个span,即我们可以实时看到轮播图目前所处的位置。

最后是两个按钮,可以通过它来控制前进与后退。

这里我们需要对wrap使用绝对定位,所以用left:-600px;将第一张图片显示出来。

步骤二: css布局

首先,resetcss,如下所示:

* {

margin:0;

padding:0;

}

a{

text-decoration: none;

}

接着,我们为了让图片只在container中,所以需要限定其宽度和高度并且使用overflow:hidden;将其余的图片隐藏起来,并且我们希望wrap相对于container左右移动,所以设置为relative,如下:

.container {

position: relative;

width: 600px;

height: 400px;

margin:100px auto 0 auto;

box-shadow: 0 0 5px green;

overflow: hidden;

}

我们设置wrap是绝对定位的,所以,我们就可以通过控制Left和Right来控制图片的移动了。设置z-index:1;以对后面将要放置的buttons作为参考。 因为共有七张图片,所以width为4200px(每张图片我们设置为600X400),我们只需让图片左浮动即可实现占满一排了。

.wrap {

position: absolute;

width: 4200px;

height: 400px;

z-index: 1;

}

然后我们把图片设置位左浮动,并限定其大小,如下所示:

.container .wrap img {

float: left;

width: 600px;

height: 400px;

}

现在的效果如下:

即这时已经显示出了第一张图片。并且充满了整个container(container是有box-shadow的);

然后我们把显示次序的buttons放在图片的右下角。并且设置z-index:2;以保证buttons是在图片的上面的。

.container .buttons {

position: absolute;

right: 150px;

bottom:20px;

width: 100px;

height: 10px;

z-index: 2;

}

然后将buttons下面的span做一个简单的修饰,并且给和图片对应的span设置一个on类,如下:

.container .buttons span {

margin-left: 5px;

display: inline-block;

width: 20px;

height: 20px;

border-radius: 50%;

background-color: green;

text-align: center;

color:white;

cursor: pointer;

}

.container .buttons span.on{

background-color: red;

}

接下来,我们把左右切换的箭头加上,然后做简单的修饰,注意:因为这里使用实体来表示左右箭头,所以设置font-size才能改变其大小,

.container .arrow {

position: absolute;

top: 35%;

color: green;

padding:0px 14px;

border-radius: 50%;

font-size: 50px;

z-index: 2;

display: none;

}

.container .arrow_left {

left: 10px;

}

.container .arrow_right {

right: 10px;

}

.container:hover .arrow {

display: block;

}

.container .arrow:hover {

background-color: rgba(0,0,0,0.2);

}

步骤三:添加js逻辑

我们首先获取到 wrap(因为要设置其left才能控制轮播图),然后获取到左右两个箭头,并实现手动轮播,如下:

var wrap = document.querySelector(".wrap");

var next = document.querySelector(".arrow_right");

var prev = document.querySelector(".arrow_left");

next.onclick = function () {

next_pic();

}

prev.onclick = function () {

prev_pic();

}

function next_pic () {

var newLeft = parseInt(wrap.style.left)-600;

wrap.style.left = newLeft + "px";

}

function prev_pic () {

var newLeft = parseInt(wrap.style.left)+600;

wrap.style.left = newLeft + "px";

}

值得注意的是,这里wrap.style.left是一个字符串,所以要转化为数字才能进行计算,而设定left时就要加上px成为一个字符串了。

现在我们来测试一下:

可以看到,在第一页时,left值为-600,所以我们可以点击一次上一张,但是当再点击一次时,就出现了空白。同样的,下一张点击,到-3600是最后一张,就不能再继续点击了。

也就是说,当我们点击下一张到-3600px(这是第一张图片)时,我们需要下次跳转到第二张,即-1200px;这样才能正常跳转;

同理,当我们点击上一张到0px(这是第五张图片时),我们希望下次跳转到第四张,即-2400px;

按照这样的思路我们重新将next_pic和prev_pic函数修改如下:

function next_pic () {

var newLeft;

if(wrap.style.left === "-3600px"){

newLeft = -1200;

}else{

newLeft = parseInt(wrap.style.left)-600;

}

wrap.style.left = newLeft + "px";

}

function prev_pic () {

var newLeft;

if(wrap.style.left === "0px"){

newLeft = -2400;

}else{

newLeft = parseInt(wrap.style.left)+600;

}

wrap.style.left = newLeft + "px";

}

这时,我们就可以发现图片可以循环播放了!

但是,这时我们仅仅时手动循环播放的,我们如果希望自动播放,使用setInterval()即可,如下所示:

var timer = null;

function autoPlay () {

timer = setInterval(function () {

next_pic();

},1000);

}

autoPlay();

即先设定一个计时器,然后创建一个可以自动播放的函数,最后调用这个函数即可。 现在它就可以自动播放了,效果如下:

但是如果我们想要仔细看其中一个图片的时候,我们希望轮播图停止播放,只要clearInterval()即可,如下:

var container = document.querySelector(".container");

container.onmouseenter = function () {

clearInterval(timer);

}

container.onmouseleave = function () {

autoPlay();

}

现在,只要我们把鼠标移入轮播图中,这时轮播图就不会播放了。而移开鼠标之后,轮播图自动播放。

但是到目前为止,轮播图下方的小圆点还没有动,现在我们就实现它。

原理很简单,即设置buttons的index初始值为0,即第一个span的class为on,然后触发next_pic函数时,index加1,当触发prev_pic函数时,inex减1, 并设置当前index的小圆点的class为on, 这就要求index必须设置为全局变量,才能保证它在每一个函数的作用域中。

添加showCurrentDot函数:

var index = 0;

var dots = document.getElementsByTagName("span");

function showCurrentDot () {

for(var i = 0, len = dots.length; i < len; i++){

dots[i].className = "";

}

dots[index].className = "on";

}

在next_pic中添加代码:

index++;

if(index > 4){

index = 0;

}

在prev_pic中添加大吗:

index--;

if(index < 0){

index = 4;

}

showCurrentDot();

这样,轮播图就可以自动切换,并且小圆点也在随着图片的变化而变化了。

但是,这距离我们经常看到的轮播图还有一定距离 - - - 当点击小圆点时, 就可跳转到相应图片。 实现原理即:  点击小圆点,就使wrap的Left变成相应的值。代码如下:

for (var i = 0, len = dots.length; i < len; i++){

(function(i){

dots[i].onclick = function () {

var dis = index - i;

if(index == 4 && parseInt(wrap.style.left)!==-3000){

dis = dis - 5;

}

//和使用prev和next相同,在最开始的照片5和最终的照片1在使用时会出现问题,导致符号和位数的出错,做相应地处理即可

if(index == 0 && parseInt(wrap.style.left)!== -600){

dis = 5 + dis;

}

wrap.style.left = (parseInt(wrap.style.left) + dis * 600)+"px";

index = i;

showCurrentDot();

}

})(i);

}

原理就是当点击到小圆点时,得到相应的i值,这个i值也就是span的index值,我们拿他和全局变量index作比较,然后重新设置wrap.style.left的值,然后把i值复制给全局变量index,最后显示当前的小原点即可。值得注意的是:这里涉及到了闭包的概念,如果直接使用for循环,则不能得到正确的结果。

最终效果如图:

最终代码如下所示:

轮播图

* {

margin:0;

padding:0;

}

a{

text-decoration: none;

}

.container {

position: relative;

width: 600px;

height: 400px;

margin:100px auto 0 auto;

box-shadow: 0 0 5px green;

overflow: hidden;

}

.container .wrap {

position: absolute;

width: 4200px;

height: 400px;

z-index: 1;

}

.container .wrap img {

float: left;

width: 600px;

height: 400px;

}

.container .buttons {

position: absolute;

right: 5px;

bottom:40px;

width: 150px;

height: 10px;

z-index: 2;

}

.container .buttons span {

margin-left: 5px;

display: inline-block;

width: 20px;

height: 20px;

border-radius: 50%;

background-color: green;

text-align: center;

color:white;

cursor: pointer;

}

.container .buttons span.on{

background-color: red;

}

.container .arrow {

position: absolute;

top: 35%;

color: green;

padding:0px 14px;

border-radius: 50%;

font-size: 50px;

z-index: 2;

display: none;

}

.container .arrow_left {

left: 10px;

}

.container .arrow_right {

right: 10px;

}

.container:hover .arrow {

display: block;

}

.container .arrow:hover {

background-color: rgba(0,0,0,0.2);

}

1

2

3

4

5

<

>

var wrap = document.querySelector(".wrap");

var next = document.querySelector(".arrow_right");

var prev = document.querySelector(".arrow_left");

next.onclick = function () {

next_pic();

}

prev.onclick = function () {

prev_pic();

}

function next_pic () {

index++;

if(index > 4){

index = 0;

}

showCurrentDot();

var newLeft;

if(wrap.style.left === "-3600px"){

newLeft = -1200;

}else{

newLeft = parseInt(wrap.style.left)-600;

}

wrap.style.left = newLeft + "px";

}

function prev_pic () {

index--;

if(index < 0){

index = 4;

}

showCurrentDot();

var newLeft;

if(wrap.style.left === "0px"){

newLeft = -2400;

}else{

newLeft = parseInt(wrap.style.left)+600;

}

wrap.style.left = newLeft + "px";

}

var timer = null;

function autoPlay () {

timer = setInterval(function () {

next_pic();

},2000);

}

autoPlay();

var container = document.querySelector(".container");

container.onmouseenter = function () {

clearInterval(timer);

}

container.onmouseleave = function () {

autoPlay();

}

var index = 0;

var dots = document.getElementsByTagName("span");

function showCurrentDot () {

for(var i = 0, len = dots.length; i < len; i++){

dots[i].className = "";

}

dots[index].className = "on";

}

for (var i = 0, len = dots.length; i < len; i++){

(function(i){

dots[i].onclick = function () {

var dis = index - i;

if(index == 4 && parseInt(wrap.style.left)!==-3000){

dis = dis - 5;

}

//和使用prev和next相同,在最开始的照片5和最终的照片1在使用时会出现问题,导致符号和位数的出错,做相应地处理即可

if(index == 0 && parseInt(wrap.style.left)!== -600){

dis = 5 + dis;

}

wrap.style.left = (parseInt(wrap.style.left) + dis * 600)+"px";

index = i;

showCurrentDot();

}

})(i);

}

总结:

实现一个轮播图还是不难的,大体思路: 先创建一个div,限定其宽度和高度,overflow:hidden。然后创建一个装图片的div,宽度为所有图片的总宽度,并且使其浮动,这样所有的图片就处于一行中。然后为了实现无缝滚动,所以需要在首尾分别添加一张过渡图片。 先添加两个按钮, 使其可以手动轮播,然后只需要添加一个定时器使其朝一个方向自动轮播即可,因为用户有时需要查看详情,所以当鼠标进入时就clear定时器,滑出再定时播放。为了更好地用户体验,我们再下面添加了一排小圆点,用户可以清楚地知道现在所处的位置, 最后, 利用闭包使得用户可以直接通过点击小圆点切换图片。

js轮播图片小圆点变化_原生js实现轮播图的示例代码相关推荐

  1. js轮播图片小圆点变化_原生js实现轮播图(两种方法)

    第一种: 这个是之前写的,比较草率,没有注释,如果这个看不懂就去看第二个,比较仔细,主要是了解他,后面都会有一些插件来使用,很方便,只要几行代码就可写出各种各样的代码,所以,不懂的话,不要太在意, 第 ...

  2. js轮播图片小圆点变化_纯js实现轮播图,详解(简单,无缝,小圆点,左右手动切换,自动轮动)...

    无论用什么语言开发可视化界面,都有一个叫轮播图的东西.我们现在有个需求,如图: slideshow1.PNG 左右切换按钮默认为隐藏,当鼠标进入图片时,左右切换按钮时显示的,当鼠标离开图片时左右切换按 ...

  3. js轮播图片小圆点变化_用jQuery实现圆点图片轮播效果

    在页面的指定位置实现的图片自动的左右轮流切换展示效果,当点击图片左下的标签(或中间的小圆点)切换到对应的图片.接下来通过本文给大家分享用jQuery实现圆点图片轮播效果实例代码,需要的朋友参考下 图片 ...

  4. js轮播图片小圆点变化_JavaScript banner轮播 左右切换 圆点点击切换

    JavaScript banner轮播 左右切换 圆点点击切换 #banner { overflow:hidden; width:100%; height:400px; position:relati ...

  5. ZMY_viewpager滑动轮播图片小圆点

    //viewpager滑动轮播图片小圆点 创建drawable-----shape类型 [亮点false_shape <?xml version="1.0" encoding ...

  6. python台风动图绘制_使用Python绘制台风轨迹图的示例代码

    参考: 使用CMA热带气旋最佳路径数据集,对我国周边的台风进行绘制 import re import os import numpy as np import matplotlib.pyplot as ...

  7. python画三维立体图完整代码_如何用Matplotlib 画三维图的示例代码

    最基本的三维图是由(x, y, z)三维坐标点构成的线图与散点图,可以用ax.plot3D和ax.scatter3D函数来创建,默认情况下,散点会自动改变透明度,以在平面上呈现出立体感 三维的线图和散 ...

  8. python绘制三维地形图_如何用Matplotlib 画三维图的示例代码

    用Matplotlib画三维图 最基本的三维图是由(x, y, z)三维坐标点构成的线图与散点图,可以用ax.plot3D和ax.scatter3D函数来创建,默认情况下,散点会自动改变透明度,以在平 ...

  9. js取iframe 上级页面_原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法...

    用原生js在父页面获取iframe子页面的元素,以及在子页面获取父页面元素,这是平时经常会用到的方法,这里写一个例子来总结下: 1.父页面(demo.html),在父页面修改子页面div的背景色为灰色 ...

  10. java文字手写识别_【手写文字识别】-JavaAPI示例代码

    手写文字识别-JavaAPI示例代码 不知不觉手写文字识别百度已经开始邀测了.需要的小伙伴去申请了哦.申请方式加入文字识别群找PM.或者工单提交申请.都要说明自己的APPID哦. 接口地址:https ...

最新文章

  1. linux shell putty 无法使用 home end 键
  2. lists and Variables supported as JIT inputs/outputs. Dictionaries and strings are also accepted but
  3. memcached常用命令
  4. 《天天数学》连载08:一月八日
  5. 美化下拉框select箭头部分(不彻底)
  6. 佳能打印机g3800如何安装到计算机,【佳能 G3800 喷墨无线一体打印机使用体验】驱动|安装|连接|连接_摘要频道_什么值得买...
  7. java表格数据导出到Excel案例
  8. kali安装超详细教程
  9. 美容美发门店预约下单小程序开发制作
  10. Three.js凹凸贴图bumpMap和法线贴图.normalMap
  11. 重要公告|Moonriver成功续约Kusama平行链插槽租赁期
  12. c#使用pop3服务器进行邮箱验证
  13. PA,MIOU,FWIOU
  14. Xms/Xmx/Xmn/Xss区别
  15. 去云南看你们风花雪月
  16. Android 时间更新机制之网络更新时间
  17. 【CODEVS 3287】【NOIP2013】火车运输
  18. SourceTree导入产品证书
  19. 基于Netty和Kafka的物联网数据采集系统
  20. 抢完咖啡生意,蜜雪冰城还要抢便利店的生意

热门文章

  1. 《赛灵思中国通讯》学习记录第1期:为何使用Zynq SoC可以让企业产品利润激增
  2. linux系统鼠标主题下载,Ubuntu Linux鼠标主题:bCircle
  3. xenu死链检测工具使用教程
  4. 世界读书日 | 这11本书将颠覆技术人士的思维方式
  5. 高级工具 zeppelin 整合hive教程
  6. C++开发必备的书——《C++代码整洁之道》C++17可持续软件开发模式实践
  7. Win10怎么升级Win11 Win10升级Win11方法介绍
  8. 线性代数知识点总结,基础概念和计算整理(手写版)
  9. Rainyday.js – 傻眼了!竟然有如此逼真的雨滴效果
  10. Java Web程序设计笔记 • 【第1章 Web应用程序】