在一个图像上定义多个单击区域

时间:2013-10-02 14:30:18

标签: javascript jquery html5 canvas

我正试图找出最佳方法。

基本上我有一张图片是美国的地图,我希望能够为每个州定义点击区域。 (所以他们必须是奇怪的形状)

我已经做过一些关于在html5 canvas和javascript中定义命中区域的研究。虽然我没有在创造奇形状区域方面找到太多东西。

这是最好的方法吗?你们还有其他建议吗?

我也希望能够在鼠标悬停在其上时突出显示单个区域,并根据点击顺序更改颜色,以便定义的区域必须相当准确。

最好将每个州分成不同的图像,然后在主容器内使用绝对定位吗?

3 个答案:

答案 0 :(得分:5)

你可以像这样使用<map>

<img src="yourImage.gif" width="99" height="99" alt="YourImage" usemap="#YourMap">
//The usemap attribute must match the name attribute of your map.
<map name="YourMap">
    <area shape="rect" coords="0,0,82,126" href="path1.htm" alt="Path1">
    //Coords are x, y of the top left corner and the bottom right corner of the rectangle
    <area shape="circle" coords="90,58,3" href="path2.htm" alt="Path2">
    //Coords are the x, y of the center of the circle and the lenght of half the diameter of the circle
    <area shape="poly" coords="124,58,8, 1" href="path3.htm" alt="Path3">
    //Coords are the x, y of each points in the shape drew for an pentagone (5 corners)
    //The coords attribute could look like this coords="0, 0, 10, 10, 5, 10, 10, 5, 12, 13"
    //I know this dont make a pentagone but it does ilustrate that you need 5 pairs of     
    //numbre in the coords and that if you need more of them you can add however you need .
</map>

然后在区域标签的href属性中,您可以将自己的路径放到用户单击该区域时所到达的位置。

答案 1 :(得分:1)

创建一个完全捕捉到地图的图像的可选部分并不容易,所以让我们使用d3,SVG和geojson将美国绘制为svg。

var width = 1000,  // create constants for svg width and height
    height = 500,
    projection = d3.geo.albersUsa();  //get projection
// albersusa is a special projection for the united states
var svg = d3.select("body")  //select the body and create the svg with the width and height constants.
  .append("svg")
  .attr({
    width:width,
    height:height
  });

var g = svg.append("g"); // append a svg group for the map

d3.json("geo.json", function(data){  //fetch the json data
  console.log(data.features);  
    g.selectAll("path")  //draw the map
    .data(data.features)
    .enter()
      .append("path")
      .attr("d", d3.geo.path().projection(projection))
      .on("click", function(d){  // add onclick listener that logs the state clicked on.
        console.log("You clicked on " + d.properties.NAME, d);
      });
});    

在图像上使用SVG的优点是可以使用CSS3转换动画svg元素,也可以使用javascript操作它们。 我在google drive上举办了一个例子。打开控制台并开始单击状态。

答案 2 :(得分:0)

相当多的javascript画布库可以帮助你解决这类问题,例如Raphael(http://raphaeljs.com/world/)或KineticJS(http://www.html5canvastutorials.com/labs/html5-canvas-world-map-svg-path-with-kineticjs/