原生javascript之实战 轮播图
成品效果如下图所示:
因为博客园限制图片上传大小被我删了一些帧数,所以图片看起来会有一点卡,现实运行是不会的

搭建HTML和CSS结构
HTML代码如下:
<div class="wrapper">
<ul class="sliderPage">
<li>
<img src="data:images/1.jpg">
</li>
<li>
<img src="data:images/2.jpg">
</li>
<li>
<img src="data:images/3.jpg">
</li>
<li>
<img src="data:images/1.jpg">
</li>
</ul>
<div class="btn leftBtn"><</div>
<div class="btn rightBtn">></div>
<div class="sliderIndex">
<span class="active"></span>
<span></span>
<span></span>
</div>
</div>
CSS代码如下:
* {
padding: 0px;
margin: 0px;
list-style: none;
}
.wrapper {
margin: 50px auto 0px;
width: 480px;
height: 640px;
overflow: hidden;
position: relative;
}
.wrapper .sliderPage {
height: 640px;
width: 2400px;
position: absolute;
left: 0px;
top: 0px;
}
.wrapper .sliderPage li {
width: 480px;
height: 640px;
float: left;
}
.wrapper .sliderPage li img {
width: 100%;
height: 100%;
}
.wrapper .btn {
position: absolute;
top: 50%;
margin-top: -20px;
width: 40px;
height: 40px;
color: #fff;
background-color: #000;
text-align: center;
line-height: 40px;
opacity: 0.3;
cursor: pointer;
}
.wrapper:hover .btn {
opacity: 0.7;
}
.wrapper .leftBtn {
left: 15px;
}
.wrapper .rightBtn {
right: 15px;
}
.wrapper .sliderIndex {
position: absolute;
width: 100%;
bottom: 15px;
text-align: center;
}
.wrapper .sliderIndex span {
display: inline-block;
width: 8px;
height: 8px;
background-color: #ccc;
border-radius: 50%;
margin-right: 10px;
cursor: pointer;
}
.wrapper .sliderIndex .active {
background-color: #f40;
}
搭建好后的效果如下:

传入(调用写好的运动函数)
//获取样式
function getStyle(dom, attr) {
if (window.getComputedStyle) {
return window.getComputedStyle(dom, null)[attr];
} else {
return dom.currentStyle[attr];
}
} //运动函数
function startMove(dom, attr, func) {
clearInterval(dom.timer);
var iSpeed = null, //速度
iCur = null; //当前值
dom.timer = setInterval(function () {
for (var i in attr) {
if (i == 'opacity') { //判断是否为 透明 属性,是的话,特殊处理;
iCur = parseFloat(getStyle(dom, i)) * 100;
} else {
iCur = parseInt(getStyle(dom, i));
}
iSpeed = (attr[i] - iCur) / 7;
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed); if (i == 'opacity') {
dom.style.opacity = (iCur + iSpeed) / 100;
} else {
dom.style[i] = iCur + iSpeed + 'px';
}
if (iCur == attr[i]) {
clearInterval(dom.timer);
func();
}
}
}, 30)
}
var timer = null;
var sliderPage = document.getElementsByClassName('sliderPage')[0];
var moveWidth = sliderPage.children[0].offsetWidth; //sliderPage的子节点第n位的width等于movewidth
var num = sliderPage.children.length - 1; //li的长度减去1,相当于4-1=3;刚好到了第三张也就是最后一张
var leftBtn = document.getElementsByClassName('leftBtn')[0]; // 获取左按钮事件
var rightBtn = document.getElementsByClassName('rightBtn')[0]; //获取右按钮事件
var lock = true; //设置一个锁使定时器不发生冲突,true的时候可以进入,false就把锁锁上;
//相当于一个厕所,很多人在排队, 没进入前等于true,第一个进去之后把锁锁上(也就是等于false)这样别人就进不去,
//出来的时候把锁打开(也就是等于true)方便下一个进入 var index = 0; //小圆点初始值等于0
var oSpanArray = document.getElementsByClassName('sliderIndex')[0].getElementsByTagName('span');//选出sliderIndex下面的所有span标签 // 点击向左
leftBtn.onclick = function () {
autoMove('right->left'); //当点击leftBtn的时候传入'right->left'这个实参
} // 点击向右
rightBtn.onclick = function () {
autoMove('left->right'); //当点击rightBtn的时候传入'left->right'这个实参
} //点击小圆点跳转至相应的图片和小圆点位置
for (var i = 0; i < oSpanArray.length; i++) { //先循环拿到3个span标签,也就是每个小圆点的位置
(function (myIndex) {
oSpanArray[i].onclick = function () { //给每一个小圆点注册一个点击事件
lock = false; //点击后关闭锁,防止没执行完再次运行点击事件
clearInterval(timer); //清理定时器,防止没执行完再次开启定时器
index = myIndex; //myIndex和i形参实参相统一,myIndex付给index
startMove(sliderPage,{ left: - index * moveWidth }, //执行函数让sliderPage(也就是ul)移动 function () { //再执行回调函数
lock = true; //执行完再次开启锁,方便下次开启点击事件
timer = setInterval(autoMove, 1500); //开启定时器,让图片继续运动
changeIndex(index); //执行小圆点函数,让小圆点每次点击同步
})
}
})(i)
} function autoMove(dierction) { // 函数形参传入dierction if (lock) { //lock = true时进入判断
lock = false; //进来后等于false,判断之后再次开启锁
clearInterval(timer); // 每次进入autoMove函数的时候立即关闭定时器,执行下面代码之后再次开启定时器。
// 相当于执行一次轮播一张图片之后再次开启一次定时器,再次轮播一张图片,无限循环。
if (!dierction || dierction == 'left->right') { //不传入参数时dierction等于undefined !undfined时等于true,进入if语句。
//点击左右函数的时候传入实参
index++; //小圆点位置每次加1
startMove(sliderPage,{ left: sliderPage.offsetLeft - moveWidth }, //执行函数startMove,sliderPage里面left当前值减去li的宽度,所以图片移动
function () { //再执行回调函数
if (parseInt(getStyle(sliderPage, 'left')) == -num * moveWidth) { // 判断当前left的值是否等于最后一个,也就是到了最后一张图片
index = 0; // 当到了最后一张的时候,小圆点跳转到第一张,小圆点下角标为0,也就是等于第一张图片。
sliderPage.style.left = '0px'; // 如果等于到了最后一张图片的话,就当前left值等于0。 === 回到第一张图片
}
timer = setInterval(autoMove, 1500); // 每次执行结束之后再次开启定时器
lock = true; //出去前等于true,方便下次进入,使定时器不会发生冲突同时运行多个定时器
changeIndex(index); //执行小圆点
}); } else if (dierction == 'right->left') { //当点击right按钮后实参传入'right->left',进入if语句执行以下代码
if (sliderPage.offsetLeft == 0) { //如果开始执行的时候当前位置等于0
sliderPage.style.left = - num * moveWidth + 'px'; //那就把最后一张的位置付给他,让他跳转至最后一张
index = num; //如果刚开始的时候,当前位置等于0点击向left那么跳转到最后一张图片的位置,所以直接index的下角标直接等于最后一张的位置
}
index--; //小圆点位置每次减1
startMove(sliderPage,{ left: sliderPage.offsetLeft + moveWidth },
function () {
timer = setInterval(autoMove, 1500); //每次执行之后再次开启定时器
lock = true; //出去前等于true,方便下次进入,使定时器不会发生冲突同时运行多个定时器
changeIndex(index); //执行小圆点
})
}
}
}
function changeIndex(_index) {
for (var i = 0; i < oSpanArray.length; i++) {
oSpanArray[i].className = ''; //循环小圆点让每个位置的classname等于空
}
oSpanArray[_index].className = 'active'; //因为原始值是0,所以第一个有classname样式,每次index加数,下角标改变时classname也同步改变
}
timer = setInterval(autoMove, 1500); // 设置一个定时器,每1500毫秒运行一次autoMove函数
原生javascript之实战 轮播图的更多相关文章
- Web前端原生JavaScript浅谈轮播图
1.一直来说轮播图都是困扰刚进业内小白的一大难点,因为我们不仅需要自己作出一个比较完美的运动框架(虽然网上一抓一大把,但是哪有比自己做出来实现的有成就感,不是吗?^_^),还必须需要非常关键性的把握住 ...
- 自己用原生JS写的轮播图,支持移动端触摸滑动,分页器圆点可以支持mouseover鼠标移入和click点击,高手看了勿喷哈
自己用原生JavaScript写的轮播图,分页器圆点按钮可支持click点击,也可支持mouseover鼠标悬浮触发,同时支持移动端触摸滑动,有兴趣的友友可以试试哈,菜鸟一枚,高手看了勿喷,请多多指正 ...
- 自己用原生JS写的轮播图,支持移动端触屏滑动,面向对象思路。分页器圆点支持click和mouseover。
自己用原生javascript写的轮播图,面向对象思路,支持移动端手指触屏滑动.分页器圆点可以选择click点击或mouseover鼠标移入时触发.图片滚动用的setInterval,感觉setInt ...
- jQuery与原生js实现banner轮播图
jQuery与原生js实现banner轮播图: (jq需自己加载)(图片需自己加载) <!DOCTYPE html> <html> <head> <meta ...
- 原生JS实现简易轮播图
原生JS实现简易轮播图(渐变?) 最近做网页总是会用到轮播图,我就把之前写的轮播图单独拿出来吧,如果有...如果真的有人也需要也可以复制去用用啊..哈~.. window.onload = funct ...
- 原生JavaScript之“淘宝轮播图”
轮播图是我们学习原生js的必经之路 它包含很多基本知识的运用,像this的使用,DOM的操作,还有setInterval的使用和清除,浮动与定位等等,很好的考察了我们的基础知识牢不牢固, 话不多说,直 ...
- 原生 js 左右切换轮播图
使用方法: 可能很多人对轮播图感兴趣,下面奉上本人的 原生 js 轮播代码复制 js 到页面的最底部,样式在 css 里改,js 基本不用动,有什么不懂的可以 加本人 QQ172360937 咨询 或 ...
- photoSlider-html5原生js移动开发轮播图-相册滑动插件
简单的移动端图片滑动切换浏览插件 分别引用css文件和js文件 如: <link rel="stylesheet" type="text/css" hre ...
- 从零开始学习前端JAVASCRIPT — 11、JavaScript运动模型及轮播图效果、放大镜效果、自适应瀑布流
未完待续...... 一.运动原理 通过连续不断的改变物体的位置,而发生移动变化. 使用setInterval实现. 匀速运动:速度值一直保持不变. 多物体同时运动:将定时器绑设置为对象的一个属性. ...
随机推荐
- JAVA_the user operation is waiting怎么办
彻底解决 MyEclipse出现the user operation is waiting的问题 2011-05-31 10:32:30| 分类: 软件编程 | 标签:java myecli ...
- sqlzoo练习答案--SELECT within SELECT Tutorial
This tutorial looks at how we can use SELECT statements within SELECT statements to perform more com ...
- React Native入门——布局实践:开发京东client首页(一)
有了一些对React Native开发的简单了解,让我们从实战出发.一起来构建一个简单的京东client. 这个client是仿照之前版本号的京东client开发的Android版应用,来源于CSDN ...
- IIS+Asp.Net Mvc必须知道的事(解决启动/重启/自动回收站点后第一次访问慢问题)
问题现象: Asp.net Mvc站点部署在IIS上后,第一个用户第一次访问站点,都会比较慢,确切的说是访问站点的Action页面(即非静态页面,因为静态页面直接由IIS处理返回给用户即完成请求,而A ...
- mouseout和mouseover、mouseenter和mouseleave
在前端开发中经常会碰到当鼠标放到一个元素上时会弹出你一个元素,鼠标离开那个弹出元素后隐藏.这类效果一般要用到一些鼠标事件,一类是mouseout和mouseover,另一类是mouseen ...
- 嵌入式开发之davinci--- 8148/8168/8127 中的添加算饭scd 场景检测 文档简介
Osd Scd (1) Introduction over view a) scene change detection block diagram a) gr ...
- ExtJs布局中,控件如何水平居中?
如此即可,有图有代码有j8: var formGridHead = Ext.create('Ext.form.Panel', { id: 'MyGridHead', region: 'north', ...
- 【bzoj4320】ShangHai2006 Homework
若Y小于等于sqrt(300000),暴力,对所有的插入的数都更新mn[i]. 若Y大于sqrt(300000),枚举kY,用并查集维护>=i的第一个数,这样只支持删除操作是O(1),然后倒着枚 ...
- UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP
题目链接:https://vjudge.net/problem/UVA-11324 题解: 题意:给出一张有向图,求一个结点数最大的结点集,使得任意两个结点u.v,要么u能到达v, 要么v能到达u(u ...
- YTU 2411: 谁去参加竞赛?【简单循环】
2411: 谁去参加竞赛?[简单循环] 时间限制: 1 Sec 内存限制: 64 MB 提交: 461 解决: 261 题目描述 学校要举办大学生程序设计竞赛,老师要求期末考试成绩在平均成绩以上的 ...