JSFiddle - React, Tailwind, and code Playground

by Amit Vishwakarma

HTML

<p>Hover over data-dots for tooltip</p>
<div id="wrapper">
    <canvas id="graph" width=300 height=150></canvas>
    <canvas id="tip" width=100 height=25></canvas>
</div>
<br>
<br>
<input type="text" id="text1" value="text 1" />
<br>
<br>
<input type="text" id="text2" value="text 2" />
<br>
<br>
<input type="text" id="text3" value="text 3" />
<br>
<br>
<input type="text" id="text4" value="text 4" />
<br>
<br>
<input type="text" id="text5" value="text 5" />
<br>
<br>
<input type="text" id="text6" value="text 6" />
<br>
<br>
<input type="text" id="text7" value="text 7" />
<br>
<br>

CSS

body {
    background-color: ivory;
    margin-top:35px;
}
#wrapper {
    position:relative;
    width:300px;
    height:150px;
}
canvas {
    border:1px solid red;
}
#tip {
    background-color:white;
    border:1px solid blue;
    position:absolute;
    left:-200px;
    top:100px;
}

JavaScript

var graph = document.getElementById("graph");
var ctx = graph.getContext("2d");
var tipCanvas = document.getElementById("tip");
var tipCtx = tipCanvas.getContext("2d");

var canvasOffset = $("#graph").offset();
var offsetX = canvasOffset.left;
var offsetY = canvasOffset.top;

var graph;
var xPadding = 30;
var yPadding = 30;

// Notice I changed The X values
var data = {
    values: [{
        X: 0,
        Y: 12
    }, {
        X: 2,
        Y: 28
    }, {
        X: 3,
        Y: 18
    }, {
        X: 4,
        Y: 34
    }, {
        X: 5,
        Y: 40
    }, {
        X: 6,
        Y: 80
    }, {
        X: 7,
        Y: 80
    }]
};

// define tooltips for each data point
var dots = [];
for (var i = 0; i < data.values.length; i++) {
    dots.push({
        x: getXPixel(data.values[i].X),
        y: getYPixel(data.values[i].Y),
        r: 4,
        rXr: 16,
        color: "red",
        tip: "#text" + (i + 1)
    });
}

// request mousemove events
$("#graph").mousemove(function (e) {
    handleMouseMove(e);
});

// show tooltip when mouse hovers over dot
function handleMouseMove(e) {
    mouseX = parseInt(e.clientX - offsetX);
    mouseY = parseInt(e.clientY - offsetY);

    // Put your mousemove stuff here
    var hit = false;
    for (var i = 0; i < dots.length; i++) {
        var dot = dots[i];
        var dx = mouseX - dot.x;
        var dy = mouseY - dot.y;
        if (dx * dx + dy * dy < dot.rXr) {
            tipCanvas.style.left = (dot.x) + "px";
            tipCanvas.style.top = (dot.y - 40) + "px";
            tipCtx.clearRect(0, 0, tipCanvas.width, tipCanvas.height);
            //                  tipCtx.rect(0,0,tipCanvas.width,tipCanvas.height);
            tipCtx.fillText($(dot.tip).val(), 5, 15);
            hit = true;
        }
    }
    if (!hit) {
        tipCanvas.style.left = "-200px";
    }
}


// unchanged code follows

// Returns the max Y value in our data list
function getMaxY() {
    var max = 0;

    for (var i = 0; i <...