在html画布圆圈中具有多个可单击的片段,在所单击的每个区域中填充颜色

时间:2015-07-16 21:04:54

标签: css html5 canvas

我需要创建一个评级范围在1到5之间的评级圈。 我想要一个有5个不同部分的圆圈。单击每个段时,应填充段的颜色。作为设计画布的新手,我无法弄清楚将画布分成多个可点击的片段。 像图像一样

enter image description here

我能够通过使用带有div的css来实现这个目标

<div class="main">
<div class="quarter quarter1"></div>
<div class="quarter quarter2"></div>
<div class="quarter quarter3"></div>
<div class="quarter quarter4"></div>
<div class="cutout"></div>
</div>

链接到jsFiddle

1 个答案:

答案 0 :(得分:1)

我喜欢你,因为你坚持了很多天后的目标。我决定完成我的答案。 我希望这个答案是完整的。

&#13;
&#13;
var context;
var canvas_width;
var canvas_height;
var canvas_offset_left;
var canvas_offset_top;
var center_location_x = 100;
var center_location_y = 100;
var item_selected;

colors = ["#FFF212", "#A8CF45", "#F58634" , "#FFF212", "#A8CF45", "#F58634"];

var third = 1/3;
var width = 70;

window.onload = function(){
var canvas = document.getElementById("canvas");
 context = canvas.getContext("2d");

  canvas_width = canvas.width;
  canvas_height = canvas.width;
  canvas_offset_left = canvas.offsetLeft;
  canvas_offset_top = canvas.offsetTop;
  drawAll();
};

function drawAll()
{
  context.beginPath();
  context.fillStyle='#FFFFFF';
  context.fillRect(0, 0, canvas_width,canvas_height);
  context.closePath();

  for(var i=0; i<6; i++)
     draw_item(i, false);
}

//handle mouse event ---------------
var cursor_x=0;
var cursor_y=0;

function move(e)
{
e=e||event;
cursor_x=e.pageX;
cursor_y=e.pageY;
if(e.target.id != 'canvas')
    drawAll();
}
document.onmousemove=move;
//---------------------------------


document.getElementById('canvas-div').onmousemove = hoverAction;
function hoverAction()
{
    var offset_x = (center_location_x)+canvas_offset_left;
    var offset_y = (center_location_y)+canvas_offset_top;

    move_degree = Math.atan2( cursor_x - offset_x ,  -(cursor_y - offset_y) );

      drawAll();
      switch(true)
      {
        case (move_degree > 0 && move_degree < (Math.PI/3) ):
           draw_item(0, true);
        break;
        case (move_degree > (Math.PI/3) && move_degree < (Math.PI/3)*2 ):
           draw_item(1, true);
        break;
        case (move_degree > (Math.PI/3)*2 && move_degree < Math.PI ):
           draw_item(2, true);
        break;
        case (move_degree > -Math.PI && move_degree < -Math.PI+(Math.PI/3) ):
           draw_item(3, true);
        break;
        case (move_degree > -Math.PI+(Math.PI/3) && move_degree < -Math.PI+(Math.PI/3)*2 ):
           draw_item(4, true);
        break;
        case (move_degree > -Math.PI+(Math.PI/3)*2  && move_degree < 0 ):
           draw_item(5, true);
        break;
      }


}

function draw_item(item, isHover)
{
     item_selected = item;
     var color =  isHover ? "#0C10CC" : colors[item];
     context.beginPath();
     switch(item)
      {
        case 0 :
          context.arc(100, 100, 60, 1.5*Math.PI, (Math.PI*1.5)+(third*Math.PI) );
        break;
        case 1 :
          context.arc(100, 100, 60, (Math.PI*1.5)+(third*Math.PI), (Math.PI*1.5)+ (third*Math.PI*2));
        break;
        case 2 :
          context.arc(100, 100, 60, (Math.PI*1.5)+(third*Math.PI*2), (Math.PI*0.5));
        break;
        case 3 :
          context.arc(100, 100, 60, Math.PI*0.5,  (Math.PI*0.5)+(third*Math.PI));
        break;
        case 4 :
          context.arc(100, 100, 60, (Math.PI*0.5)+(third*Math.PI), (Math.PI*0.5)+(third*Math.PI*2));
        break;
        case 5 :
          context.arc(100, 100, 60,  (Math.PI*0.5)+(third*Math.PI*2), (Math.PI*1.5));
        break;
      }
      context.strokeStyle = color;
      context.lineWidth = width;
      context.stroke();
      context.closePath();
}
&#13;
 #canvas-div
 {
   -webkit-border-radius: 50%;
  border-radius: 50%;
  height: 200px;
  width : 200px;
  overflow: hidden;
  cursor: pointer;
 }
&#13;
<div id="canvas-div"><canvas height="200" width="200" id="canvas" onclick="alert(item_selected+1)"> your browser not support</canvas></div>
&#13;
&#13;
&#13;