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. 命令行创建 vue 项目(仅用于 Vue 2.x 版本)

    1 .安装 Node.js 和 npm ( 验证安装成功输入下图 1 命令行可得 2:输入命令行 3 可得 4 即安装成功) 2.安装全局 webpack (安装依照下图输入命令行 1 耐心等待至到出 ...

  2. jQuery_完成省市二级联动

    当填表的时候会让你设计某省某市怎么设计,应该明白,如果你选择了一个确定的省,那么在第二个下拉框内则不会有除了你选择的省的市之外的名称.而这功能用js来实现很麻烦,但是用jq确很容易实现. 原表结构: ...

  3. vue树形菜单

    vue树形菜单 由于项目原因,没有使用ui框架上的树形菜单,所以自己动手并参考大佬的代码写了一个树形菜单的组件,话不多说,直接上代码.html代码js代码直接调用api 把请求到的数据直接赋值给per ...

  4. legend2---开发常用语句

    legend2---开发常用语句 一.总结 一句话总结: 其实敲代码都是很类似的,比如ajax,模型等等,敲代码就是一个由生到熟的过程 1.ajax? $.post("{:url('broa ...

  5. 洛谷P5022&P5049 旅行(及其数据加强版)

    旅行(不是加强版) 加强版 加强版数据范围: 我们注意到 也就是说要么是个树,要么是个基环树 60pts 这60分是个树,可以简单的贪心想到每次都走子树中编号最小的那个,并且把1作为根 dfs练手题 ...

  6. c++ 事件回调 java

    #pragma once #ifdef __cplusplus extern "C" { #endif typedef void(*sig_t)(int); int FirstEl ...

  7. 【MM系列】SAP MM模块-科目分配的配置

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-科目分配的配置   ...

  8. 浅谈 JVM 结构体系、类加载、JDK JRE JVM 三者的关系

    一.java类,创建.编译.到运行的工程: 1.随便建一个Java类,保存后就是一个.java文件, 2.然后我们使用 javac命令编译 .java文件,生产 .class文件. 3.再然后使用 j ...

  9. 最小二乘法公式推导及Python实现

    机器学习使用线性回归方法建模时,求损失函数最优解需要用到最小二乘法.相信很多朋友跟我一样,想先知道公式是什么,然后再研究它是怎么来的.所以不多说,先上公式. 对于线性回归方程\(f(x) = ax + ...

  10. 4.站点克隆wget----隐写术图片----backbox linux

    站点克隆wget sudo bash cd Desktop/Cloned wget -h clear wget -mk https://help.ubuntu.com/ 隐写术图片 想想朋友圈的图片 ...