如何在鼠标经过的情况下使网格中的立方体变成黑色?任何帮助将不胜感激。
function Grid(z) {
for (y=0; y < z; y++) {
for (x=0; x < z; x++) {
size = 700 / z;
var div = document.querySelector('#container');
var block = document.createElement('div');
block.style.height = size + 'px';
block.style.width = size + 'px';
block.classList.add('cube');
div.appendChild(block);
}
}
}
function changeBlockColor() {
Grid(16);
var s = document.querySelector('.cube');
s.addEventListener('onmouseover', function(){
s.setAttribute('style', 'background: black');
});
}
changeBlockColor();
答案 0 :(得分:2)
我将使用CSS来实现此效果。
.cube {
background-color:red;
}
.cube:hover {
background-color: black;
}
答案 1 :(得分:1)
以下内容适用于是否要在完成将鼠标悬停(然后悬停)之后将它们保持黑色。
首先,您的s = document.querySelector('.cube');
将使s
仅指向类cube
的第一个元素。要解决此问题,请改为使用s
,使cube
成为类s = document.querySelectorAll('.cube');
的所有元素的数组。
接下来,您需要遍历数组s,并将事件侦听器添加到其所有元素:
for(var i = 0; i < s.length; i++) {
s[i].addEventListener('mouseover', function(){
this.setAttribute('style', 'background: black');
});
}
请注意在处理程序中使用this
。在处理程序代码中,this
是指触发事件的对象(在您的情况下,鼠标悬停在多维数据集上)。
答案 2 :(得分:1)
您想要的事件名称是mouseover
,而不是onmouseover
此外,querySelector
只会找到第一个匹配元素,因此您需要改用querySelectorAll
或getElementsByClassName
最后,您需要遍历所有匹配的元素,这些元素以Object
而不是Array
返回,因此您需要使用for
循环。
function createGrid(z) {
for (var y = 0; y < z; ++y) {
for (var x = 0; x < z; ++x) {
var size = 700 / z;
var div = document.getElementById('container');
var block = document.createElement('div');
block.style.height = size + 'px';
block.style.width = size + 'px';
block.classList.add('cube');
div.appendChild(block);
}
}
changeBlockColor()
}
function changeBlockColor(){
var cubes = document.querySelectorAll('.cube')
for (var i = 0; i < cubes.length; i++) {
cubes[i].addEventListener("mouseover", function(e) {
e.target.classList.add('active')
})
}
}
createGrid(16);
#container {
display: flex;
flex-wrap: wrap;
}
.cube {
background-color: red;
}
.active {
background-color: black;
}
<div id="container"></div>
class
,因此我将您的函数重命名为createGrid
createGrid
的结尾,我打电话给changeBlockColor
,而不是从createGrid
内部打电话给changeBlockColor
,从逻辑上讲这更有意义。active
的CSS类来处理颜色更改,因为使用setAttribute('style')
擦除了{{1}中应用的height
和width
样式}功能。Grid
,还应该了解querySelector
。getElementById
,但不要声明var
,y
或x
size
和y
在x
循环中定义for
和for(var y=0
假设您希望颜色在for(var x=0
上还原,则可以使用mouseout
的CSS达到相同的效果
.cube:hover
.cube {
display: inline-block;
width: 50px;
height: 50px;
background-color: red;
}
.cube:hover {
background-color: black;
}
关于使用<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
<div class="cube"></div>
和querySelector('#container')
的旁注。前者必须遍历整个DOM以寻找选择器,后者只需进入内部ID列表并返回引用即可。
https://developer.mozilla.org/en-US/docs/Web/Events/mouseover
https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll
https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName
https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById
答案 3 :(得分:1)
不需要数百个鼠标悬停事件监听器。一个就够了
var
divContainer = document.getElementById('container'),
CubeClass = 'cube';
function Grid(z)
{
var sizePx = Math.floor(700 / z) + 'px';
for (let y = 0; y < z; y++)
{
for (let x = 0; x < z; x++)
{
let block = document.createElement('div');
block.style.height = sizePx;
block.style.width = sizePx;
block.className = CubeClass;
divContainer.appendChild(block);
};
};
}
divContainer.onmouseover = function(e)
{
if (!e.target.classList.contains( CubeClass )) return;
e.target.setAttribute('style', 'background: black');
}
divContainer.onmouseout = function(e) // if you need it...
{
if (!e.target.classList.contains( CubeClass )) return;
e.target.removeAttribute('style');
}