- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个 RGB 颜色猜谜游戏。前提是每当有人点击一个 div 时,该函数应该检索它的颜色值并将其与给定数量的颜色值中的随机颜色值(预选)相匹配。
现在,游戏有两个难度级别。容易和困难。两个关卡的代码几乎一样,easy的颜色div个数是3,hard的颜色div个数是6。
但是,在简单模式下,该函数正在检索不属于三个 div 中任何一个的颜色值。其实就是返回背景色值。
这是代码
var colors = randomColors(6);
var easyColor = [];
var squares = document.querySelectorAll(".square");
function color() {
var a = Math.floor(Math.random()*250);
var b = Math.floor(Math.random()*250);
var c = Math.floor(Math.random()*250);
return "rgb("+ [(a),(b),(c)].join(', ') + ")";
}
function randomColors(num) {
var arr = [];
for(var i =0; i < num; i++) {
arr.push(color());
}
return arr;
}
// Tried to generate different set of colors for easy mode. Still working on it.
for(var x = 0; x < 3; x++) {
easyColor[x] = color();
}
var easyRandomColor = easyColor[Math.floor(Math.random()*easyColor.length)];
// selecting hard difficulty works same as playing again, hence the reload()
document.getElementById("hard").addEventListener("click", function() {
window.location.reload();
});
document.getElementById("reset").addEventListener("click", function() {
window.location.reload();
});
var squareColor;
// setting up the easy level of the game
document.getElementById("easy").addEventListener("click", function() {
document.getElementById("header").style.background = "#232323";
for(var y = 0; y < 3; y++) {
squares[y].style.background = easyColor[y];
}
for(var z = 3; z < 6; z++) {
squares[z].style.background = "#232323";
}
easyRandomColor = easyColor[Math.floor(Math.random()*easyColor.length)];
document.getElementById("guess").textContent = easyRandomColor;
// setting up the background colors of easy level squares
for(var j = 0; j < easyColor.length; j++)
squares[j].addEventListener("click", function() {
squareColor = this.style.background;
console.log(squareColor, easyRandomColor);
if(squareColor === easyRandomColor) {
document.getElementById("header").style.background = name;
document.getElementById("display").textContent = "Correct!";
document.getElementById("reset").textContent = "Play again?";
for(var k = 0; k < easyColor.length; k++) {
squares[k].style.background = name;
}
} else{
this.style.background = "#232323";
document.getElementById("display").textContent = "Try again.";
}
});
document.getElementById("easy").classList.add("selected");
document.getElementById("hard").classList.remove("selected");
});
var randomColor = colors[Math.floor(Math.random()*colors.length)];
//changing the RGB in h1 to rgb of one the squares
document.getElementById("guess").textContent = randomColor;
//assigning colors to the squares and adding the click event
for(var j = 0; j < squares.length; j++) {
squares[j].style.background = colors[j];
squares[j].addEventListener("click", function() {
var name = this.style.background;
// console.log(name, randomColor);
if(name === randomColor) {
document.getElementById("header").style.background = name;
document.getElementById("display").textContent = "Correct!";
document.getElementById("reset").textContent = "Play again?";
for(var k = 0; k < squares.length; k++) {
squares[k].style.background = name;
}
} else{
this.style.background = "#232323";
document.getElementById("display").textContent = "Try again.";
}
});
}
body {
background-color: #232323;
margin: 0;
}
html {
margin: 0;
padding: 0;
}
.square {
width: 30%;
/*background: purple;*/
padding-bottom: 30%;
float: left;
margin: 1.66%;
transition: 0.2s ease-in;
border-radius: 6%;
}
#container {
margin: 0 auto;
max-width: 600px;
}
h1, h3 {
color: white;
padding-top: 1%;
padding-bottom: 0.5%;
margin-top: 0;
margin-bottom: 0;
text-align: center;
}
#header {
transition: 0.2s ease-in;
}
#nav {
margin-top: 0;
padding-top: 0;
background: white;
max-width: 100%;
clear: left;
}
#nav p {
margin: 0 auto;
position: relative;
max-width: 580px;
}
#reset {
position: relative;
}
#hard {
position: absolute;
right: 0;
}
#easy {
position: absolute;
right: 50px;
}
#display {
position: relative;
left: 27%;
}
<!DOCTYPE html>
<html>
<head>
<title>RGBA Guess</title>
<link rel="stylesheet" type="text/css" href="colorgame.css">
</head>
<body>
<div id="header">
<h3>
The Great
</h3>
<h1>
<span id="guess">number</span>
</h1>
<h3>
Guessing Game
</h3>
</div>
<div id="nav">
<p>
<button id="reset">New Colors</button>
<span id="display"></span>
<button id="easy">Easy</button>
<button id="hard" class="selected">Hard</button>
</p>
</div>
<div id="container">
<div class="square" id="sqaure1"></div>
<div class="square" id="sqaure2"></div>
<div class="square" id="sqaure3"></div>
<div class="square" id="sqaure4"></div>
<div class="square" id="sqaure5"></div>
<div class="square" id="sqaure6"></div>
</div>
<script type="text/javascript" src="colorgame.js"></script>
</body>
</html>
我知道,有更好的方法来做到这一点。我可以改为在简单模式下调用 randomColors(3),但我想知道我做错了什么,以便将来避免它。
比你强
最佳答案
函数在简单模式下检索错误颜色的原因是因为您没有从元素中删除困难模式下的点击事件监听器。
To explain the weird behaviour you are seeing where the colour being logged is rgb(35, 35, 35). What is happening is the original click event still attached is running first, and going to the statement's else condition and setting it to that colour. Ie. when you make a block disappear. To understand this just run through in your head what would happen if both those click events executed one after another. First hard than easy.
您要做的是附加一次点击事件,并在全局范围内使用已声明的函数。您可以将其用于轻松点击和硬点击。您想要声明它的原因是您可以使用 removeEventListener 从隐藏的方 block 中移除它。
因此,以后只要记得在更改状态时清理您的点击事件即可。这就是这里要吸取的教训。
JSFiddle 修复了你的错误: https://jsfiddle.net/jx6y0gt1/5/
这是一个固定的代码片段:
var colors = randomColors(6);
var easyColor = [];
var squares = document.querySelectorAll(".square");
function color() {
var a = Math.floor(Math.random() * 250);
var b = Math.floor(Math.random() * 250);
var c = Math.floor(Math.random() * 250);
return "rgb(" + [(a), (b), (c)].join(', ') + ")";
}
function randomColors(num) {
var arr = [];
for (var i = 0; i < num; i++) {
arr.push(color());
}
return arr;
}
// Tried to generate different set of colors for easy mode. Still working on it.
for (var x = 0; x < 3; x++) {
easyColor[x] = color();
}
var easyRandomColor = easyColor[Math.floor(Math.random() * easyColor.length)];
// selecting hard difficulty works same as playing again, hence the reload()
document.getElementById("hard").addEventListener("click", function() {
window.location.reload();
});
document.getElementById("reset").addEventListener("click", function() {
window.location.reload();
});
var squareColor;
// setting up the easy level of the game
document.getElementById("easy").addEventListener("click", function() {
document.getElementById("header").style.background = "#232323";
for (var y = 0; y < 3; y++) {
squares[y].style.background = easyColor[y];
}
for (var z = 3; z < 6; z++) {
squares[z].style.background = "#232323";
squares[z].removeEventListener("click", squareClicked);
}
randomColor = easyColor[Math.floor(Math.random() * easyColor.length)];
document.getElementById("guess").textContent = easyRandomColor;
document.getElementById("easy").classList.add("selected");
document.getElementById("hard").classList.remove("selected");
});
var randomColor = colors[Math.floor(Math.random() * colors.length)];
//changing the RGB in h1 to rgb of one the squares
document.getElementById("guess").textContent = randomColor;
//assigning colors to the squares and adding the click event
for (var j = 0; j < squares.length; j++) {
squares[j].style.background = colors[j];
squares[j].addEventListener("click", squareClicked);
}
function squareClicked() {
var name = this.style.background;
// console.log(name, randomColor);
if (name === randomColor) {
document.getElementById("header").style.background = name;
document.getElementById("display").textContent = "Correct!";
document.getElementById("reset").textContent = "Play again?";
for (var k = 0; k < squares.length; k++) {
squares[k].style.background = name;
}
} else {
this.style.background = "#232323";
document.getElementById("display").textContent = "Try again.";
}
}
body {
background-color: #232323;
margin: 0;
}
html {
margin: 0;
padding: 0;
}
.square {
width: 30%;
/*background: purple;*/
padding-bottom: 30%;
float: left;
margin: 1.66%;
transition: 0.2s ease-in;
border-radius: 6%;
}
#container {
margin: 0 auto;
max-width: 600px;
}
h1,
h3 {
color: white;
padding-top: 1%;
padding-bottom: 0.5%;
margin-top: 0;
margin-bottom: 0;
text-align: center;
}
#header {
transition: 0.2s ease-in;
}
#nav {
margin-top: 0;
padding-top: 0;
background: white;
max-width: 100%;
clear: left;
}
#nav p {
margin: 0 auto;
position: relative;
max-width: 580px;
}
#reset {
position: relative;
}
#hard {
position: absolute;
right: 0;
}
#easy {
position: absolute;
right: 50px;
}
#display {
position: relative;
left: 27%;
}
<body>
<div id="header">
<h3>
The Great
</h3>
<h1>
<span id="guess">number</span>
</h1>
<h3>
Guessing Game
</h3>
</div>
<div id="nav">
<p>
<button id="reset">New Colors</button>
<span id="display"></span>
<button id="easy">Easy</button>
<button id="hard" class="selected">Hard</button>
</p>
</div>
<div id="container">
<div class="square" id="sqaure1"></div>
<div class="square" id="sqaure2"></div>
<div class="square" id="sqaure3"></div>
<div class="square" id="sqaure4"></div>
<div class="square" id="sqaure5"></div>
<div class="square" id="sqaure6"></div>
</div>
</body>
我所做的改变
将此添加到代码的底部:
function squareClicked() {
var name = this.style.background;
// console.log(name, randomColor);
if(name === randomColor) {
document.getElementById("header").style.background = name;
document.getElementById("display").textContent = "Correct!";
document.getElementById("reset").textContent = "Play again?";
for(var k = 0; k < squares.length; k++) {
squares[k].style.background = name;
}
} else{
this.style.background = "#232323";
document.getElementById("display").textContent = "Try again.";
}
}
像这样将它用作您的元素的监听器:
for(var j = 0; j < squares.length; j++) {
squares[j].style.background = colors[j];
squares[j].addEventListener("click", squareClicked);
}
在切换到简单模式时,从简单颜色设置 randomColor 的值,并删除循环以重新附加点击事件,它们已经存在。
randomColor = easyColor[Math.floor(Math.random()*easyColor.length)];
还有一个次要错误,当您切换到简单模式时您仍然可以单击隐藏的方 block 。在简单模式下停用这些方 block ,使它们无法被点击:
for(var j = 3; j < squares.length; j++) {
squares[j].removeEventListener("click", squareClicked);
}
关于javascript - this.style.background 返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40145387/
我是 os 2 的新手,所以真的不知道从哪里开始。是否可以编写一个 WatchOs 2 应用程序,它将在后台运行并每小时唤醒一次?网上没有那么多可用的信息,但到目前为止我所看到的表明不可能编写后台应用
如何将 url 背景图像添加到渐变中并具体定位?因为梯度本身被当作图像 CSS background: linear-gradient(to bottom, #98cb01 2%,#60a822 10
我是 android 开发的新手,正在开发我的第一个 android 应用程序。我在布局的 xml 中设置了 View 的背景颜色,如下所示。 android:background="@+color/
为了尽可能简洁地使用样式,如果使用双像素密度设备(例如 iPhone 4)查看我的页面,我宁愿不使用包含的媒体查询样式表。 话虽如此,如果我只是做这样的事情就可以了吗? .icon-1 { bac
我有一个由 62 张 91 * 91 像素的图像组成的 Sprite ,这使得整个图像为 91 * 5642 像素。它们以动态网格的形式显示,该网格会根据用户/指针的移动而增长和缩小。有时,一个元素(
我一直在尝试制作一款使用 Xbox One Kinect (V2) 的 Unity 游戏。 我遵循了本教程中的说明: http://www.imaginativeuniversal.com/blog/
看来firefox会自动组合一些东西,例如它需要单独的css值,例如“border-color”,“border-width”并将它们全部转储到“border”中..这使jquery变得很痛苦因为 .
我正在构建我的第一个 Chrome 扩展程序。我浏览了 Chrome 开发人员文档,但我无法理解几个主题。 我的理解: 有两个 Action : 浏览器操作(地址栏外的按钮) 页面操作(地址栏内的按钮
我的后台监听器是 chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) 在chrome.conte
哪个更有效: 我正在尝试找出哪种提供半透明背景的方法更有效/更快: background-color: rgba(255, 255, 255, .12); 或者 background-image: u
我想要一个有 tr 作为黑色背景的表格,里面有一个白色背景的表格。
我在我的主页上放了一个背景。它可以在除 android chrome 之外的所有浏览器上正确显示。这是我的 CSS: body.path-frontpage { background-imag
我正在尝试对我的背景图像应用滤镜,但是我遇到了 CSS 属性 URL 和线性渐变的问题。我想要的背景图片 .bg-image-full { background: no-repeat center
在样式部分的 chrome 中使用谷歌开发者控制台时,它会立即为我提供“在我键入时”的背景颜色属性。几个月前,它一直在提供我更喜欢的一般属性(property)“背景”。 是否有机会自定义这些提示,或
我正在尝试实现 faux column网站上的布局。简而言之,它涉及在包含两个垂直列的 div 上平铺背景图像,使其看起来像两个列一直延伸到底部。 我的专栏如下所示: XXXX MMMM XXXX
这是一个 example .我想裁剪背景图像,然后将裁剪图像用作更大(尺寸)元素的背景。我的意思是 div 比它的背景大,我不需要重复。现在,当 background-repeat 取消注释时,元素消
CSS3 声明 background-clip 和 background-origin 似乎对背景有相同的效果。它们似乎都将背景限制在相对于 HTML 元素的某个区域,所以我想知道这两个声明在功能上是
我正在为图片库制作缩略图页面。缩略图预览作为 完成 float 具有固定的方形尺寸。 然而,缩略图本身不一定是正方形或相同大小,它们具有它们所代表的大图像的属性。 为了让它看起来不错,我想在正方形中
这个问题在这里已经有了答案: Get a CSS value with JavaScript (8 个答案) 关闭 6 年前。
你好, 就像我在标题中所说的 background-image:none; 不起作用,因为使用 css3 background-image:url('...'); 返回一个新层每次文件都是新的。我正在
我是一名优秀的程序员,十分优秀!