博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js实现轮播图常规类(原生JS,没有任何框架)
阅读量:6955 次
发布时间:2019-06-27

本文共 6270 字,大约阅读时间需要 20 分钟。

//以下是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">&lt;</p>
<p class="next">&gt;</p>
</div>
</div>
</body>
</html>
 

转载于:https://www.cnblogs.com/sun-shine1229/p/10725720.html

你可能感兴趣的文章
nginx+多个tomcat配置
查看>>
c++ primer习题9.34, 9.35, 9.40
查看>>
sublime实用插件-持续更新
查看>>
“敏捷积累”
查看>>
DotImage使用教程:从数据库中读写图像
查看>>
10 个很棒的 jQuery 代码片段
查看>>
mybatis 刷新 xml
查看>>
行业虚拟化发展趋势——“瑞友杯”虚拟化征文
查看>>
Linux初学者实验环境之创建虚拟机
查看>>
XY问题在开发中的体现
查看>>
更换或加装网卡的eth编号顺序配置
查看>>
Executors下面的线程池实现
查看>>
锐捷CCNA系列(五) 交换机配置模式切换
查看>>
squid命中率监控软件安装
查看>>
0627 网站的一次密码***,添加iptables问题
查看>>
基于Kubeadm的Flannel分析
查看>>
GlusterFS: 访问权限设置
查看>>
汉化WordPress,拥有“火星文”式的后台
查看>>
我的友情链接
查看>>
我的友情链接
查看>>