js实现轮播图(原生JS,没有任何框架)
//以下是JS文件中的需要用的函数 可自行封装
function startMove(obj, json, fnend) {clearInterval(obj.timer); //防止定时器叠加 obj.timer = setInterval(function () {
var istrue = true;
//1.获取属性名,获取键名:属性名->初始值 for (var key in json) { //key:键名 json[key] :键值 // console.log(key); //width heigth opacity var cur = 0; //存初始值
if (key == 'opacity') { //初始值 cur = getstyle(obj, key) * 100; //透明度 } else { cur = parseInt(getstyle(obj, key)); // 300px 300 width heigth borderwidth px为单位的
}
//2.根据初始值和目标值,进行判断确定speed方向,变形:缓冲运动 //距离越大,速度越大,下面的公式具备方向 var speed = (json[key] - cur) / 6; //出现小数 speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); //不要小数部分,没有这句话或晃动
if (cur != json[key]) { //width 200 heigth 400 istrue = false; //如果没有达到目标值,开关false } else { istrue = true; //true true }
//3、运动 if (key == 'opacity') { obj.style.opacity = (cur + speed) / 100; obj.style.filter = 'alpha(opacity:' + (cur + speed) + ')'; } else { obj.style[key] = cur + speed + 'px'; //针对普通属性 left top height }
}
//4.回调函数:准备一个开关,确保以上json所有的属性都已经达到目标值,才能调用这个回调函数 if (istrue) { //如果为true,证明以上属性都达到目标值了 clearInterval(obj.timer); if (fnend) { fnend();//调用函数 } }
}, 50); //obj.timer 每个对象都有自己定时器
} //以下是代码操作 <!DOCTYPE html> <html>
<head> <meta charset="UTF-8"> <title></title> <style> * { margin: 0; padding: 0; }
li { list-style: none; }
/*图片的样式*/
#box, #box2 { width: 500px; height: 300px; background: #d8d8d8; margin: 100px auto; position: relative; overflow: hidden; }
.imglist { width: 500px; height: 300px; }
.imglist li { position: absolute; left: 0; top: 0; width: 500px; height: 300px; text-align: center; line-height: 300px; font-size: 40px; color: red; }
.imglist li img { width: 100%; height: 100%; }
.imglist li:nth-child(1) { background: #0088CC; }
.imglist li:nth-child(2) { background: lemonchiffon; }
.imglist li:nth-child(3) { background: lavenderblush; }
.imglist li:nth-child(4) { background: lightcoral; }
.imglist li:nth-child(5) { background: lightcyan; }
.imglist li:nth-child(6) { background: lightgreen; }
/*焦点样式*/
.light { width: 500px; height: 20px; position: absolute; left: 0; bottom: 10px; /*background: #ccc;*/ text-align: center; }
.light span { display: inline-block; width: 20px; height: 20px; border-radius: 50%; background: #d8d8d8; font-size: 14px; text-align: center; line-height: 20px; cursor: pointer; /*让焦点的文字消失的方法*/ /*text-indent: -9999px; overflow: hidden;*/ }
.light span.active { background: orangered; }
.light span.liang { background: lightcoral; }
/*左右按钮样式*/
.posibtn { width: 500px; height: 50px; position: absolute; left: 0; top: 50%; margin-top: -25px; /*background: #ccc;*/ }
.posibtn p { width: 50px; height: 50px; background: rgb(98, 155, 199); cursor: pointer; position: absolute; top: 0; font-size: 50px; color: #fff; text-align: center; line-height: 50px; opacity: 0.3; }
.posibtn p::selection { background: transparent; }
.posibtn p:nth-child(1) { left: 10px; }
.posibtn p:nth-child(2) { right: 10px; } </style> <script src="./common.js" type="text/javascript" charset="utf-8"></script> <script> /* 轮播图写法步骤: - 所有的图片放在右侧 - 开启定时器自动轮播:旧图挪走,新图进入 - 点击左右按钮可以切换 - 焦点跟随 - 点击焦点也可以切换对应的图片 */
window.onload = function () { // alert(1232); var box = document.getElementById('box'); var imglist = box.children[0];//div var light = box.children[1];//焦点 var posibtn = box.children[2];//按钮 var prevbtn = posibtn.children[0];//上一张 var nextbtn = posibtn.children[1];//下一张 var lis = imglist.getElementsByTagName('li'); var iw = lis[0].offsetWidth;//运动距离 var now = 0;//当前可视区图片的下标
//1.所有的图片放在右侧 for (var li of lis) { li.style.left = iw + 'px'; } lis[0].style.left = 0;//第一张放可视区
//2.开启定时器自动轮播 var timer = null;
function next() {//下一张 // console.log(now++); //旧图挪走:左侧 startMove(lis[now], { 'left': -iw });//0 //新图进入可视区: now = ++now >= lis.length ? 0 : now;//自增,这句话之前的就是旧图,这句话之后的就是新图 lis[now].style.left = iw + 'px';//放在右侧 1 startMove(lis[now], { 'left': 0 }); lightMove();//焦点跟随 }
function prev() {//上一张 //旧图挪走:右侧 startMove(lis[now], { 'left': iw }); //新图快速放在左侧再挪到可视区 now = --now <= -1 ? lis.length - 1 : now; lis[now].style.left = -iw + 'px'; startMove(lis[now], { 'left': 0 }); lightMove();//焦点跟随 }
timer = setInterval(next, 2000);//每隔两秒钟切换一个图片
//3.点击左右按钮可以切换
//鼠标移入停止运动
box.onmouseover = function () { clearInterval(timer); }
//鼠标移开继续运动 box.onmouseout = function () { timer = setInterval(next, 3000); }
//另类的需求:点击切换图片的时候:如果两次点击的时间间隔太短,让第二次点击无效
//下一张 var oldtime = new Date(); nextbtn.onclick = function () { if (new Date() - oldtime >= 800) { next(); } oldtime = new Date(); }
//上一张 prevbtn.onclick = function () { prev(); }
//4.焦点跟随 //创建焦点 var html = ''; for (var i = 0; i < lis.length; i++) { html += '<span>' + (i + 1) + '</span>'; } light.innerHTML = html; light.children[0].className = 'active';
function lightMove() { //排他 for (var i = 0; i < lis.length; i++) { light.children[i].className = ''; } light.children[now].className = 'active'; }
//5.点击焦点切换到对应的图片
//事件委托 // light.onclick = function(ev) { // if(ev.target.tagName.toLowerCase() == 'span') { // //判断点击的是哪个 // for(var i = 0; i < light.children.length; i++) { // if(ev.target == light.children[i]) { // console.log(i); // } // } // } // }
//es6 for (let i = 0; i < light.children.length; i++) { light.children[i].onclick = function () { // console.log(i); var index = i;//点击的当前焦点的下标 if (index > now) { //从右边切入新图 //旧图:放到左边 startMove(lis[now], { 'left': -iw }); //新图:快速放在右侧,再挪到可视区 lis[index].style.left = iw + 'px'; } if (index < now) { //从左边切入新图 //旧图:放到右边 startMove(lis[now], { 'left': iw }); //新图:快速放在左侧,再挪到可视区 lis[index].style.left = -iw + 'px'; // startMove(lis[index],{'left' : 0}); } startMove(lis[index], { 'left': 0 }); //新图变旧图 now = index; lightMove();//焦点跟随 } }
}
</script> </head>
<body> <div id="box"> <!--图片列表--> <div class="imglist"> <ul> <li> <img src="./img/1.jpg" alt=""> </li> <li> <img src="./img/2.jpg" alt=""> </li> <li> <img src="./img/3.jpg" alt=""> </li> <li> <img src="./img/4.jpg" alt=""> </li> <li> <img src="./img/5.jpg" alt=""> </li> <li> <img src="./img/6.jpg" alt=""> </li> </ul> </div> <!--焦点图--> <p class="light"> <!--<span class="active">1</span> <span>2</span> <span>3</span> <span>4</span> <span>5</span> <span>6</span>--> </p> <!--上下按钮--> <div class="posibtn"> <p class="prev"><</p> <p class="next">></p> </div> </div> </body>
</html>

更多精彩