如何设置JS文字打字动画播放一次后停止,不再循环?
问题原因
你的打字动画反复循环的核心原因是代码没有设置播放终止条件:
- 原
tick方法会无条件递归调用自身,每完成一段文本的「打字输入-完全删除」流程,就会累加loopNum切换到下一段文本 - 所有预设文本轮播完成后,代码会通过
this.loopNum % this.toRotate.length的取余运算回到第一段文本,触发无限循环
解决方案
你只需要修改TxtType.prototype.tick方法,增加终止判断即可,以下提供两种常用的停止效果,按需选择即可,HTML代码无需修改:
效果1:轮播完所有文本1次后,停在最后一段文本的展示状态(不删除最后一段)
修改后的完整JavaScript代码如下:
var TxtType = function(el, toRotate, period) { this.toRotate = toRotate; this.el = el; this.loopNum = 0; this.period = parseInt(period, 10) || 2000; this.txt = ''; this.tick(); this.isDeleting = false; }; TxtType.prototype.tick = function() { var i = this.loopNum % this.toRotate.length; var fullTxt = this.toRotate[i]; if (this.isDeleting) { this.txt = fullTxt.substring(0, this.txt.length - 1); } else { this.txt = fullTxt.substring(0, this.txt.length + 1); } this.el.innerHTML = '<span class="wrap">'+this.txt+'</span>'; var that = this; var delta = 200 - Math.random() * 100; if (this.isDeleting) { delta /= 2; } if (!this.isDeleting && this.txt === fullTxt) { // 新增判断:如果是最后一段文本,打完直接终止,不再删除 if (i === this.toRotate.length - 1) { return; } delta = this.period; this.isDeleting = true; } else if (this.isDeleting && this.txt === '') { this.isDeleting = false; this.loopNum++; delta = 500; } setTimeout(function() { that.tick(); }, delta); }; window.onload = function() { var elements = document.getElementsByClassName('typewrite'); for (var i=0; i<elements.length; i++) { var toRotate = elements[i].getAttribute('data-type'); var period = elements[i].getAttribute('data-period'); if (toRotate) { new TxtType(elements[i], JSON.parse(toRotate), period); } } // INJECT CSS var css = document.createElement("style"); css.type = "text/css"; css.innerHTML = ".typewrite > .wrap { border-right: 0.08em solid #f6fd96}"; document.body.appendChild(css); };
效果2:所有文本都完成「打完-删除」的完整流程1次后停止,最终显示空文本
修改后的完整JavaScript代码如下:
var TxtType = function(el, toRotate, period) { this.toRotate = toRotate; this.el = el; this.loopNum = 0; this.period = parseInt(period, 10) || 2000; this.txt = ''; this.tick(); this.isDeleting = false; }; TxtType.prototype.tick = function() { var i = this.loopNum % this.toRotate.length; var fullTxt = this.toRotate[i]; if (this.isDeleting) { this.txt = fullTxt.substring(0, this.txt.length - 1); } else { this.txt = fullTxt.substring(0, this.txt.length + 1); } this.el.innerHTML = '<span class="wrap">'+this.txt+'</span>'; var that = this; var delta = 200 - Math.random() * 100; if (this.isDeleting) { delta /= 2; } if (!this.isDeleting && this.txt === fullTxt) { delta = this.period; this.isDeleting = true; } else if (this.isDeleting && this.txt === '') { this.isDeleting = false; this.loopNum++; // 新增判断:所有文本都完成一轮播放后直接终止 if (this.loopNum >= this.toRotate.length) { return; } delta = 500; } setTimeout(function() { that.tick(); }, delta); }; window.onload = function() { var elements = document.getElementsByClassName('typewrite'); for (var i=0; i<elements.length; i++) { var toRotate = elements[i].getAttribute('data-type'); var period = elements[i].getAttribute('data-period'); if (toRotate) { new TxtType(elements[i], JSON.parse(toRotate), period); } } // INJECT CSS var css = document.createElement("style"); css.type = "text/css"; css.innerHTML = ".typewrite > .wrap { border-right: 0.08em solid #f6fd96}"; document.body.appendChild(css); };
内容的提问来源于stack exchange,提问作者Maghiar Engelmann Bianca
相关产品推荐
相关产品推荐

