引导转盘使文本逐字母显示

Bootstrap carousel make text appearing letter by letter

本文关键字:显示 文本      更新时间:2024-04-24

我使用引导转盘作为滑块,每张幻灯片上都有一些文本。

我想把幻灯片上的文字一个字母一个字母地写出来。

我几乎解决了它。

但是有两个问题

  1. 第一张幻灯片上根本没有出现文本
  2. 如果用户转到浏览器上的其他选项卡,意味着如果当前窗口不在焦点上,那么一切都会变得一团糟

这是我的小提琴

HTML

<main>
      <div class="container">
        <div class="block-wrap">
          <div id="js-carousel" class="carousel slide" data-ride="carousel">
            <!-- Wrapper for slides -->
            <div class="carousel-inner" role="listbox">
              <div class="item active">
                <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Chania">
                <div class="caption">
                  <div class="mystring hide">companies with Inbound Marketing</div>
                  <h4>We help <div class="demo-txt"></div> </h4>
                </div>
              </div>
              <div class="item">
                <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Chania">
                <div class="caption">
                <div class="mystring hide">companies with Inbound Marketing</div>
                  <h4>We help  <div class="demo-txt "></div> </h4>
                </div>
              </div>
              <div class="item">
                <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Flower">
                <div class="caption">
                <div class="mystring hide">2companies with Inbound Marketing</div>
                  <h4>We help <div class="demo-txt"></div> </h4>
                </div>
              </div>
              <div class="item">
                <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Flower">
                <div class="caption">
                <div class="mystring hide">3companies with Inbound Marketing</div>
                  <h4>We help <div class="demo-txt"></div> </h4>
                </div>
              </div>
              <div class="overlay-effect"></div>
            </div>
          </div>
        </div> 
      </div>
    </main>

JS

$(document).ready(function() {    
     $('#js-carousel').carousel({
        interval: 5000
    });
     $('#js-carousel').on('slid.bs.carousel', function () {
      var showText = function (target, message, index, interval) { 
        if (index < message.length) { 
          $(target).append(message[index++]); 
          setTimeout(function () { showText(target, message, index, interval); }, interval); 
        } 
      }                 
       var str = $(this).find(".active .mystring").html();
          $('.active .demo-txt').html("");         
          showText(".active .demo-txt", str, 0, 100);          
     });
    });

使用setInterval函数而不是settimeout。当新幻灯片开始时,也可以使用clearInterval清除时间表。(我认为这是你的第二个问题。)

这是你的目标js文件:

$(document).ready(function() {    
    $('#js-carousel').carousel({
        interval: 5000
    });
    var handler;
    var interval = 5000;
    var index = 0;
    function showText(target, message, index, interval) { 
        if (index < message.length) { 
            $(target).append(message[index]); 
        }
    }
    function iteration() {
        if(handler){
            clearInterval(handler);
        }
        index = 0;
        var str = $(this).find(".active .mystring").html();
        $('.active .demo-txt').html("");
        showText(".active .demo-txt", str, index++, 100);         
        handler = setInterval(function(){
            showText(".active .demo-txt", str, index++, 100);
        }, 100);
     }
     //on each carousel slide change: 
     $('#js-carousel').on('slid.bs.carousel', iteration);
     //start immediately for your first problem:
     iteration.bind($('#js-carousel'))();
});

这是因为您的函数在幻灯片事件中。开始时,转盘不会滑动

Fiddle:https://jsfiddle.net/Lbasa2jh/5/

JS

$(document).ready(function() {  
    var showText = function (target, message, index, interval) { 
    if (index < message.length) { 
          $(target).append(message[index++]); 
          setTimeout(function () { showText(target, message, index, interval); }, interval); 
        } 
      };
    $('#js-carousel').carousel({
        interval: 5000
    });
       var str0 = $(this).find(".active .mystring").html();
       $('.active .demo-txt').html("");         
       showText(".active .demo-txt", str0, 0, 100);    
     $('#js-carousel').on('slid.bs.carousel', function () {
       var str = $(this).find(".active .mystring").html();
          $('.active .demo-txt').html("");         
          showText(".active .demo-txt", str, 0, 100);          
     });
    });

当选项卡处于非活动状态时,计时器可能会很棘手。我移动了代码并清除了超时,以确保在开始新幻灯片时超时是干净的。

当从不同的选项卡切换回来时,我注意到一个问题(并不总是),即转盘实际上移动到下一张幻灯片的速度快于5秒,导致文本不完整。

https://jsfiddle.net/vLwm58Ln/

$(document).ready(function() {
  $('#js-carousel').carousel({
    interval: 5000
  });
  var showText = function(target, message, index, interval) {
    if (index < message.length) {      
      	$(target).append(message[index++]);
        timer = setTimeout(function() {
           showText(target, message, index, interval);
        }, interval);
    }
  }, timer;
  
  //First time, this triggers right away instead of waiting for the slide to move
  showText(".active .demo-txt", $('#js-carousel').find(".active .mystring").html(), 0, 100);
  
  $('#js-carousel').on('slid.bs.carousel', function() {
    //clear any messed up timeout from prev slide
    clearTimeout(timer);
    //clear message that may be incomplete from the previous text animation
    $('.prevActive').removeClass('prevActive').html('');
    var str = $(this).find(".active .mystring").html();
    $('.active .demo-txt').addClass('prevActive').html("");
	showText(".active .demo-txt", str, 0, 100);
  });
});
.carousel-inner {
  position: relative;
}
.carousel-inner .overlay-effect {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.6);
}
.carousel-inner .caption {
  color: #ffffff;
  font-weight: bold;
  position: absolute;
  top: 0;
  bottom: 0;
  margin: auto 0;
  height: 100px;
  z-index: 9999;
  left: 5%;
}
.carousel-inner .caption h1,
.carousel-inner .caption h2 {
  font-weight: bold;
  line-height: 1.6;
}
.carousel-inner .caption h1 {
  font-size: 64px;
}
.carousel-inner .caption h2 {
  font-size: 44px;
}
.carousel-inner .demo-txt {
  border-bottom: 4px solid #ec8422;
  padding-bottom: 5px;
}
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.2.js"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<main>
  <div class="container">
    <div class="block-wrap">
      <div id="js-carousel" class="carousel slide" data-ride="carousel">
        <!-- Wrapper for slides -->
        <div class="carousel-inner" role="listbox">
          <div class="item active">
            <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Chania">
            <div class="caption">
              <div class="mystring hide">companies with Inbound Marketing</div>
              <h4>We help <div class="demo-txt"></div> </h4>
            </div>
          </div>
          <div class="item">
            <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Chania">
            <div class="caption">
              <div class="mystring hide">companies with Inbound Marketing</div>
              <h4>We help  <div class="demo-txt "></div> </h4>
            </div>
          </div>
          <div class="item">
            <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Flower">
            <div class="caption">
              <div class="mystring hide">2companies with Inbound Marketing</div>
              <h4>We help <div class="demo-txt"></div> </h4>
            </div>
          </div>
          <div class="item">
            <img src="http://cdn.theatlantic.com/assets/media/img/photo/2015/11/images-from-the-2016-sony-world-pho/s01_130921474920553591/main_900.jpg?1448476701" alt="Flower">
            <div class="caption">
              <div class="mystring hide">3companies with Inbound Marketing</div>
              <h4>We help <div class="demo-txt"></div> </h4>
            </div>
          </div>
          <div class="overlay-effect"></div>
        </div>
      </div>
    </div>
  </div>
</main>