【问题标题】:typing animated text输入动画文本
【发布时间】:2013-02-07 11:22:24
【问题描述】:

我有 DIV 标签,里面有文字。是否可以在具有打字效果的循环中更改文本内容,在其中键入,然后向后删除字母并从新文本重新开始?用 jquery 可以吗?

【问题讨论】:

标签: jquery animation text typing


【解决方案1】:

打字效果+擦除效果+光标闪烁

我修改了 Simon Shahriveri 代码盘以进一步添加光标的闪烁效果。它也与 IE 兼容。
这是最终结果:https://codepen.io/jerrygoyal/pen/vRPpGO

HTML:

<h1>
  <a href="" class="typewrite" data-period="2000" data-type='[ "Hi, I am Jerry.", "I am Creative.", "I Love Design.", "I Love to Develop." ]'>
    <span class="wrap"></span>
  </a>
</h1>

CSS:

body {
  background-color:#ce6670;
  text-align: center;
  color:#fff;
  padding-top:10em;
}

* { color:#fff; text-decoration: none;}

.wrap{
   animation: caret 1s steps(1) infinite;
   border-right: 0.08em solid #fff;
  padding-right: 1px;
}
@keyframes caret {
  50% {
    border-color: transparent;
  }
}

JS:

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');
            if (toRotate) {
              new TxtType(elements[i], JSON.parse(toRotate), period);
            }
        }
  
    };

另一种只使用函数而不是 js 原型的方法:https://codepen.io/jerrygoyal/pen/vRPpGO

【讨论】:

    【解决方案2】:

    只是一个简单的方法:

    $("[data-typer]").attr("data-typer", function(i, txt) {
    
      var $typer = $(this),
        tot = txt.length,
        pauseMax = 300,
        pauseMin = 60,
        ch = 0;
    
      (function typeIt() {
        if (ch > tot) return;
        $typer.text(txt.substring(0, ch++));
        setTimeout(typeIt, ~~(Math.random() * (pauseMax - pauseMin + 1) + pauseMin));
      }());
    
    });
    /* PULSATING CARET */
    [data-typer]:after {
      content:"";
      display: inline-block;
      vertical-align: middle;
      width:1px;
      height:1em;
      background: #000;
              animation: caretPulsate 1s linear infinite; 
      -webkit-animation: caretPulsate 1s linear infinite; 
    }
    @keyframes caretPulsate {
      0%   {opacity:1;}
      50%  {opacity:1;}
      60%  {opacity:0;}
      100% {opacity:0;}
    }
    @-webkit-keyframes caretPulsate {
      0%   {opacity:1;}
      50%  {opacity:1;}
      60%  {opacity:0;}
      100% {opacity:0;}
    }
    <span data-typer="Hi! My name is Al. I will guide you trough the Setup process."></span>
    <h3 data-typer="This is another typing animated text"></h3>
    
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    所以基本上 jQuery 获取您元素的 data-text,逐个字符地插入,而跳动的“插入符号”不是那个 SPAN 的 CSS3 动画 :after 元素。

    另请参阅:Generate random number between two numbers in JavaScript

    【讨论】:

    • 有人叫delay
    • @Alexander ...我们是人吗? ;) 哈哈开玩笑,我借用了音频工程的术语
    • 如果$('.writer') 首先被缓存到一个变量中,这将更加高效。 var $writer = $('.writer');
    • 公式(Math.random()*(300-60+1)+60)哪里来的?
    • @oliv37 简单的数学运算。该公式在最小-最大范围内创建 rand。 Math.random 给出 0..1(不包括)之间的小数。假设我们需要随机整数。在 10 到 30 之间,(rand * 20) + 10 所以前 20 只是 (max-min)(30-10)。随机 (rand * 20) 将在逻辑上返回 0-19.999 范围内的十进制数......因为我们希望 20 包含在内,所以我们执行 +1 就像 (max-min+1) 现在我们有范围 0 - 20.999.. .将结果提高10 以获得范围10 - 30.999..。比使用Math.floor~~ 对结果进行求底,以获得完美的10 - 30 范围内的整数
    【解决方案3】:

    Jquery 的 text() 方法可让您设置元素的文本。

    http://api.jquery.com/text/

    您可以通过在循环中调用 this 来使用它来为内容设置动画,并为其提供您希望在每一帧中看到的内容。

    var frames = ['t_', 'ty_', 'typ_', 'type_']

    // loop over frames ... inner part reads frame and prints it
    // use setInterval, etc.
    $('#my-div').text( frames[i] );
    

    我通过拆分文本元素和操纵字符做了更复杂的事情,但我认为在你的情况下这将是矫枉过正。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 2017-05-21
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      相关资源
      最近更新 更多