【发布时间】:2015-08-03 04:02:25
【问题描述】:
我正在尝试自学 javascript,但显然我并没有完全理解。
我想要的是一个框,当您单击它时,背景颜色会从黑色平滑地变为某种颜色。为此,我创建了一个函数,它接受一个 HSV 值并以 #rrggbb 格式输出一个字符串。因此,要淡入,我只需使用 for 循环以 1 为增量将 V 值从 0 移动到 100。
我有一个框,当您单击它时,它会暂停并更改为我正在使用的背景颜色。我还在记录输出,并在最后使用 RGB 十六进制值计算和更新一次。
因此,很明显,我不了解在中间步骤刷新 DOM 所需的任何知识。我为此得到的所有搜索都提出了使用 jQuery 或类似方法的解决方案。这很好,我打算通过 jQuery 等来工作,但首先,我想让一些类似的东西工作,这样我就可以更彻底地了解引擎盖下发生的事情。
代码在这里:http://codepen.io/anon/pen/QbzQJG
代码:
HTML:
<title>Color test</title>
<body>
<div id="colorbox" onclick="javascript:fadeIn()"></div>
<div id="console"></div>
</body>
CSS:
body {
background: #000;
color: #999;
}
#colorbox {
background: #000;
border: 1px solid #333;
width: 250px;
height: 250px;
margin: 0 auto;
}
Javascript:
var c = function() {
return ({
log: function(msg) {
consoleDiv = document.getElementById('console');
para = document.createElement('p');
text = document.createTextNode(msg);
para.appendChild(text);
consoleDiv.appendChild(para);
}
});
}();
function toRGB(H, S, V) {
S /= 100;
V /= 100;
var C = V * S;
H /= 60;
var X = C * (1 - Math.abs((H % 2) - 1));
var R = 0;
var G = 0;
var B = 0;
if (0 <= H && H < 1) {
R = C;
G = X;
B = 0;
} else if (1 <= H && H < 2) {
R = X;
G = C;
B = 0;
} else if (2 <= H && H < 3) {
R = 0;
G = C;
B = X;
} else if (3 <= H && H < 4) {
R = 0;
G = X;
B = C;
} else if (4 <= H && H < 5) {
R = X;
G = 0;
B = C;
} else if (5 <= H && H < 6) {
R = C;
G = 0;
B = X;
} else {
R = 0;
G = 0;
B = 0;
}
var m = V - C;
R = Math.round(255 * (R + m)).toString(16);
R.length < 2 ? R = "0" + R : R = "" + R;
G = Math.round(255 * (G + m)).toString(16);
G.length < 2 ? G = "0" + G : G = "" + G;
B = Math.round(255 * (B + m)).toString(16);
B.length < 2 ? B = "0" + B : B = "" + B;
var RGB = "#" + R + G + B;
return RGB;
}
function pause(milliseconds) {
var dt = new Date();
while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}
function fadeIn() {
var colorbox = document.querySelector("#colorbox");
for (var i = 0; i <= 100; i++) {
colorbox.style.backgroundColor = toRGB(150, 80, i);
c.log(toRGB(150, 80, i));
pause(10);
}
}
有什么想法吗?
【问题讨论】:
-
为什么要发明新的轮子。 Jquery UI 库中有一个完美的功能为你做这个jqueryui.com/animate
-
@mimo - 这不是一个好建议。有很多理由不使用 jQuery,实际上使用 vanilla js 越来越普遍
-
@mimo 感谢 jquery 链接。我只是想重新发明轮子,这样我才能了解它是如何工作的。我不一定打算使用它来实现除示例之外的任何内容。我希望我在顶部的文章能防止这种不回答。我想我应该把这个免责声明放在未来更普遍的位置
标签: javascript html css