连续随机化每个 div 的颜色

Randomize color of each div continuously

我正在尝试复制此 gif 中看到的内容: Grid Layout

单击左上角的按钮后,我必须每秒使用 setInterval()querySelectorAll() 随机化网格容器内每个 div 的颜色,并显示GIF 中显示的当前时间。我知道颜色是随机选择的,实际上使用了 CSS rgba() 函数。这是我的 html 文件中的内容:

<!DOCTYPE html>
<html>
<head>
<style>
.item1 { grid-area: header; }
.item2 { grid-area: menu; }
.item3 { grid-area: main; }
.item4 { grid-area: right; }
.item5 { grid-area: footer; }

.grid-container {
  display: grid;
  grid-template-areas:
    'header header header header header header'
    'menu main main main right right'
    'menu footer footer footer footer footer';
  grid-gap: 10px;
  background-color: #2196F3;
  padding: 10px;
}

.grid-container > div {
  background-color: rgba(255, 255, 255, 0.8);
  text-align: center;
  padding: 20px 0;
  font-size: 30px;
}

.flex-container {
  display: flex;
  background-color: DodgerBlue;
}

.flex-container > div {
  background-color: #f1f1f1;
  margin: 10px;
  padding: 20px;
  font-size: 30px;
}

</style>

<script>
var r = Math.round(Math.random()*255);
var g = Math.round(Math.random()*255);
var b = Math.round(Math.random()*255);

function changeColor(){
  for (const elem of document.querySelectorAll('div')) {
    r = Math.round(Math.random()*255);
    g = Math.round(Math.random()*255);
    b = Math.round(Math.random()*255);
    elem.style.backgroundColor =  "rgb("+r+","+g+","+b+", 0.8)";
  }

  var myTimer = setInterval(changeColor, 1000);
  var running = true;
}
</script>

</head>
<body>

<h1>Grid Layout</h1>

<p>This grid layout contains six columns and three rows:</p>

<div class="flex-container">
    <button onclick="changeColor()">GO!</button>
    <p id="timeinfo">TIME</p>
</div>

<div class="grid-container">
  <div class="item1">Header</div>
  <div class="item2">Menu</div>
  <div class="item3">Main</div>  
  <div class="item4">Right</div>
  <div class="item5">Footer</div>
</div>

</body>
</html>

我对此一头雾水。任何见解将不胜感激。谢谢!

document.querySelectorAll('div') 实际上是 returns 一个元素列表。为了更改样式,您需要遍历元素。这是您可以执行此操作的一种方法:

for (const elem of document.querySelectorAll('.grid-container > div')) {
    r = Math.round(Math.random()*255);
    g = Math.round(Math.random()*255);
    b = Math.round(Math.random()*255);
    elem.style.backgroundColor = "rgb("+r+","+g+","+b+")";
}

在for循环中加入document.querySelectorAll('.grid-container > div'),这样只有grid-container里面的div才会变色

您需要从 changeColor() 函数中取出 setInterval() 函数。您正在为每个后续的 changeColor() 递归调用创建一个新的间隔,这就是导致速度加快直到我们变得癫痫的原因。加上其他人提到的更具体的选择器 ('.grid-container > div')。这可能以反应式风格更好地完成,而不是每秒循环遍历一组元素,但如果你刚刚进入 html/js/css 这是一个非常好的小测试。我可能会做更多这样的事情:

var r = Math.round(Math.random()*255);
var g = Math.round(Math.random()*255);
var b = Math.round(Math.random()*255);
var myTimer;

function startSwitching() {
  myTimer = setInterval(changeColor, 1000);
}

function stopSwitching() {
  clearInterval(myTimer);
}

function changeColor(){
  for (const elem of document.querySelectorAll('.grid-container > div')) {
    r = Math.round(Math.random()*255);
    g = Math.round(Math.random()*255);
    b = Math.round(Math.random()*255);
    elem.style.backgroundColor =  "rgb("+r+","+g+","+b+", 0.8)";
  }
}

您需要小心使用间隔并确保自己清理干净,否则可能会使浏览器崩溃。此外,您并没有真正提出问题,因此不清楚您到底想更改什么。