js轮播图分析

Html 部分:先写一个盒子,设置id和class,一个列表,然后一个a标签,href属性设置为“JavaScript:;” 因为(javascript:)表示一个伪协议,表示在触发<a>标签时默认动作,执行一段JavaScript代码,而JavaScript:;表示什么都不执行,这样点击<a>时就没有任何反应。href=”javascript: ;”就是去掉a标签的默认行为,跟href=“javascript:void(0)“是一样的,void是JavaScript的一个运算符,void(0)就是什么都不做的意思。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>原生JS层叠图片轮播展示代码 - 站长素材</title>

<link type="text/css" href="css/style.css" rel="stylesheet" />

<script type="text/javascript" src="js/tools.js"></script>
<script type="text/javascript" src="js/js.js"></script>

</head>
<body>

<div class="wrap" id="wrap">
	<ul class="content"></ul>
	<a href="javascript:;" class="prev">&#60;</a>
	<a href="javascript:;" class="next">&#62;</a>
</div>
<div style="text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';">
</div>
</body>
</html>

 

 css部分:

body,ul {
	padding: 0;
	margin: 0;
	
}
ul {
	list-style: none;
}
.wrap {
	position: relative;
	width: 1200px;
	height: 360px;
	margin: 100px auto;
}
.content {
	position: absolute;
	width: 1200px;
	height: 360px;
}
.content li{
	position: absolute;
	background-size: 100% 100%;
	cursor: pointer;
}
.wrap a {
	position: absolute;
	display: none;
	z-index: 2;
	top: 50%;
	width: 60px;
	height: 60px;
	margin-top: -30px;
	font: 36px/60px "宋体";
	text-align: center;
	text-decoration: none;
	color: #fff;
	background: rgb(255, 100, 0);
	background: rgba(255, 100, 0, .6);
	transition: background 1s ease;
}
.wrap a:hover {
	background: rgb(255, 100, 0);
}
.prev {
	left: 30px;
}
.next {
	right: 30px;

 

JavaScript部分:window.onload()方法用于在网页加载完毕后立刻执行的操作,即当HTML文档加载完毕后,立刻执行某个方法。通常用于<body>元素,在页面完全载入后(包括图片、css文件等等)执行脚本代码。

 

1、定义一个数组,将需要轮播的图片放入数组中,这里用path添加图片路径有助于网页优化,

var imgArr=[
        {"path":"images/1.jpg"},
        {"path":"images/2.jpg"},
        {"path":"images/3.jpg"},
        {"path":"images/4.jpg"},
        {"path":"images/5.jpg"},
        {"path":"images/6.jpg"},
        {"path":"images/7.jpg"}
    ];

 

 2、定义一个数组,将放入的图片从左到右分别设置图片的大小,不透明度,在z轴上的定位(即将图片进行分层)。

var size=[
        {"top":60,"left":0,"width":400,"height":240,"zIndex":1,"opacity":0},
        {"top":60,"left":0,"width":400,"height":240,"zIndex":2,"opacity":40},
        {"top":30,"left":150,"width":500,"height":300,"zIndex":3,"opacity":70},
        {"top":0,"left":300,"width":600,"height":360,"zIndex":4,"opacity":100},
        {"top":30,"left":550,"width":500,"height":300,"zIndex":3,"opacity":70},
        {"top":60,"left":800,"width":400,"height":240,"zIndex":2,"opacity":40},
        {"top":60,"left":800,"width":400,"height":240,"zIndex":1,"opacity":0}
    ];

3、

       定义一个变量,对放入的图片的数量进行存储,

       定义一个变量,获取网页中盒子的id属性,

       定义一个变量,获取盒子中的第一个子元素节点,

       定义一个变量,获取盒子中的<a>标签

       定义一个变量,用于判断点击事件

       定义一个变量,用于记录轮播图在不点击时图片多长时间换下一张。

    var imgSum=imgArr.length;
    var wrap=document.getElementById('wrap');
    var cont=wrap.firstElementChild || wrap.firstChild;
    var btnArr=wrap.getElementsByTagName('a');
    var falg=true;
    var speed=7000;

 

 

       当鼠标移入时,给a添加一个block属性,并清除轮播图的定时器

wrap.onmouseover=function(){
        for (var i=0;i<btnArr.length;i++) {
            btnArr[i].style.display='block';
        }
        clearInterval(wrap.timer);
    }

当鼠标移出时,给a添加一个none属性,应启动轮播图的定时器

wrap.onmouseout=function(){
        for (var i=0;i<btnArr.length;i++) {
            btnArr[i].style.display='none';
        }
        wrap.timer=setInterval(function(){
             move(true);
         },speed);
    }

 

 

循环遍历添加的图片,添加一个节点(标签li),给这个节点设置背景,

lis.style.backgroundImage='url('+imgArr[i].path+')';

将之前添加的图片作为背景,并按照遍历的顺序进行添加

将这个图片节点添加入li这个标签上

for (var i=0;i<imgSum;i++) {
        var lis=document.createElement('li');             
        // lis.style.cssText='top:'+size[i].top+'px;'+'left:'+size[i].left+'px;'+'width:'+size[i].width+'px;'+'z-index:'+size[i].zIndex+';'+'height:'
        // +size[i].height+'px;'+'opacity:'+size[i].opacity+';';
        lis.style.backgroundImage='url('+imgArr[i].path+')';
        cont.appendChild(lis);
    }

 

 

定义一个变量存储返回所有元素节点

       调用函数move

       设计一个定时器,setInterval(function(){

        move(true);

    },speed);

       判断点击标签时,如果点击的时第二张图,执行定时器,

       如果点击的时当下的第一张图,则不执行定时器

 var liArr=cont.children;
    move();
    wrap.timer=setInterval(function(){
        move(true);
    },speed);
    btnArr[1].onclick=function(){
        if (falg) {
            move(true);
        }
    }
    btnArr[0].onclick=function(){
        if (falg) {
            move(false);
        }
    }

move函数:if判断,如何bool参数有值,执行下一步,如果bool的值为真,向数组size开头添加一个数组方法,并删除数组的最后一个元素。如果为假,在末尾添加一个数组,并删除数组的第一个元素

       循环遍历新数组长度,用animate方法让新数组由旧数组改变到新数组的过程中产生动画效果,并在每一次变化后给falg恢复初始状态

function move(bool){
        if(bool!=undefined){
            if(bool){
                size.unshift(size.pop());
            }else {
                size.push(size.shift());
            }
        }
        for (var i=0;i<liArr.length;i++) {
            animate(liArr[i],size[i],function(){
                falg=true;
            });
        }
    }

 

 

tool.js部分:

创建一个函数判断运用的是什么浏览器,obj.currentStyle.property表示在IE中获取元素属性值的方法,window.getComputedStyle(obj,null).ptopety


function getStyle(obj,attr){
	return obj.currentStyle ? obj.currentStyle[attr] : window.getComputedStyle(obj,null)[attr];
}

 

 

 

       对定时器进行清零操作,

       对定时器进行设置,遍历json这个对象,

 

判断如果k值得到的是不透明度(opacity)的值,则将其设为需要显示的大小,否则,将其变为整数,

if (getStyle(obj,k)==undefined) {

                    leader=100;

                }else {

                    leader=parseInt(getStyle(obj,k)*100);

                }

如果k值不是不透明度的值,则将其清零。

 

这段代码是为了改变图片在z轴上的距离与图片大小,

if(k=='zIndex'){

                obj.style[k]=json[k];

            }else if(k=='opacity'){

                obj.style[k]=leader/100;

                obj.style.filter='alpha(opacity='+leader+')';

            }else {

                obj.style[k]=leader+'px';

            }

            if(json[k]!=leader){

                bool=false;

            }

 

将定时器的效果给清零

 tool.js整合代码:

function getStyle(obj,attr){
	return obj.currentStyle ? obj.currentStyle[attr] : window.getComputedStyle(obj,null)[attr];
}

function animate(obj,json,fn){
	clearInterval(obj.timer);
	obj.timer=setInterval(function(){
		var bool=true;
		for(var k in json){
			var leader;
			if (k=='opacity') {
				if (getStyle(obj,k)==undefined) {
					leader=100;
				}else {
					leader=parseInt(getStyle(obj,k)*100);
				}
			}else {
				leader=parseInt(getStyle(obj,k)) || 0;
			}
			var step=(json[k]-leader)/10;
			step=step>0?Math.ceil(step):Math.floor(step);
			leader=leader+step;
			if(k=='zIndex'){
				obj.style[k]=json[k];
			}else if(k=='opacity'){
				obj.style[k]=leader/100;
				obj.style.filter='alpha(opacity='+leader+')';
			}else {
				obj.style[k]=leader+'px';
			}
			if(json[k]!=leader){
				bool=false;
			}
		}
		if(bool){
			clearInterval(obj.timer);
			if (fn) {
				fn();
			}
		}
	},10);
}

 

 希望各位大佬指出不对的地方,虚心求教

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个努力小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值