Javascript 连续随机化每个div的颜色

Javascript 连续随机化每个div的颜色,javascript,html,css,flexbox,grid,Javascript,Html,Css,Flexbox,Grid,我正在尝试复制此gif中显示的内容: 单击左上角的按钮后,我必须每秒使用setInterval()和queryselectoral()对网格容器中每个div的颜色进行随机排列,并显示当前时间,如GIF所示。我知道颜色是随机选择的,实际上使用CSS rgba()函数。以下是我的html文件中的内容: <!DOCTYPE html> <html> <head> <style> .item1 { grid-area: header; } .item2

我正在尝试复制此gif中显示的内容:

单击左上角的按钮后,我必须每秒使用
setInterval()
queryselectoral()
对网格容器中每个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>

.item1{网格区域:头;}
.item2{网格区域:菜单;}
.item3{网格区域:主;}
.item4{网格区域:右;}
.item5{网格区域:页脚;}
.网格容器{
显示:网格;
网格模板区域:
“标题”
'菜单主右'
'菜单页脚';
栅隙:10px;
背景色:#2196F3;
填充:10px;
}
.grid容器>div{
背景色:rgba(255、255、255、0.8);
文本对齐:居中;
填充:20px0;
字体大小:30px;
}
.柔性容器{
显示器:flex;
背景色:淡蓝色;
}
.flex容器>div{
背景色:#f1f1;
利润率:10px;
填充:20px;
字体大小:30px;
}
var r=Math.round(Math.random()*255);
var g=Math.round(Math.random()*255);
var b=Math.round(Math.random()*255);
函数changeColor(){
for(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;
}
网格布局
此网格布局包含六列三行:

走! 时间

标题 菜单 主要 赖特 页脚

我对那件事感到迷惘。如有任何见解,将不胜感激。谢谢

document.querySelectorAll('div')
实际上返回一个元素列表。为了更改样式,您需要遍历元素。这里有一种方法可以做到这一点:

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才会更改颜色。

您需要将setInterval()函数从changeColor()函数中去掉。每次后续的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)";
  }
}

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

您能提供您的javascript代码吗?完成。我编辑了我的帖子。我编辑了,这个函数可以工作,但是所有的div,包括网格容器本身,都会改变颜色。如何指定网格容器中只有div更改颜色的位置?您可以执行类似于
document.queryselectoral('div')
的操作,而不是说
document.queryselectoral('.grid container>div')
,这样选择器只选择网格容器中的div。这意味着我们将选择所有div,其中.grid容器是父级。