我正在尝试复制此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>
我对此一无所知。任何见识将不胜感激。谢谢!
答案 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会改变颜色。