1、封装一个简单的动画函数

        function animate(obj,target,callback){
clearInterval(obj.timer);//清除定时器防止定时器重复添加
obj.timer=setInterval(function(){
var step=(target-obj.offsetLeft)/10; //定义一个步长,实现速度变化
step=step>0 ? Math.ceil(step) : Math.floor(step); //解决取整问题的bug
if(obj.offsetLeft==target){//判断运动距离与目标距离相等,停止运动
clearInterval(obj.timer);
if(callback){
callback();//如果有回调函数,执行回调函数
}
}
obj.style.left=obj.offsetLeft+step+'px'; //实现运动
},15);
}

2、页面结构

<div class="focus">
<ul class="image">
<li><a href="#"><img src="./images/banner1.jpg" alt=""></a></li>
<li><a href="#"><img src="./images/banner2.jpg" alt=""></a></li>
<li><a href="#"><img src="./images/banner3.jpg" alt=""></a></li>
<li><a href="#"><img src="./images/banner4.jpg" alt=""></a></li>
</ul>
<ul class="round"></ul>
<div class="button">
<a href="javascript:;" class="prev">上一页</a>
<a href="javascript:;" class="next">下一页</a>
</div>
</div>

3、css样式

*{
margin:;
padding:;
}
li{
list-style: none;
}
a{
text-decoration: none;
color: white;
}
img{
display: block;
}
.focus{
width: 730px;
margin: 50px auto;
/* border: 1px solid gray; */
position: relative;
overflow: hidden;
}
.image{
width: 2920px;
height: 454px;
position: relative;
}
.image li{
float: left;
}
.button{
position: absolute;
display: none;
top: 50%;
margin-top: -20px;
}
.button a{
display: inline-block;
line-height: 40px;
width: 30px;
height: 40px;
text-align: center;
background: black;
opacity: .4;
}
.button a:hover{
color: red;
}
.next{
position: absolute;
left: 700px;
top: 50%;
margin-top: -20px;
}
.round{
position: absolute;
top: 430px;
margin-left: 321px;
}
.round li{
width: 10px;
height: 10px;
border: 1px solid gray;
border-radius: 50%;
float: left;
margin-left: 10px;
}
.clear{
clear: both;
}
.current{
background: black;
}

4、js实现轮播功能

        window.addEventListener('load',function(){
var focus=document.querySelector('.focus');
var button=document.querySelector('.button');
var prev=document.querySelector('.prev');
var next=document.querySelector('.next');
var focusWidth=focus.offsetWidth;//获取轮播区域的宽度 focus.addEventListener('mouseover',function(){
button.style.display='block';
clearInterval(timer);
timer=null;
})//设置鼠标进入,显示前进后退按钮,且关闭定时器,停止滚动
focus.addEventListener('mouseout',function(){
button.style.display='none';
timer=setInterval(function(){
next.click();
},2000)
})//设置鼠标离开,隐藏前进后退按钮,且开启定时器,开始滚动 var image=document.querySelector('.image');
var round=document.querySelector('.round');
var length=image.children.length;
for(var i=0;i<length;i++){
var li=document.createElement('li');
round.appendChild(li);//动态添加小圆圈,小圆圈个数跟随图片个数变化
li.setAttribute('index',i);//设置自定义属性index
}
round.children[0].className='current';//添加第一个小圆圈默认样式 var roundLi=round.children;
for(var i=0;i<roundLi.length;i++){
roundLi[i].addEventListener('click',function(){
for(var i=0;i<roundLi.length;i++){////小圆圈点击事件,改变颜色和图片位置
roundLi[i].className='';
}//排他思想
this.className='current';
var index=this.getAttribute('index');
num=index;
circle=index;
var focusWidth=focus.offsetWidth;
animate(image,-index*focusWidth);//利用index计算图片运动的距离,实现点击小圆圈的效果
})
}
//使用克隆增加一个li放在ul的最后面,实现无缝滚动的视觉效果
var first=image.children[0].cloneNode(true);//深克隆
image.appendChild(first); var lengths=image.children.length;
image.style.width=lengths*focusWidth+'px';
//鼠标点击前进按钮的点击事件
var num=0;
var circle=0;//控制小圆圈的变化
var flag=true;
next.addEventListener('click',function(){
if(flag){ //flag节流阀防止动画运行过快
flag=false;
if(num==lengths-1){
image.style.left=0;
num=0;//点击切换到最后一张的时候,位置拉回原始位置,重新赋值num
}
num++;
animate(image,-focusWidth*num,function(){
flag=true;
});
circle++;
if(circle==length){
circle=0;
}
circleChange();
}
})
//鼠标点击后退按钮的点击事件
prev.addEventListener('click',function(){
if(flag){
flag=false;
if(num==0){
num=lengths-1;
image.style.left=-num * focusWidth +'px';
}
num--;
animate(image,-focusWidth*num,function(){
flag=true;
});
circle--;
if(circle<0){
circle=roundLi.length-1;
}
circleChange();
}
})
//把公共部分小圆圈变化封装成函数
function circleChange(){
for(var i=0;i<roundLi.length;i++){
roundLi[i].className='';
};
roundLi[circle].className='current';
}
//设置一个定时器
var timer=setInterval(function(){
next.click();//每两秒执行一次next的点击函数,实现定时轮播切换
},2000)
})

js实现完整轮播的更多相关文章

  1. 用jQuery基于原生js封装的轮播

    我发现轮播在很多网站里面都用到过,一个绚丽的轮播可以为网页增色不少,最近闲来无事,也用原生js封装了一个轮播,可能不像网上的插件那么炫,但是也有用心去做.主要用了闭包的思想.需要传递的参数有:图片地址 ...

  2. jQuery与原生js实现banner轮播图

    jQuery与原生js实现banner轮播图: (jq需自己加载)(图片需自己加载) <!DOCTYPE html> <html> <head> <meta ...

  3. 原生JS实现简易轮播图

    原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...

  4. 原生js实现无缝轮播

    原生js实现无缝轮播 因为要做到无缝,所以就要把第一张图片和最后一张连接起来,在此处采用js克隆了第一张图片的节点,添加到最后,显示图片序号的小圆按钮也是使用js动态添加的. html部分 <d ...

  5. 原生js实现图片轮播思路分析

    一.复习原生js实现图片轮播 1.要点 自动轮播 点击小圆圈按钮,显示相应图片 点击左右箭头,实现向前向后轮播图片 2.实现思路 <div id="container"> ...

  6. Bootstrap的js插件之轮播(carousel)

    轮播请查看下面演示样例.基本已经涵盖最经常使用的一个轮播 <!DOCTYPE html> <html lang="en"> <head> < ...

  7. JS+css3焦点轮播图PC端

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. js原生实现轮播图效果(面向对象编程)

    面向对象编程js原生实现轮播图效果 1.先看效果图 2.需要实现的功能: 自动轮播 点击左右箭头按钮无缝轮播 点击数字按钮切换图片 分析:如何实现无缝轮播? 在一个固定大小的相框里有一个ul标签,其长 ...

  9. 关于最近在做的一个js全屏轮播插件

    最近去面试了,对方要求我在一个星期内用原生的js代码写一个全屏轮播的插件,第一想法就是跟照片轮播很相似,只是照片轮播是有定义一个宽高度大小已经确定了的容器用来存储所有照片,然后将照片全部左浮动,利用m ...

随机推荐

  1. Oracle Mysql MSSql 三种数据库 随机查询 条 语句

    1. Oracle,随机查询查询语句-20条 select * from (  select  *  from 表名 order by dbms_random.value ) where rownum ...

  2. IoC有什么好处

    IoC(Inversion of Control):控制反转. DI(Dependency Injection):依赖注入. 控制反转是目的,依赖注入是实现控制反转的手段. 控制反转是一种面向对象的思 ...

  3. 一、基础篇--1.1Java基础-抽象类和接口的区别

    抽象类和接口的区别 抽象类和接口在设计层面的区别主要体现在:接口是对动作的抽象,抽象类是对根源.类的抽象.抽象类表示的是,这个对象是什么,接口表示的是,这个对象可以做什么. 比如,男人.女人是人,人是 ...

  4. 浏览器端-W3School:JS & DOM 参考手册

    ylbtech-浏览器端-W3School:JS & DOM 参考手册 1.返回顶部 1. JavaScript 参考手册 本部分提供完整的 JavaScript 参考手册: JavaScri ...

  5. 分布式任务队列 Celery —— 深入 Task

    目录 目录 前文列表 前言 Task 的实例化 任务的名字 任务的绑定 任务的重试 任务的请求上下文 任务的继承 前文列表 分布式任务队列 Celery 分布式任务队列 Celery -- 详解工作流 ...

  6. 前后端分离&接口API设计学习报告

    接口API设计学习报告 15331023 陈康怡 什么是API? API即Application Programming Interface.API是一种通道,负责一个程序与另一个程序的沟通.而对于w ...

  7. 2018.03.26 Python-Pandas 字符串常用方法

    import numpy as np import pandas as pd 1 #字符串常用方法 - strip s = pd.Series([' jack ','jill',' jease ',' ...

  8. centos7安装java JDK

    Java环境 1.下载jdk(用FileZilla或xshell工具连接服务器后上传到需要安装的目录) 在 /opt/deploy 下新建 java 文件夹: # mkdir / opt/deploy ...

  9. 【MM系列】SAP 关于更改物料的价格控制类型

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 关于更改物料的价格控制类型 ...

  10. 【ABAP系列】SAP ABAP中ALV使用HTML的例子

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中ALV使用HT ...