原生js匀速轮播

要求:使用html+css+js实现轮播效果。

实现效果包括:打开页面自动轮播,鼠标置于轮播框内轮播暂停并显示上翻和下翻箭头。点击箭头可上翻或下翻,鼠标置于导航下标处会自动轮播到该页。

效果图:

原理: 整个轮播图看成一个box,在box里面有水平放置着几张图片(注:图片放在ul的li标签内)。将要显示的元素放在box内,超出box的元素隐藏。轮播的过程就是将并排的图片移动的过程,如下图:现在显示的是img2,如果要显示img3,只需将放图片的ul向左移动一个图片的距离。

html实现:

<div id="box" class="box">
    <ul>
        <li><a href="#"><img src="../img/slider-1.jpg" alt="" /></a></li>
	<li><a href="#"><img src="../img/slider-2.jpg" alt="" /></a></li>
	<li><a href="#"><img src="../img/slider-3.jpg" alt="" /></a></li>
	<li><a href="#"><img src="../img/slider-4.jpg" alt="" /></a></li>
    </ul>
    <ol>
    </ol>
    <div id="div_btn">
        <span id="left" class="span_btn">&lt;</span>
        <span id="right" class="span_btn">&gt;</span>
    </div>
</div>

解释:ul内放的是轮播的图片。ol内会根据放入图片的数量动态生成导航的下标 。将左右箭头放在一个div内是在显示和隐藏时比较方便。

css实现:

body,*{
	margin: 0;
	padding: 0;
	border: 0;
}
a{
	color: #000000;
}
li{
	list-style: none;
}

li{
	float: left;
}

.box{
	width: 800px;
	height: 400px;
	margin: 100px auto;
	border: 1px black solid;
	position: relative;
	overflow: hidden;
}

	.box ul{
		width: 1000%;
		height: 100%;
		position: absolute;
	}
		.box ul li img{
			width: 800px;
			height: 400px;
		}
		
	.box ol{
		position: absolute;
		bottom: 10px;
		right: 5px;
		z-index: 10;
	}
		.box ol li{
			width: 20px;
			height: 20px;
			border-radius: 10px;
			background: #FFFFFF;
			color: #000000;
			text-align: center;
			margin-right: 10px;
			cursor: pointer;
		}
		.box ol li.current{
			background: #FF0000;
		}
	#div_btn{
		display: none;
	}
	.span_btn{
		width: 50px;
		height: 60px;
		color: #FFFFFF;
		top: 170px;
		position: absolute;
		z-index: 10;
		font-size: 30px;
		text-align: center;
		line-height: 60px;
		background: rgba(255,255,255,0.3);
		cursor: pointer;
	}
	#left{
		left: 10px;
	}
	#right{
		right: 10px;
	}

解释:css主要是将图片水平排列,并通过box显示一张图片其余图片通过overflow:hidden;隐藏。将左右箭头和以后动态创建的ol内的li元素通过绝对定位 position:absolute;进行排布,不要忘记设置z-index。 

注意:需要将box和ul的position设置为relative。

 js实现:

自定义函数

/**
 * 	自定义动画移动
 * @param {Object} element 元素
 * @param {Number} step 步长
 * @param {Number} space 速度
 * @param {Number} target 目标
 * 
 */
function animate_move(element,step,space,target){
	//可优化
	clearInterval(element.setId);
	element.setId = setInterval(function(){
		let current = element.offsetLeft;
		let myStep = current<target?step:-step;
		current += myStep;
		if(Math.abs(target - current) > step ){
			element.style.left = current +"px";
		}else{
			element.style.left = target +"px";
			clearInterval(element.setId);
		}
	},space)
}

/**
 * 将parent内的孩子的class清除 并给element元素添加className
 * @param {Object} parent
 * @param {String} myClassName
 * @param {Object} element
 */
function showClass(parent,myClassName,element){
	let childen = parent.children;
	for(let i=0;i<childen.length;i++){
		childen[i].removeAttribute("class");
	}
	element.className = myClassName;
}

 

//拿到相关控件
let box = document.getElementById("box");
let left_btn = document.getElementById("left");
let right_btn = document.getElementById("right");
let div_btn = document.getElementById("div_btn");
let box_ul = box.children[0];
let box_ol = box.children[1];
let ul_lis = box_ul.children;

定义一些变量

//图片宽
let width_img = box.clientWidth;

//建立索引 移动速度  移动步长  className 自动播放
let allIndex = 0;
let space = 20;
let step = 10;
let myClassName = "current";
let playTime = null;

 

//根据图片完善结构
for(let i=0;i<ul_lis.length;i++){
	let ol_li = document.createElement("li");
	ol_li.setAttribute("index",i);
	ol_li.innerHTML = i+1;
	box_ol.appendChild(ol_li);
	
	//鼠标进入
	ol_li.onmouseover = function() {
		showClass(box_ol,myClassName,this);
		allIndex = this.getAttribute("index");
		animate_move(box_ul,step,space,-allIndex*width_img);
	}
}
box_ol.children[0].className="current";
box_ul.appendChild(ul_lis[0].cloneNode(true));//克隆  无缝循环

解释:根据图片完善结构即:完善ol的内容。此处是根据img数量来动态创建。在创建的过程中将鼠标的进入事件分别绑定。

 box鼠标进入和离开事件

//鼠标进入box
box.onmouseover = function(){
	div_btn.style.display = "block";
	clearInterval(playTime);
}
//鼠标离开box
box.onmouseout = function(){
	div_btn.style.display = "none";
	playTime = setInterval(toright,2000);
}

 箭头的点击事件:

//点击右键
right_btn.onclick = toright;
function toright() {
	//已经是最后一张图(与第一张相同) 应下一次显示第二张
	if(allIndex == ul_lis.length-1){
		box_ul.style.left = "0px";
		allIndex = 0;
	}
	allIndex++;
	animate_move(box_ul,step,space,-allIndex*width_img);
	if(allIndex == ul_lis.length-1){
		showClass(box_ol,myClassName,box_ol.children[0]);
	}else{
		showClass(box_ol,myClassName,box_ol.children[allIndex]);
	}
	
}

//点击左键
left_btn.onclick = toleft;
function toleft() {
	//已经是第一张图(与最后一张相同) 应下一次显示倒数第二张
	if(allIndex == 0){
		allIndex = ul_lis.length-1;
		box_ul.style.left = -allIndex*width_img+"px";
	}
	allIndex--;
	animate_move(box_ul,step,space,-allIndex*width_img);
	showClass(box_ol,myClassName,box_ol.children[allIndex]);
}
//自动循环
window.onload = function(){
	playTime = setInterval(toright,2000);
}

总结:这个案例需要实现的功能比较多。可以把整体分为三个部分:鼠标置于导航上轮播到相应的页面、点击左右箭头轮播、自动轮播。此案例是匀速轮播。

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值