Таким образом, в основном моя CSS-анимация должна эмулировать некоторый текст, набираемый, не набираемый и, наконец, изменяемый на другое слово. Обычно ключевой кадр CSS и setInterval JavaScript синхронизируются, но на мобильных устройствах они иногда не синхронизируются или, если я перехожу на новую вкладку, они не синхронизируются.

<center style="display: flex; width:70vw">
     <h1 style="padding-right:20px;">We</h1>
     <h1 id="terminal-text">innovate.</h1>
</center>
<script type="text/javascript">
    var i = 0;
    words = ['architect.','build.','design.','code.','develop.','innovate.'];
    setInterval(function() {
      $("#terminal-text").text(words[i]);
      i++;
      if (i > words.length) {
        i=0;
      }
    },3000);
</script>
#header .banner h1 {
  margin: 1em 0 .5em -10%;
  padding: 0;
  color: white;
  text-align: left;
}
@keyframes terminal {
  0% {max-width:0}
  50% {max-width:100%}
  55% {max-width:100%}
  100% {max-width:0}
}
#header #terminal-text {
  font-weight: bold;
  margin: 1em 0 .5em 0;
  padding: 0;
  animation: terminal 3s infinite;
  overflow: hidden;
  white-space: nowrap;
  border-right: 4px solid white;
  text-align: left;
}
0
K A 22 Окт 2019 в 22:03

2 ответа

Лучший ответ

Вместо setInterval() в javascript вы можете прослушивать событие завершения анимации. Проблема с вашим подходом состоит в том, что вы не можете запустить оба «таймера» (css / js) одновременно (вы могли бы использовать другой подход), но это может решить вашу проблему

var wordIndex = 0;
words = ['architect.','build.','design.','code.','develop.','innovate.'];

var changeWord = function() {
  $("#terminal-text").text(words[wordIndex++]);
};

var element = document.querySelector("#terminal-text");
element.addEventListener("animationiteration", changeWord, false);

// you could also do something special on start event
// replace changeWord with whatever functionality you need
// element.addEventListener("animationstart", changeWord, false);

// animationend will never be triggered in your code at the moment
// but maybe you want to do something with it somewhen
// element.addEventListener("animationend", function() {console.log('animation ended')}, false);
#header .banner h1 {
  margin: 1em 0 .5em -10%;
  padding: 0;
  color: white;
  text-align: left;
}
@keyframes terminal {
  0% {max-width:0}
  50% {max-width:100%}
  55% {max-width:100%}
  100% {max-width:0}
}
#header #terminal-text {
  font-weight: bold;
  margin: 1em 0 .5em 0;
  padding: 0;
  animation: terminal 3s infinite;
  overflow: hidden;
  white-space: nowrap;
  border-right: 4px solid white;
  text-align: left;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="header">
  <center style="display: flex; width:70vw">
    <h1 style="padding-right:20px;">We</h1>
    <h1 id="terminal-text">innovate.</h1>
  </center>
</div>
1
caramba 22 Окт 2019 в 19:44

Не совсем ответ, а скорее предложение, это напомнило мне о двух простых функциях JS, которые я написал для этого некоторое время назад, type_word() и erase_word(), и я смог найти их обратно. Это на самом деле не помогает решить вашу проблему, но, в конце концов, это может помочь вам. Это довольно круто, даже использует случайный фактор времени для симуляции реалистичной печати!

var span = document.getElementById('text');

// add a right border to simulate cursor!
span.style.borderRight = "1px solid #000";

type_word('develop', span, function(){
  erase_word(span, function(){
    type_word('innovate', span, function(){
      // all finished, remove the fake cursor !
      span.style.borderRight = "0px";
    });
  });
});


function type_word(word, container, cback){
  container.innerHTML += word.substring(0,1);
  if(word.length > 1){
    var t = setTimeout(function(){type_word(word.substring(1), container, cback); }, 50+Math.random()*250);
  }
  else{
    cback();
  }
}

function erase_word(container, cback){
  container.innerHTML = span.innerHTML.slice(0, -1);
  if(container.innerHTML.length > 0){
    var t = setTimeout(function(){erase_word(container, cback); }, 50+Math.random()*50);
  }
  else{
    cback();
  }
}
We <span id="text"></span>
1
François Huppé 22 Окт 2019 в 20:03
58510777