使用 CSS 使元素在每次调用 onClick 函数时淡入

Make elements fade In with every call of onClick function with CSS

页面上的每一次点击都会显示一个新的经文元素。现在我试图让不同的 Textparts 淡入。有没有一种简单的方法可以用我的 CSS 来做到这一点?我已经尝试添加

document.addEventListener('click', myFunction);

let verses = document.querySelector("#verses").children

let count = 0

function myFunction() {
  Array.from(verses).forEach(el => el.style.display = "none")
  if (count < verses.length) {
    let el = verses[count]
    el.classList.add("animating")
    el.style.display = 'block'

    //This function runs when the CSS animation is completed
    var listener = el.addEventListener('animationend', function() {
      el.classList.remove("animating");
    });
    count++
    if (count === verses.length) count = 0
  }
#verses {
  position: relative;
  overflow: hidden;
  transition: opacity 1s;
}

@keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

#verses.animating {
  animation: fadeIn 1s;
}
<div class="banner">
  <div id="verses">
    <div class="verse1" style="display: none">Lorem Ipsum.</div>
    <div class="verse2" style="display: none">Lorem Ipsum.</div>
    <div class="verse3" style="display: none">Lorem Ipsum.</div>
  </div>

我是否需要更改 JavaScript 中调用以显示块中经文的行?我已经用 el.style.opacity 试过了,但没用。我希望有一个更简单的解决方案。

太多的代码试图做同样的事情......太混乱了,你也有不必要的内联样式弹出。从好的方面来看,CSS 看起来很准确。通过专注于满足您的 objective 的单一方式进行简化,即每次点击添加一个 class 到下一个标签,直到剩下 none。

首先声明一些您希望在事件处理程序(注册到事件的函数)完成后保留的变量。一旦一个函数结束,它的所有变量都会被垃圾收集,如果有任何值(比如已经发生了多少次点击)它会回到它的初始值。参见 closures

let counter = 0;
const quotes = [...document.querySelectorAll('cite')];
// Collect all <cite> tags into a NodeList then convert it into an array

接下来,注册一个祖先标签(包含所有<cite>的标签,其中包括window<html>标签、document<body> 标签等)添加到“点击”事件中。开始定义事件处理程序,注意,所有事件处理程序都传递 Event Object.

document.onclick = reveal;

function reveal(event) {//...
 //reveal is the event handler

然后在事件处理程序中,确保它在完成所有 <cite> 后停止。

//...
if (counter >= quotes.length) {
  return
}
//...

最后,应用当前计数器值作为引号数组的索引号并添加.fadeIn class。最后一项任务是将计数器加 1。

//...
  quotes[counter].classList.add('fadeIn');
  counter++;
}

let counter = 0;
const quotes = [...document.querySelectorAll('cite')];

document.onclick = reveal;

function reveal(e) {
  if (counter >= quotes.length) {
    return
  }
  quotes[counter].classList.add('fadeIn');
  counter++;
}
html {
  font: 2ch/1.25 'Segoe UI'
}

cite {
  display: block;
  width: 60%;
  max-width: 540px;
  margin: 20px auto 30px;
  text-indent: -1.5ch;
  opacity: 0;
}

.fadeIn {
  animation: fadeIn 1.5s ease-out forwards;
}

@keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

q,
b {
  display: block;
}

q::before {
  content: '[=15=]275d';
  font-size: 1.25rem;
  margin-right: 0.5ch;
  color: #aaa;
}

q::after {
  content: '[=15=]275e';
  font-size: 1.25rem;
  color: #aaa;
}

b {
  text-align: right;
}
<header>
  <h1>Click Anywhere!</h1>
</header>
<main>
  <cite><q>Whenever you find yourself on the side of the majority, it is time to pause and reflect.</q>
  <b>Mark Twain</b></cite>

  <cite><q>Insanity: doing the same thing over and over again and expecting different results.</q>
  <b>Albert Einstein</b></cite>

  <cite><q>The journey of a thousand miles begins with one step.</q> 
  <b>Lao Tzu</b></cite>

  <cite><q>That which does not kill us makes us stronger.</q> 
  <b>Friedrich Nietzsche</b></cite>
</main>