『解疑』原生JS手风琴效果实现问题解决(最右侧有白色缝隙、抖动)

发现问题

在制作手风琴效果时,发现最右侧的盒子会抖动且有缝隙

解决问题

(利用前面几个盒子的宽度的改变,来展现出最后一个盒子,无需改变最后一个盒子的宽度,
相当于最后一个盒子因为前面几个盒子的宽度变小而改变自身的位置,但宽度始终不变)

1.将box的宽加大
2.固定最右侧盒子的宽度(固定为展开后的宽度)
3.在移入移出事件中无需再控制最后一个盒子的宽度

已解决问题代码

html+css+js完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		* {
		    margin: 0;
		    padding: 0;
		}
		.inner {
			width: 1200px;
			height: 500px;
			border: 1px solid black;
			overflow: hidden;
			margin: 300px auto;
		}
		#box {
			width: 2500px;/*最右侧会有缝隙,将最右侧的div宽度固定,并将box的宽度调大*/
			height: 500px;
		}
		.dv {
			width: 240px;
			height: 500px;
			float: left;
		}

	</style>
</head>
<body>
	<div class="inner">
		<div id="box">
			<div class="dv" style="background-color: red"></div>
			<div class="dv" style="background-color: green"></div>
			<div class="dv" style="background-color: blue"></div>
			<div class="dv" style="background-color: pink"></div>
			<div class="dv" style="background-color: yellow;width: 800px"></div>
		</div>
	</div>
	
	<script src="common.js"></script>
	<script>
		//获取box
		var box = my$("box");
		//获取每个子元素
		var divs = box.children;
		//给每个子元素dv注册事件
		for(var i= 0;i<divs.length;i++){
			divs[i].onmouseover = mouseoverHandle;
			divs[i].onmouseout = mouseoutHandle;
		}
		function mouseoverHandle(){
			for (var j = 0; j < divs.length-1; j++) {
				slowAnimates(divs[j],{"width":"100px"});
			}
			slowAnimates(this,{"width":"800px"});
		};
		function mouseoutHandle(){
			for (var j = 0; j < divs.length-1; j++) {
				slowAnimates(divs[j],{"width":"240px"});
			}
		}
	</script>
</body>
</html>

把动画函数封装到一个common.js的文件中:

/**
 * [slowAnimates description]可添加多个属性的缓慢动画
 * @param  {[type]} element [description]绑定的元素
 * @param  {[type]} json    [description]目标位置和运动类型的键值对象
 * @param  {[type]} fn    [description]回调函数(可选)
 * @return {[type]}         [description]
 */
function slowAnimates(element,json,fn) {
	//清理定时器
	clearInterval(element.timeId);
	//设置定时器
	element.timeId = setInterval(function(){
		//假设全部已到目标位置
		var flag = true;
		//解析json
		for(var attr in json) {
			//判断是不是opacity
			if (attr == "opacity") {
				//获取当前位置
				var current = getStyle(element,attr)*100;
				//获取目标位置
				var target = json[attr]*100;
				//设置步数
				var step = (target-current)/10;
				step = step>0 ? Math.ceil(step):Math.floor(step);
				current += step;
				element.style[attr] = current/100;
			}else if(attr == "zIndex") {//判断是不是z-index
				element.style[attr] = json[attr];
			}else {
				//获取当前位置
				var current = parseInt(getStyle(element,attr));
				//获取目标位置
				var target =parseInt(json[attr]);
				//设置步数
				var step = (target-current)/10;
				step = step>0 ? Math.ceil(step):Math.floor(step);
				current += step;
				element.style[attr] = current + "px";
			}
			if (current != target) {
				flag = false;
			}
			//测试代码
			console.log("目标位置"+target+"当前位置"+current+"每次移动步数"+step);
		}
		if (flag) {
			clearInterval(element.timeId);
			if (fn) {
				fn();
			}
		}

	},20);
	
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值