Я нашел проблему. Вы вызывали функцию сброса не в то время
function FadeInThenFadeOut() {
const timerId = setInterval(function() {
IncreaseOpacity();
if(elementOpacity >= 1){
clearInterval(timerId);
SetElementVisibility(true);
FadeOut();
ResetQuotePlacement(); // <---------------- this line
}
quotePlacement.style.opacity = elementOpacity;
}, callBackTimeInterval);
}
Если я переместил ее в функцию FadeOut
, она работает правильно
Кроме того, чтобы дождаться завершения каждой анимации затухания, вы можете просто объявите функцию showNextQuote
и вызовите ее в конце функции FadeOut
.
Вот рабочий код:
let quotes = [{
"id": 1,
"text": "text1",
"author": "author1"
},
{
"id": 2,
"text": "text2",
"author": "author2"
},
{
"id": 3,
"text": "text3",
"author": "author3"
}
];
const quotePlacement = document.createElement('div');
quotePlacement.classList.add('text-example');
function init() {
showNextQuote();
}
let quoteIndex = 0;
function showNextQuote() {
if (quoteIndex >= quotes.length) return; //alternatively, set it back to 0 to keep looping
ResetQuotePlacement();
AssignAndAppendElement(quotes[quoteIndex].text, quotes[quoteIndex].author);
quoteIndex++;
FadeInThenFadeOut();
}
let elementOpacity = 0;
const callBackTimeInterval = 50;
function FadeInThenFadeOut() {
const timerId = setInterval(function() {
IncreaseOpacity();
if (elementOpacity >= 1) {
clearInterval(timerId);
SetElementVisibility(true);
FadeOut();
}
quotePlacement.style.opacity = elementOpacity;
}, callBackTimeInterval);
}
function FadeOut() {
const timerId = setInterval(function() {
DecreaseOpacity();
if (elementOpacity <= 0) {
clearInterval(timerId);
SetElementVisibility(false);
showNextQuote();
}
quotePlacement.style.opacity = elementOpacity;
}, callBackTimeInterval);
}
function DecreaseOpacity() {
elementOpacity -= 0.025;
}
function IncreaseOpacity() {
elementOpacity += 0.025;
}
function SetElementVisibility(visibility) {
if (visibility) {
quotePlacement.style.opacity = 1;
elementOpacity = 1;
return;
}
elementOpacity = 0;
}
function AssignAndAppendElement(quoteText, author) {
quotePlacement.innerHTML = "<h1> <q>" + quoteText + "</q> - " + author + "</h1>";
quotePlacement.style.opacity = 0;
document.body.appendChild(quotePlacement);
}
function ResetQuotePlacement() {
quotePlacement.innerHTML = "";
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="styles.css">
<script defer src="main.js"></script>
<!-- <link rel="stylesheet" href="../bootstrap.css"> -->
<title>Inspirational Quotes</title>
</head>
<body onload="init()">
</body>
</html>
В качестве альтернативы вы можете использовать свойство перехода css. Это немного упрощает работу. Вот быстрый пример:
const quotes = ["Quote 1", "Quote 2", "Quote 3"];
const el = document.getElementById("holder");
el.style.opacity = 0;
let currentIndex = 0;
let currentShown = false;
const intervalID = setInterval(() => {
if (currentIndex >= quotes.length) {
clearInterval(intervalID);
return;
}
if (!currentShown) {
el.style.opacity = 1;
el.innerText = quotes[currentIndex];
currentShown = true;
} else {
el.style.opacity = 0;
currentShown = false;
currentIndex++;
}
}, 2000);
#holder {
transition: opacity 1.9s;
}
<h1 id="holder"></h1>