You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现两段打字机文本效果:第二段延迟启动的解决方案

解决打字机文本动画延迟启动的问题

嘿,这个需求很好实现!我们只需要给第二段文本的打字机初始化逻辑加上延迟即可,这里有两种灵活的方案供你选择:

方案一:使用自定义data-delay属性(推荐)

这种方式更灵活,以后要调整延迟时间或者给更多元素加延迟都很方便。

修改HTML代码

给第二个.typewrite元素添加data-delay属性,值为你想要的延迟毫秒数(比如5000=5秒,10000=10秒):

<h1>
  <div class="typewrite" data-period="2000" data-type='[ "Hi, Im John Doe." ]'>
    <span class="wrap"></span>
  </div>
</h1>
<h1>
  <div class="typewrite" data-period="2000" data-type='[ "I Love to Develop." ]' data-delay="5000">
    <span class="wrap"></span>
  </div>
</h1>

修改JavaScript代码

在初始化元素的循环里,读取data-delay属性,有值的话就用setTimeout延迟初始化:

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++;
    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');
    var delay = elements[i].getAttribute('data-delay'); // 获取延迟时间

    if (toRotate) {
      // 处理延迟逻辑,用闭包保存当前元素的状态
      if (delay) {
        setTimeout(function(el, rotate, p) {
          return function() {
            new TxtType(el, JSON.parse(rotate), p);
          };
        }(elements[i], toRotate, period), parseInt(delay, 10));
      } else {
        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 #fff}";
  document.body.appendChild(css);
};

方案二:直接通过索引判断延迟

如果你只需要给第二个元素固定延迟,可以直接在循环里判断索引:

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) {
      if (i === 1) { // 第二个元素(索引从0开始)
        setTimeout(function() {
          new TxtType(elements[i], JSON.parse(toRotate), period);
        }, 5000); // 延迟5秒
      } else {
        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 #fff}";
  document.body.appendChild(css);
};

两种方案都能实现你的需求,方案一的扩展性更好,推荐使用~

内容的提问来源于stack exchange,提问作者Animesh Biswas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:14:39