Печатать текст с эффектом пишущей машинки, очищать после каждого предложения в цикле

Я пытаюсь добиться эффекта пишущей машинки с моим текстом, где каждое предложение (теги h1) печатается, затем текст очищается и печатается второе предложение. Как только второе или третье предложение будет напечатано, оно должно очиститься и снова начать печатать первое предложение в цикле.

Я не могу очистить первое предложение, весь текст просто складывается, а также слово «the» не появляется.

Есть идеи, как действовать? Я хотел бы сохранить текст в HTML, чтобы я мог повторно использовать скрипт на разных страницах.

Ссылка JSFiddle: https://jsfiddle.net/b33uhLL2/

HTML:

<div id = "typewriter">
  <h1>This<br> is<br> the<br>first<br><span class = "highlight">sentence</span></h1>
  <h1>This<br> is<br> the<br>second<br>sentence</h1>
</div>

JS:

function setupTypewriter(t) {
  var HTML = t.innerHTML;

  t.innerHTML = "";

  var cursorPosition = 0,
    tag = "",
    writingTag = false,
    tagOpen = false,
    typeSpeed = 200,
    tempTypeSpeed = 0;

  var type = function() {

    if (writingTag === true) {
      tag += HTML[cursorPosition];
    }

    if (HTML[cursorPosition] === "<") {
      tempTypeSpeed = 0;
      if (tagOpen) {
        tagOpen = false;
        writingTag = true;
      } else {
        tag = "";
        tagOpen = true;
        writingTag = true;
        tag += HTML[cursorPosition];
      }
    }
    if (!writingTag && tagOpen) {
      tag.innerHTML += HTML[cursorPosition];
    }
    if (!writingTag && !tagOpen) {
      if (HTML[cursorPosition] === " ") {
        tempTypeSpeed = 0;
      } else {
        tempTypeSpeed = (Math.random() * typeSpeed) + 50;
      }
      t.innerHTML += HTML[cursorPosition];
    }
    if (writingTag === true && HTML[cursorPosition] === ">") {
      tempTypeSpeed = (Math.random() * typeSpeed) + 50;
      writingTag = false;
      if (tagOpen) {
        var newSpan = document.createElement("span");
        t.appendChild(newSpan);
        newSpan.innerHTML = tag;
        tag = newSpan.firstChild;
      }
    }

    cursorPosition += 1;
    if (cursorPosition < HTML.length - 1) {
      setTimeout(type, tempTypeSpeed);
    }

  };

  return {
    type: type
  };
}


var typer = document.getElementById('typewriter');
typewriter = setupTypewriter(typewriter);
typewriter.type();

CSS:

h1 {
  font-family: helvetica;
  font-size: 20px;
}

Вы пытаетесь сделать это своими руками или просто ищете решение? Потому что существует множество библиотек, которые уже делают это

Kerstomaat 18.03.2018 14:23

я хочу сохранить текст внутри HTML, и большинство библиотек помещают текст внутри JS

replicant129 18.03.2018 14:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
406
1

Ответы 1

Возможно, вам повезет с GreenSock.

Вы можете использовать .from внутри временной шкалы. Вот отправная точка с использованием двух заголовков.

const container = document.querySelector('div')
const h1 = document.querySelector('h1')
const h2 = document.querySelector('h2')

const typewriterTimeline = new TimelineMax({
  onStart: () => container.classList.remove('hidden')
})

typewriterTimeline
  .add(TweenMax.from(h1, 3, {text: '', delimiter: ' '}))
  .add(TweenMax.from(h2, 3, {text: '', delimiter: ' '}))
.hidden {
  display: none;
}
<div class='hidden'>
  <h1>This is the title</h1>
  <h2>This is the subtitle</h2>
</div>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/plugins/TextPlugin.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/gsap/1.20.3/TweenMax.min.js"></script>

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

Надеюсь, это поможет вам!

Другие вопросы по теме