使用canvas
标签,您可以确定给定点下像素的颜色值。您可以使用事件数据来确定坐标,然后检查透明度。剩下的就是将图像加载到画布中。
首先,我们会处理:
var ctx = document.getElementById('canvas').getContext('2d');
var img = new Image();
img.onload = function(){
ctx.drawImage(img,0,0);
};
img.src = [YOUR_URL_HERE];
第一个位抓取画布元素,然后创建一个Image
对象。当图像加载时,它被绘制在画布上。很简单!除了...如果图像与代码不在同一个域中,那么您将面临同域策略安全性。为了获取我们图像的数据,我们需要将图像托管在本地。您还可以对图像进行 base64 编码,这超出了此答案的范围。(有关执行此操作的工具,请参阅此 url )。
接下来,将单击事件附加到画布上。当该点击进入时,我们将检查透明度并仅对不透明的点击区域执行操作:
if (isTransparentUnderMouse(this, e))
return;
// do whatever you need to do
alert('will do something!');
魔术发生在函数isTransparentUnderMouse
中,它需要两个参数:目标画布元素(this
在点击处理程序的范围内)和事件数据(例如,在本例中)。现在我们来看看肉:
var isTransparentUnderMouse = function (target, evnt) {
var l = 0, t = 0;
if (target.offsetParent) {
var ele = target;
do {
l += ele.offsetLeft;
t += ele.offsetTop;
} while (ele = ele.offsetParent);
}
var x = evnt.page.x - l;
var y = evnt.page.y - t;
var imgdata = target.getContext('2d').getImageData(x, y, 1, 1).data;
if (
imgdata[0] == 0 &&
imgdata[1] == 0 &&
imgdata[2] == 0 &&
imgdata[3] == 0
){
return true;
}
return false;
};
首先,我们做一些跳舞来获得相关元素的精确位置。我们将使用该信息传递给 canvas 元素。getImageData
除其他外,这将为我们提供一个data
包含我们指定位置的 RGBA 的对象。
如果所有这些值都是 0,那么我们正在查看透明度。如果不是,则存在一些颜色。-edit- 如评论中所述,我们真正需要查看的唯一值是上imgdata[3]
例中的最后一个值。值是 r(0)g(1)b(2)a(3),透明度由 a, alpha 决定。您可以使用相同的方法来查找您知道 rgba 数据的任何不透明度的任何颜色。
在这里试试:http: //jsfiddle.net/pJ3MD/1/
(注意:在我的示例中,由于我提到的域安全性,我使用了 base64 编码的图像。您可以忽略该部分代码,除非您也打算使用 base64 编码)
同样的例子,为了好玩而对鼠标光标进行了更改:http: //jsfiddle.net/pJ3MD/2/
文档