轮播图是前端最基本、最常见的功能,不论web端还是移动端,大平台还是小网站,大多在首页都会放一个轮播图效果。本教程讲解怎么实现一个简单的轮播图效果。学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础。

本实例效果如下图所示:

根据实例效果,需要的元素有图片、中间圆点按钮、左右箭头按钮等。实际html代码如下所示:

<div class="banner_container" id="bannerContainer">
<div class="img_box"><!--图片元素-->
<div><img src="img/1.jpg" alt=""></div>
<div><img src="img/2.jpg" alt=""></div>
<div><img src="img/3.jpg" alt=""></div>
<div><img src="img/4.jpg" alt=""></div>
<div><img src="img/5.jpg" alt=""></div>
</div>
<ul class="sel_box"><!--选择按钮-->
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<div class="left_btn btn"></div><!--左切换按钮-->
<div class="right_btn btn"></div><!--右切换按钮-->
</div>

读者可以根据实际效果自行编写样式。

接下来完成javascript部分的代码,先分析一下轮播图的效果所需要的步骤。

1. 获取轮播图各个html元素及声明相关变量。如下所示:

  //获取外包容器
var eContainer = document.getElementById('bannerContainer');
//获取图片总容器
var eImgBox = eContainer.getElementsByClassName('img_box')[0];
//获取图片容器列表
var aImgList = eImgBox.getElementsByTagName('div');
//获取选择按钮容器
var eSelBox = eContainer.getElementsByClassName('sel_box')[0];
//获取选择按钮
var aSelList = eSelBox.getElementsByTagName('li');
//获取左按钮
var eLeftBtn = eContainer.getElementsByClassName('left_btn')[0];
//获取右按钮
var eRightBtn = eContainer.getElementsByClassName('right_btn')[0];
//当前图片索引
var nIndex = 0;
//轮播图自动切换定时器
var timer = null;

2. 设置图片容器大小及位置
一般轮播图的数量不是固定的,可能是3个,也可能是5个,所以 “图片容器的宽度=外包容器宽度 * 轮播图数量”,代码如下:

  //获取外包容器宽度
var nContainerW = eContainer.offsetWidth;
//设置图片总容器宽度
eImgBox.style.width = nContainerW * aImgList.length + 'px';

3. 设置默认显示图片及选择按钮,本实例第一张图为默认图片,代码如下:

  //默认显示第一张图片
eImgBox.style.left = '0px';
//默认第一个选择按钮设为当前选择按钮
aSelList[0].className = 'cur';

4. 给选择按钮绑定轮播图切换事件,在这里把点击事件委托给选择按钮容器,如下所示:

  eSelBox.addEventListener('click',function(event){
//获取当前点击元素
var eTarget = event.target;
//判断点击的是li元素,且不是当前选择按钮
if(eTarget.nodeName.toLowerCase() == 'li' && eTarget.className != 'cur'){
//设置当前图片索引
nIndex = eTarget.innerHTML-1
//修改轮播图容器位置,用于切换图片
eImgBox.style.left = -nIndex * nContainerW + 'px';
//删除所有选择按钮上的className
for(let i=0;i<aSelList.length;i++){
aSelList[i].className = '';
}
//修改当前选择按钮的className,设为当前选择按钮
eTarget.className = 'cur';
}
});

轮播图切换属于本实例核心功能,在选择数字按钮时会切换;点击左、右两个按钮时也会切换;图片还会自动切换。所以可以把切换图片的功能封装成一个函数,如下所示:

  //轮播图切换
function fnSwitchImg(){
//修改轮播图容器位置,用于切换图片
eImgBox.style.left = -nIndex * nContainerW + 'px';
//删除所有选择按钮上的className
for(let i=0;i<aSelList.length;i++){
aSelList[i].className = '';
}
//修改当前选择按钮的className,设为当前选择按钮
aSelList[nIndex].className = 'cur';
}

那么第 4 步的代码修改如下:

  //选择按钮绑定事件
eSelBox.addEventListener('click',function(event){
//获取当前点击元素
var eTarget = event.target;
//判断点击的是li元素,且不是当前选择按钮
if(eTarget.nodeName.toLowerCase() == 'li' && eTarget.className != 'cur'){
//设置当前图片索引
nIndex = eTarget.innerHTML-1
fnSwitchImg();
}
});

5. 点击左、右两个按钮也是可以切换图片的,分别添加事件,代码如下:

  eLeftBtn.onclick = function(){
if(nIndex<=0){
return; //如果当前是第一张图片,阻止后续代码执行
}
//往左切换图片
nIndex --;
fnSwitchImg();
}
eRightBtn.onclick = function(){
if(nIndex>=aSelList.length-1){
return; //如果当前是最后一张图片,阻止后续代码执行
}
//往右切换图片
nIndex ++;
fnSwitchImg();
}

6. 给轮播图添加自动切换功能
完成这些步骤之后,轮播图已能正常运行,不过大部分轮播图都是可以自动切换的。所以还需要加上一个定时器功能,设置轮播图自动切换;当鼠标移入轮播图的时候,需要移除定时器;鼠标移出时再次启动定时器。如下所示:

  //轮播图自动切换
timer = setInterval(function(){
//向右切换图片
nIndex ++;
//已切换到最后一张图片时,跳回第一张图片
if(nIndex>=5){
nIndex = 0;
}
fnSwitchImg();
},3000); //鼠标滑入轮播图停止自动切换
eContainer.onmouseenter = function(){
clearInterval(timer);
} //鼠标移出轮播图开始自动切换
eContainer.onmouseleave = function(){
//轮播图自动切换
timer = setInterval(function(){
//向右切换图片
nIndex ++;
//已切换到最后一张图片时,跳回第一张图片
if(nIndex>=5){
nIndex = 0;
}
fnSwitchImg();
},3000);
}

本实例图片切换的动画效果使用的是css3的过渡动画,所以需要给相关元素添加transition样式属性。

前端基础功能,原生js实现轮播图实例教程的更多相关文章

  1. 原生js焦点轮播图

    原生js焦点轮播图主要注意这几点: 1.前后按钮实现切换,同时注意辅助图2.中间的button随着前后按钮对应切换,同时按button也能跳转到相应的index3.间隔调用与无限轮播.4.注意在动画时 ...

  2. 封装一个简单的原生js焦点轮播图插件

    轮播图实现的效果为,鼠标移入左右箭头会出现,可以点击切换图片,下面的小圆点会跟随,可以循环播放(为了方便理解,没有补2张图做无缝轮播).本篇文章的主要目的是分享封装插件的思路. 轮播图我一开始是写成非 ...

  3. 使用原生js将轮播图组件化

    代码地址如下:http://www.demodashi.com/demo/11316.html   这是一个轮播图组件,这里是代码地址,需要传入容器的id和图片地址,支持Internet Explor ...

  4. 原生js实现轮播图

    原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...

  5. 原生JS实现轮播图的效果

    原生JS实现轮播图的效果: 只要缕清了全局变量index的作用,这个轮播图也就比较容易实现了:另外,为了实现轮这个效果,有几处clearInterval()必须写上.废话不多说,直接上代码,修复了几个 ...

  6. 用原生js封装轮播图

    原生js封装轮播图 对于初学js的同学来说,轮播图还是一个难点,尤其是原生js封装轮播图代码,下面是我之前做的一个轮播图项目中封装好的一些代码,有需要的同学可以看一下,有什么不懂的可以看注释,注释看不 ...

  7. 原生js焦点轮播图的实现

    继续学习打卡,武汉加油,逆战必胜!今日咱们主要探讨一下原生js写轮播图的问题, 简单解析一下思路: 1,首先写好css样式问题 2,考虑全局变量:自动播放的定时器,以及记录图片位置的角标Index 2 ...

  8. 原生JS的轮播图

    学习前端也有一小段时间了,当初在学习javascript的时候,练手的一个轮播图实例,轮播图也是挺常见的了. 着是通过获取图片偏移量实现的.也实现了无缝切换.还有一点问题就是没有加上图片切换的时候的延 ...

  9. 手把手原生js简单轮播图

    在团队带人,突然被人问到轮播图如何实现,进入前端领域有一年多了,但很久没自己写过,一直是用大牛写的插件,今天就写个简单的适合入门者学习的小教程.当然,轮播图的实现原理与设计模式有很多种,我这里讲的是用 ...

随机推荐

  1. Collections.synchronizedList 并发

    1.背景 集合类中的map,大家一定熟悉,知道它非线程安全.使用的方法有两种,一种是在map上加同步器(锁),另一种是创建容器时使用Collections中的静态方法对map进行包装. java ap ...

  2. flink连接器-流处理-读写redis

    写入redis resultStream.addSink(new RedisSink(FlinkUtils.getRedisSinkConfig(parameters),new MyRedisMapp ...

  3. 用DirectX 11绘制一个Cube

    之前一篇文章讲了如何初始化DirectX 11,现在在此基础上绘制一个Cube,总体可概括为以下几个步骤: 定义Cube顶点数据结构 创建Vertex Buffer和Index Buffer 编写应用 ...

  4. kubeadm部署k8s

      Kubernetes技术已经成为了原生云技术的事实标准,它是目前基础软件领域最为热门的分布式调度和管理平台.于是,Kubernetes也几乎成了时下开发工程师和运维工程师必备的技能之一. 官方文档 ...

  5. 精尽Spring MVC源码分析 - LocaleResolver 组件

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  6. Arduino PROGMEM 从程序空间读取float值的方法

    方法: 使用avr-libc提供的宏定义: #define pgm_read_float_near(address_short) __LPM_float((uint16_t)(address_shor ...

  7. [实用指南]如何使您的旧代码库(遗留代码)符合MISRA C 2012编码规范?

    重用旧代码是现实,但是在安全关键型软件项目中重用旧代码并实现MISRA C 2012的完全合规性是艰巨的任务. 最初的MISRA原则是为了在开发代码时应用而创建的,即使文档本身也有警告: " ...

  8. 一文让你彻底了解什么是CI/CD

    转载自: https://linux.cn/article-9926-1.html CI/CD简介 在软件开发中经常会提到持续集成Continuous Integration(CI)和 持续交付Con ...

  9. (六)、mkdir--创建目录make directory

    一.命令详解与命令格式 在文件系统中创建新的目录, 格式:mkdir   [-选项]   目录名 目录名既可以是相对路径名,也可是相对路径名 选项: -p或者--parent,创建指定路径中所有不存在 ...

  10. Java Int类型与字符,汉字之间的转换

    /** * java 中的流主要是分为字节流和字符流 * 再一个角度分析的话可以分为输入流和输出流 * 输入和输出是一个相对的概念 相对的分别是jvm虚拟机的内存大小 * 从另一个角度讲Java或者用 ...