Показать текст буква за буквой - PullRequest
25 голосов
/ 01 сентября 2011

Каков наиболее элегантный способ отображения букв html текста (например, подписи к видеоиграм) с использованием CSS и JavaScript?

Хотя я уверен, что его можно решить, используя метод грубой силы (скажем, разделив символы и напечатав их по одному, используя jQuery.append()), я надеюсь, что есть некоторые CSS3 (псевдоэлементы?) или волшебство JQuery, чтобы сделать это более элегантно.

Дополнительные баллы, если решение учитывает внутреннее содержимое HTML.

Ответы [ 15 ]

48 голосов
/ 01 сентября 2011

HTML

<div id="msg"/>

Javascript

var showText = function (target, message, index, interval) {   
  if (index < message.length) {
    $(target).append(message[index++]);
    setTimeout(function () { showText(target, message, index, interval); }, interval);
  }
}

Позвонить по номеру:

$(function () {
  showText("#msg", "Hello, World!", 0, 500);   
});
12 голосов
/ 01 сентября 2011

Если плавное раскрытие является разумным, то я думаю, что это должно быть довольно просто.Не проверено, но я думаю, что это будет работать

html

<div id="text"><span>The intergalactic space agency</span></div>

css

div#text { width: 0px; height: 2em; white-space: nowrap; overflow: hidden;  }

jQuery

var spanWidth = $('#test span').width();
$('#text').animate( { width: spanWidth }, 1000 );

Хорошо, я не удержался и сделал скрипку.Одна маленькая ошибка кода, которую я исправил.Выглядит хорошо для меня, хотя!

http://jsfiddle.net/mrtsherman/6qQrN/1/

3 голосов
/ 21 ноября 2014

100% ванильный JavaScript, строгий режим, ненавязчивый HTML,

function printLetterByLetter(destination, message, speed){
    var i = 0;
    var interval = setInterval(function(){
        document.getElementById(destination).innerHTML += message.charAt(i);
        i++;
        if (i > message.length){
            clearInterval(interval);
        }
    }, speed);
}

printLetterByLetter("someElement", "Hello world, bonjour le monde.", 100);
3 голосов
/ 01 сентября 2011

Вы действительно должны просто append, или показать / скрыть.

Однако, если по какой-то странной причине вы не хотите изменять свой текст, вы можете использовать это слишком сложно, потому что неткусок кода:

HTML:

<p>I'm moving slowly...<span class="cover"></span></p>

CSS:

p {
    font-family: monospace;
    float: left;
    padding: 0;
    position: relative;
}
.cover {
    height: 100%;
    width: 100%;
    background: #fff;
    position: absolute;
    top: 0;
    right: 0;
}

jQuery:

var $p = $('p'),
    $cover = $('.cover'),
    width = $p.width(),
    decrement = width / $p.text().length;

function addChar()
{        
    $cover.css('width', '-=' + decrement);

    if ( parseInt( $cover.css('width') ) < width )
    {
        setTimeout(addChar, 300);
    }
}

addChar();

И, наконец, вот скрипка: http://jsfiddle.net/dDGVH/236/

Но, серьезно, не используйте это ...

2 голосов
/ 02 августа 2015

Когда я сделал это, я столкнулся с проблемой перехода слова с конца одной строки на начало следующей, когда появились буквы, чтобы обойти это, я использовал бок о бок, один из которых текст был прозрачен, остальные видимы и просто перемещали буквы одну за другой от невидимого промежутка к видимому. Вот скрипка .

HTML

<div class='wrapper'>
  <span class='visible'></span><span class='invisible'></span>
</div>

CSS

.visible {
  color: black;
} 

.invisible {
  color: transparent;
}

JS

var text = "Whatever you want your text to be here",
    soFar = "";

var visible = document.querySelector(".visible"),
    invisible = document.querySelector(".invisible");

invisible.innerHTML = text;
var t = setInterval(function(){
  soFar += text.substr(0, 1),
  text = text.substr(1);

  visible.innerHTML = soFar;
  invisible.innerHTML = text;

  if (text.length === 0) clearInterval(t);
}, 100)
2 голосов
/ 05 мая 2014

Я сделал для этого крошечный плагин jquery.Сначала вам нужно убедиться, что текст будет виден, если javascript отключен, и, если нет, повторно отобразить текст буква за буквой.

$.fn.retype = function(delay) {
    var el = this,
        t = el.text(),
        c = t.split(''),
        l = c.length,
        i = 0;
    delay = delay || 100;
    el.empty();
    var interval = setInterval(function(){
        if(i < l) el.text(el.text() + c[i++]); 
        else clearInterval(interval);
    }, delay);
};

Использование будет так же просто, как это:

$('h1').retype();
1 голос
/ 19 декабря 2017

Сделайте ваш код более элегантным, подготовив обещания для каждой итерации, а затем выполните их как второй шаг, где вы можете внедрить логику DOM.

const message = 'Solution using Promises';

const typingPromises = (message, timeout) =>
  [...message].map(
    (ch, i) =>
      new Promise(resolve => {
        setTimeout(() => {
          resolve(message.substring(0, i + 1));
        }, timeout * i);
      })
  );

typingPromises(message, 140).forEach(promise => {
  promise.then(portion => {
    document.querySelector('p').innerHTML = portion;
  });
});
<div ><p></p></div>
1 голос
/ 17 июня 2012

Это основано на сообщении armen.shimoon:

var showText = function (target, message, index, interval) {    
    if (index <= message.length && $(target).is(':visible')) { 
        $(target).html(message.substr(0, index++)); 
        setTimeout(function () { showText(target, message, index, interval); }, interval); 
    } 
}

[index ++] не работало на моей веб-странице jquery - мне пришлось изменить его на substr.Кроме того, мой оригинальный текст использует HTML, а набранный текст использует форматирование HTML (br, b и т. Д.).У меня также есть функция остановки, если цель была скрыта.

0 голосов
/ 03 июля 2019

Ванильная версия JavaScript ответа @ armen.shimoon:

document.addEventListener('DOMContentLoaded', function() {

    showText("#msg", "Hello, World!", 0, 100);

});

let showText = function (target, message, index, interval) {
    if (index < message.length) {
        document.querySelector(target).innerHTML =
            document.querySelector(target).innerHTML + message[index++];
        setTimeout(function () { showText(target, message, index, interval); }, interval);
    }
}
<div id="msg"></div> 
<span id="text_target"></span>
0 голосов
/ 05 мая 2019

Ответ, который я наберу, - это ответ Показать текстовое письмо за буквой , но я внес в него некоторые изменения

HTML

<h1>
    <span id="msg"></span>
</h1>

Javacript

var showText = function (target, message, index, interval) {    
  if (index < message.length) { 
    //$(target).append(message[index++]);
    $(target).text($(target).text() + message[index++]);
    setTimeout(function () { showText(target, message, index, interval); }, interval); 
  } 
}

$(function () { 
  showText("#msg", "Hello, World!", 0, 80);    
  //showText("#msg", "Hello, World!", 0, 500);
}); 

CSS

#msg {
    color: #6d67c6;
    font-family: sans-serif;
    font-size: 30px;
    font-weight: bold;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...