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. python3学习笔记(三):注释和字符串

    一.注释 为了让别人能够更容易理解程序,使用注释是非常有效的,即使是自己回头再看旧代码也是一样. # 打印圆的周长: print(2* pi* r) 在python 中用井号(#)表示注释.井号(#) ...

  2. es之零停机重新索引数据

    实际生产,对于文档的操作,偶尔会遇到这种问题: 某一个字段的类型不符合后期的业务了,但是当前的索引已经创建了,我们知道es在字段的mapping建立后就不可再次修改mapping的值 比如: 1): ...

  3. IT界须知的故事——仙童八叛徒

    原文:http://blog.sina.com.cn/s/blog_457012450100vnbl.html 许多电脑史学家都认为,要想了解美国硅谷的发展史,就必须了解早期的仙童半导体公司.这家公司 ...

  4. 关于MySQL去除查询结果重复值

    下面先来看看例子: table:  id name  1 a  2 b  3 c  4 c  5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多. 比如我想用一条语句查询得到name不重 ...

  5. Vue 中 双向绑定数据

    1.文本 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  6. linux下面用Mingw编译libx264

    linux下面用Mingw编译libx264 首先要先安装好mingw 我用的是Ubuntu 编译ffmpeg的时候 ,官方上面有一个自动化脚本能够把mingw安装好 这里就不说了 新版本的libx2 ...

  7. pip安装报错:Fatal error in launcher: Unable to create process using '"'

    pip安装包报错 解决方案: pip需要升级,可使用以下脚本: python -m pip install -U pip

  8. 旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)

    题目地址 : 旋转数组. 网上好多不是根本就是错的,就是空间复杂度不是真正为1 下面总结一下 方法1 普通方法(空间复杂度不满足要求,但是题目并不会判错,说明他们没用对空间进行校验) ··· publ ...

  9. udp组播的实现

    组播在内核里面对应的一个重要的结构体是ip_mreq,如下: struct ip_mreq { struct in_addr imr_multiaddr; /* IP multicast addres ...

  10. Selenium学习之==>Css Selector使用方法

    一.什么是Css Selector Css Selector定位实际就是HTML的Css选择器的标签定位 工具 Css Selector的练习建议大家安装火狐浏览器后,下载插件,FireFinder ...