我怎样才能循环这个函数,使动画无限重复?
How can I loop this function so that the animation repeats infinitely?
我正在尝试使此函数适应无限循环,但通常的 setInterval 不起作用。我需要循环完全重新开始,首先清除我猜想的功能吗?
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('');
let displayLetters = document.querySelector("#text");
function animate() {
asciiLetters.length > 0 ? displayLetters.innerHTML += asciiLetters.shift() : clearTimeout(moveType);
let moveType = setTimeout(animate, 5);
};
animate();
body {
background-color: black;
}
.container {
color: lime;
overflow: hidden;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
align-content: center;
justify-content: center;
}
.ascii {
display: none;
}
<div class="container">
<pre class="ascii ascii-0">
__ _
/ /_ (_)
/ __ \ / /
/ / / // /
/_/ /_//_/
</pre>
<pre id="text"></pre>
</div>
我确定有一个简单的解决方案,但我正在努力寻找它!
你想要这样的东西吗?
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('\n');
let displayLetters = document.querySelector("#text");
function animate() {
let html = displayLetters.innerHTML;
const line = asciiLetters.shift();
asciiLetters.push(line);
html = asciiLetters.slice(-5).join('\n');
displayLetters.innerHTML = html;
setTimeout(animate, 100);
};
animate();
body {
background-color: black;
}
.container {
color: lime;
overflow: hidden;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
align-content: center;
justify-content: center;
}
.ascii {
display: none;
}
<div class="container">
<pre class="ascii ascii-0">
__ _
/ /_ (_)
/ __ \ / /
/ / / // /
/_/ /_//_/
</pre>
<pre id="text"></pre>
</div>
将你的代码放在一个函数中,在为它设置动画后清除#text pre 元素,并每隔 X 秒设置一次间隔以再次调用它。
在这个例子中我使用了 2 秒延迟:
function start() {
let displayLetters = document.querySelector("#text");
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('');
function animate() {
let moveType = setTimeout(animate, 5);
asciiLetters.length > 0 ? displayLetters.innerHTML += asciiLetters.shift() : clearTimeout(moveType);
};
animate();
document.querySelector("#text").innerHTML = ' ';
}
setInterval(start, 2000); // infinite loop with 2 seconds delay.
body {
background-color: black;
}
.container {
color: lime;
overflow: hidden;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
align-content: center;
justify-content: center;
}
.ascii {
display: none;
}
<div class="container">
<pre class="ascii ascii-0">
__ _
/ /_ (_)
/ __ \ / /
/ / / // /
/_/ /_//_/
</pre>
<pre id="text"></pre>
</div>
没有 setInterval 函数
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('');
let displayLetters = document.querySelector("#text");
let asciiLettersLength = asciiLetters.length;
let i =0;
let animate = function(){
if(asciiLetters.length > 0){
displayLetters.innerHTML += asciiLetters[i];
i+=1;
//start over set counter to 0, clean the screen
if(i === asciiLettersLength){
i=0;
displayLetters.innerHTML = "";
}
} else {
clearTimeout(moveType);
}
let moveType = setTimeout(animate, 5);
};
animate();
我正在尝试使此函数适应无限循环,但通常的 setInterval 不起作用。我需要循环完全重新开始,首先清除我猜想的功能吗?
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('');
let displayLetters = document.querySelector("#text");
function animate() {
asciiLetters.length > 0 ? displayLetters.innerHTML += asciiLetters.shift() : clearTimeout(moveType);
let moveType = setTimeout(animate, 5);
};
animate();
body {
background-color: black;
}
.container {
color: lime;
overflow: hidden;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
align-content: center;
justify-content: center;
}
.ascii {
display: none;
}
<div class="container">
<pre class="ascii ascii-0">
__ _
/ /_ (_)
/ __ \ / /
/ / / // /
/_/ /_//_/
</pre>
<pre id="text"></pre>
</div>
我确定有一个简单的解决方案,但我正在努力寻找它!
你想要这样的东西吗?
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('\n');
let displayLetters = document.querySelector("#text");
function animate() {
let html = displayLetters.innerHTML;
const line = asciiLetters.shift();
asciiLetters.push(line);
html = asciiLetters.slice(-5).join('\n');
displayLetters.innerHTML = html;
setTimeout(animate, 100);
};
animate();
body {
background-color: black;
}
.container {
color: lime;
overflow: hidden;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
align-content: center;
justify-content: center;
}
.ascii {
display: none;
}
<div class="container">
<pre class="ascii ascii-0">
__ _
/ /_ (_)
/ __ \ / /
/ / / // /
/_/ /_//_/
</pre>
<pre id="text"></pre>
</div>
将你的代码放在一个函数中,在为它设置动画后清除#text pre 元素,并每隔 X 秒设置一次间隔以再次调用它。
在这个例子中我使用了 2 秒延迟:
function start() {
let displayLetters = document.querySelector("#text");
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('');
function animate() {
let moveType = setTimeout(animate, 5);
asciiLetters.length > 0 ? displayLetters.innerHTML += asciiLetters.shift() : clearTimeout(moveType);
};
animate();
document.querySelector("#text").innerHTML = ' ';
}
setInterval(start, 2000); // infinite loop with 2 seconds delay.
body {
background-color: black;
}
.container {
color: lime;
overflow: hidden;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
align-content: center;
justify-content: center;
}
.ascii {
display: none;
}
<div class="container">
<pre class="ascii ascii-0">
__ _
/ /_ (_)
/ __ \ / /
/ / / // /
/_/ /_//_/
</pre>
<pre id="text"></pre>
</div>
没有 setInterval 函数
let ascii = document.querySelector('.ascii').textContent;
let asciiLetters = ascii.split('');
let displayLetters = document.querySelector("#text");
let asciiLettersLength = asciiLetters.length;
let i =0;
let animate = function(){
if(asciiLetters.length > 0){
displayLetters.innerHTML += asciiLetters[i];
i+=1;
//start over set counter to 0, clean the screen
if(i === asciiLettersLength){
i=0;
displayLetters.innerHTML = "";
}
} else {
clearTimeout(moveType);
}
let moveType = setTimeout(animate, 5);
};
animate();