欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

透明度变化的轮播图

程序员文章站 2022-04-28 23:37:55
...

**

透明度变化的轮播图

**

一、简单介绍

轮播图是前端学习中常用的案例,通过各式各样的轮播图我们可以对JS的基础知识进行实践
下面是我在学习中所写的透明度轮播图
实际中获取更多炫酷效果的轮播图可以访问Swiper中文网

二、基本模块介绍

1.HTML部分

(1).先写一个div作为轮播图板块的主体
(2).写一个列表来存n张图
(3).写两个按钮来控制前进和后退(为了更好的样式,我用两个div添加click事件来代替)
(4).图片下方的圆点序号

html代码

		<div id="slider">
			<ul id="list">
				<li class="item"><img src="img/1.jpg"></li>
				<li class="item"><img src="img/2.jpg"></li>
				<li class="item"><img src="img/3.jpg"></li>
				<li class="item"><img src="img/4.jpg"></li>
				<li class="item"><img src="img/5.jpg"></li>
			</ul>
			<div id="left" class="button"><</div>
			<div id="right" class="button">></div>
			<ul id="pic">
				<li class="bullet focus">1</li>
				<li class="bullet">2</li>
				<li class="bullet">3</li>
				<li class="bullet">4</li>
				<li class="bullet">5</li>
			</ul>
		</div>

2.CSS部分

(1).主div(slider)的大小及位置(在这里要用相对位置relative)
(2).图片(item)的大小,位置(相对位置absolute,此时可将几张图片由纵向排列改为叠在一起1),透明度
(3).左右按钮(button)及下方圆点序号(bullet)的大小,透明度,位置,浮动

css代码

*{
	margin: 0;
	padding: 0;
}
ul {
	list-style: none;
}
#slider {
	width: 700px;
	height: 500px;
	position: relative;
	left: 700px;
	top: 100px;
}
#slider .item {
	position: absolute;
	left: 0;
	top: 0;
	opacity: 0;
}
#slider .item:first-of-type{
	opacity: 1;
}
.item img {
	width: 700px;
	height: 500px;
	display: block;
}
#slider .button {
	height: 70px;
	width: 50px;
	background-color: black;
	position: absolute;
	top: 220px;
	color: white;
	text-align: center;
	line-height: 70px;
	font-size: 30px;
	opacity: 0.2;
	cursor: pointer;       
}
#slider #left {
	left: 0;
} 
#slider #right {
	
	right: 0;
} 
#slider #pic {
	position: relative;
	top: 450px;
	left: 230px;
}
#slider #pic .bullet {
	width: 20px;
	height: 20px;
	border-radius: 50%;
	background-color: black;
	float: left;
	margin-left: 15px;
	opacity: 0.2;
	color: white;
	text-align: center;
	line-height: 20px;
	cursor: pointer;
}
#slider #pic .bullet.focus {
	opacity: 0.6;
}

下面是框架的大概形式(图片我用红色背景来代替)
透明度变化的轮播图

3.JavaScript部分

(1).获取样式的函数(兼容IE)

function getstyle(el,property){                                 //获取样式(兼容IE)
	if(getComputedStyle){
		return getComputedStyle(el)[property];
	}else{
		return el.currentStyle[property];
	}
}

(2).动画函数
这是整个轮播图的灵魂部分,可将目标从当前样式逐渐变为指定样式

函数代码

function animate(el,properties){                                //动画函数,从获取位置property运动到指定位置target
	clearInterval(el.timerId);                                  //清空上个定时器,以免重复
	el.timerId=setInterval(function(){                          //在20ms内执行动画函数
		for(var property in properties){                        //propertys为一个对象,可同时改变多个值(宽、高、透明度......)
			var current;
			var target = properties[property];
			if(property === 'opacity'){                         //透明度为小数且没单位,算法不同
				current = Math.round(parseFloat(getstyle(el,'opacity')) * 100);
			}else{
				current = parseInt(getstyle(el,property));
			}
			var speed = (target-current) / 30;                 //速度先快后慢
			speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
			if(property === 'opacity'){
				el.style.opacity = (current + speed) / 100;
			}else{
				el.style[property] = current + speed + 'px';
			}
		}
				
	},20)
}

例:将100×100,透明度为1的红色正方形变为200×300透明度0.5的正方形

		var d = document.getElementById('A');
		animate(d,{
			width:200,
			height:300,
			opacity:50
		});

透明度变化的轮播图
透明度变化的轮播图
(3).切换函数
利用上面动画函数,将当前图片透明度由1变0,目标图片由0变1

function sliderPre(){                                               //前一张
	preIndex = nextIndex;
	nextIndex--;
	if(nextIndex == -1){                                            //第一张的前一张是最后一张
		nextIndex = len-1;            
	}
	sliderTo(preIndex,nextIndex);
	
}

function sliderNext(){                                             //下一张
	preIndex = nextIndex;
	nextIndex++;
	if(nextIndex == len){                                          //最后一张的下一张是第一张
		nextIndex = 0;
	}
	sliderTo(preIndex,nextIndex);
}

function sliderTo(pre,next){                                       //切换函数(用于上一张、下一张函数内来进行图片切换


	var bullets = document.getElementsByClassName("bullet");       //当前图片序号作为焦点被点亮
	bullets[pre].className = "bullet";
	bullets[next].className = "bullet focus";
	
	var lis = document.getElementsByClassName("item");
	animate(lis[pre],{opacity:0});                                 //前一张透明度变为0
	animate(lis[next],{opacity:100});                              //后一张透明度变为1
}

(4).当无鼠标点击时,自动轮播及停止

function auto(){                                                   //自动轮播
	clearInterval(id);                                             //清空之前定时器以免重复
	id=setInterval(function(){                                     //定时器自动轮播下一张
		sliderNext();
	},2000)
}

function stopAuto(){                                                //停止自动轮播
	clearInterval(id);
}

(5).当鼠标放在左右切换键头上时,箭头透明度变大

function focus(){                                                   //当鼠标放在左右箭头上时,箭头被点亮
	var buttons = document.getElementsByClassName("button");
	var bullets = document.getElementsByClassName("bullet");
	
	buttons[0].onmouseover = function(){
		buttons[0].style.opacity = 0.8;
	}
	buttons[1].onmouseover = function(){
		buttons[1].style.opacity = 0.8;
	}
	buttons[0].onmouseout = function(){
		buttons[0].style.opacity = 0.2;
	}
	buttons[1].onmouseout = function(){
		buttons[1].style.opacity = 0.2;
	}
	
	
}

(6).轮播函数
将自动轮播,点击左右按键轮播及点击下方序号按钮轮播结合起来

function play(){                                                    //轮播播放函数
	preIndex = 0;
	nextIndex = 0;
	len = document.getElementsByClassName("item").length;
	
	focus();
	
	document.getElementById("left").onclick = function(){           //点击向右向右箭头时图片变化
		sliderPre();
	}
	document.getElementById("right").onclick = function(){
		sliderNext();
	}
	
	var bullets=document.getElementsByClassName("bullet");          //点击下方序号时图片变化
	for(var i = 0;i < bullets.length;i++){
		bullets[i].index = i;
		bullets[i].onclick = function(){
			preIndex = nextIndex;
			nextIndex = this.index;
			sliderTo(preIndex,nextIndex);
		}
	}
	
	auto();                                                         //自动轮播
	var slider = document.getElementById("slider");
	slider.onmouseover = function(){                                //鼠标放上时停止自动轮播
		stopAuto();
	}
	slider.onmouseout = function(){                                 //鼠标拿下时开始
		auto();
	}
}

工程可通过以下链接下载点击下载

相关标签: 前端技术