使用jQuery.animate实现弹幕飘窗效果,在各老式机型中性能表现良好

1,380 阅读2分钟

点击查看demo

在使用js setInterval函数实现时,在老式android机型中,出现严重顿挫感,在iphone 6 plus中表现有轻微顿挫感,如此效果定不可满足产品需求,几个小时时间付之东流......

在请教大佬后,使用jQuery的animate实现,表现情况良好,顺利上线。

整体思路:将数据源添加到占位节点中,开始飘动函数并利用递归方式调用自身,直至飘动完所有数据节点

适用场景:

  1. 刚进页面时展示弹幕效果,将一定数据飘动完成后结束
  2. 飘窗广告(需在此demo上进行扩展)
  3. 实时弹幕效果(需在此demo上进行扩展,此demo没有新增数据方法)

贴上源码:

<html>
<head>
	<meta charset="UTF-8">
	<title>弹幕飘窗效果</title>
	<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>

	<style>
		body {
			overflow : hidden;
		}
		article {
			position : absolute;
			width    : 100%;
			height   : 50%;
			overflow : hidden;
		}
		article img {
			position : absolute;
			width    : 48px;
		}
	</style>
</head>
<body>

<!-------------  飘窗 占位节点,可定义屏幕区域 ------------->
<article id="area"></article>

</body>
<script>

$(function() {
	let area = $('#area');
	let jqueryDom;
	// 在此自定义数据源,以下仅做演示使用
	let data = [1, 2, 3, 4, 5, 6, 7, 8, 9];
	// 获取数据源长度,稍后用于停止飘窗效果
	let len = data.length;
	// 循环将数据源添加到 占位节点规定的指定区域
	data.forEach(function() {
		// 在此自定义要 飘屏的内容
		jqueryDom = $(`
			<img src="https://s2.ax1x.com/2019/08/05/e2Lk1H.png"
                 alt="弹幕背景图">
		`);
		// 产生随机数值
		let top = Math.floor(Math.random() * 60) + "%";
		$(jqueryDom).css({
			left : area.width() + 27,
			top  : top
		});
		area.append(jqueryDom);
	});

	// 从第一个节点开始飘动
	startAnimation(1);

	function startAnimation(num) {
		let dom = $(`#area img:nth-of-type(${num})`);
		dom.animate({left : -(dom.width()) + 'px'}, 8000);

		// 递归调用继续下个节点飘动,直到最后一个节点飘动结束后不再调用
		setTimeout(function() {
			if (num < len) {
				startAnimation(num + 1)
			}
		}, 3000); // 可以调用下一个节点开始的时间,可自己调整下看下效果
	}
})
</script>
</html>