Update HTML5 canvas rectangle on hover?

后端 未结 8 768
暗喜
暗喜 2020-12-03 01:57

I\'ve got some code which draws a rectangle on a canvas, but I want that rectangle to change color when I hover the mouse over it.

The problem is after I\'ve drawn t

8条回答
  •  囚心锁ツ
    2020-12-03 02:37

    This is a stable code in base of @K3N answer. The basic problem of his code is because when one box is over the another the two may get mouse hover at same time. My answer perfectly solves that adding a 'DESC' to 'ASC' loop.

    var canvas = document.getElementById("canvas"),
        ctx = canvas.getContext("2d");
    
    var map = [
        {x: 20, y: 20, w: 60, h: 60},
        {x: 30, y: 50, w: 76, h: 60}
    ];
    
    var hover = false, id;
    var _i, _b;
    function renderMap() {
        for(_i = 0; _b = map[_i]; _i ++) {
            ctx.fillStyle = (hover && id === _i) ? "red" : "blue";
            ctx.fillRect(_b.x, _b.y, _b.w, _b.h);
        }
    }
    // Render everything
    renderMap();
    canvas.onmousemove = function(e) {
        // Get the current mouse position
        var r = canvas.getBoundingClientRect(),
            x = e.clientX - r.left, y = e.clientY - r.top;
        hover = false;
    
        ctx.clearRect(0, 0, canvas.width, canvas.height);
    
        for(var i = map.length - 1, b; b = map[i]; i--) {
            if(x >= b.x && x <= b.x + b.w &&
               y >= b.y && y <= b.y + b.h) {
                // The mouse honestly hits the rect
                hover = true;
                id = i;
                break;
            }
        }
        // Draw the rectangles by Z (ASC)
        renderMap();
    }

提交回复
热议问题