我正在努力理解javascript,我受Jay Weekes的这段代码的启发:view-source:http://jayweeks.com/sketchy-structures-html5-canvas/#/< |:{
我试图找出如何让用户选择strokeStyle颜色。 我不太清楚如何解决这个问题。我试过了,不透明度停止了工作,颜色变黑了......
我使用了一个带有id和功能的按钮。不工作。我决定前来寻求帮助。
我不知道我是否表达得非常好。如果我不是,请告诉我。
非常感谢提前! :)
答案 0 :(得分:1)
对于这个问题,我有一个可能的解决方案。结果是here at this jsFiddle。
我的想法是首先添加一个简单的UI元素来选择颜色。我能想到的最简单的事情是一系列链接。
<div id="sketch-color">
<ul class="colorList">
<li><a href="#" data-color="black">Black</a></li>
<li><a href="#" data-color="red">Red</a></li>
<li><a href="#" data-color="green">Green</a></li>
<li><a href="#" data-color="blue">Blue</a></li>
</ul>
</div>
你会注意到我开始考虑使用HTML5数据,但没有像我应该那样遵循。我编辑了CSS文件,使链接更加明显:
#sketch-color li:first-of-type a { color:black; }
...
然后,为了遵循原始逻辑,我在基本UI读数中添加了一行:
<li>pen color: <span id="current-color"></span></li>
从那时起,它只是javascript。我在“当前”元素列表中添加了另一个变量,并将其默认设置为“黑色”:
var currOpacity = document.getElementById( 'current-opacity' ),
currDensity = document.getElementById( 'current-density' ),
currCache = document.getElementById( 'current-cache' ),
currColor = document.getElementById( 'current-color' );
currCache.innerHTML = '0';
currColor.innerHTML = "Black";
然后我需要抓住所有新链接,关闭他们的默认点击事件处理程序,然后添加我自己的。我习惯了jQuery,所以我可能没有以最有效的方式做到这一点。
// Color Events
var colorListItems = document.getElementById( 'sketch-color' ).getElementsByTagName('ul')[0].children;
var colorLinks = [];
for(var i = 0; i < colorListItems.length; i++)
{
colorLinks.push(colorListItems[i].children[0]);
}
for(var i = 0; i < colorLinks.length; i++)
{
colorLinks[i].removeEventListener("click");
colorLinks[i].addEventListener("click", onClickColorChange, false);
}
然后我定义了事件处理程序:
//event handlers
function onClickColorChange( e ) {
e.preventDefault();
currColor.innerHTML = e.target.innerHTML;
return false;
}
好的,那太好了。我可以在span
中更改文字。不是很有趣。我需要入侵周杰伦的绘图代码才能做到这一点。我注意到在调用Point.connect()
函数之前不会发生设置颜色的决定,因此我更改了该函数中的关键线以调用新函数来设置线条样式:
if( totDist < maxDist*5 && drawDist < maxDist ){
ctx.strokeStyle = currentStrokeStyle();
ctx.line( this.x, this.y, p.x, p.y );
} else { break; }
然后定义了这个新功能:
function currentStrokeStyle() {
var curr_color = currColor.innerHTML;
var red = 0, green = 0, blue = 0;
switch(curr_color) {
case "Red": red = 255; break;
case "Green": green = 255; break;
case "Blue": blue = 255; break;
};
return 'rgba( ' + red + ',' + green + ',' + blue + ','+ uiOpacity.opacity +' )';
}
然后神奇的事发生了。
我意识到这里有很大的改进空间。应该有一个rgb滑块或类似的东西,我应该使用HTML5数据属性而不是键入innerHTML
。那就是说,我正在提交我开始工作的第一个版本。我邀请你分叉the jsfiddle并使其更好。
我很抱歉没有说明如何使用这种安排添加新颜色。基本上,我们需要在UI中添加新的颜色列表链接,然后在currentStrokeStyle()函数中将新的情况添加到switch语句中。因此,要添加橙色选项:
<div id="sketch-color">
<ul class="colorList">
<li><a href="#" data-color="black">Black</a></li>
<li><a href="#" data-color="red">Red</a></li>
<li><a href="#" data-color="green">Green</a></li>
<li><a href="#" data-color="blue">Blue</a></li>
<li><a href="#" data-color="orange">Orange</a></li>
</ul>
</div>
和
function currentStrokeStyle() {
var curr_color = currColor.innerHTML;
var red = 0, green = 0, blue = 0;
switch(curr_color) {
case "Red": red = 255; break;
case "Green": green = 255; break;
case "Blue": blue = 255; break;
case "Orange": red = 255; green = 128; break;
};
return 'rgba( ' + red + ',' + green + ',' + blue + ','+ uiOpacity.opacity +' )';
}
如果您希望链接显示为橙色,则需要再次更改CSS:
#sketch-color li:nth-child(4) a { color:blue; }
#sketch-color li:nth-child(5) a { color:orange; }
这应该适用于现在。同样,如果我使用HTML5数据属性将rgb值直接传递给currentStrokeStyle()
,这将更容易更改,但我很懒,而且已经很晚了。
新颜色已添加to the jsFiddle。