连续随机分配每个div的颜色

时间:2020-10-23 16:59:43

标签: javascript html css flexbox grid

我正在尝试复制此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>

我对此一无所知。任何见识将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:1)

您需要将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)";
  }
}

您需要谨慎使用时间间隔,并确保自己清理干净,否则可能会导致浏览器崩溃。另外,您并没有真正问过一个问题,所以不清楚您到底要更改什么。

答案 1 :(得分:0)

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+")";
}

答案 2 :(得分:0)

在for循环中添加document.querySelectorAll('.grid-container > div'),以便仅grid-container内的div会改变颜色。