Как избежать мерцания точек при наведении на кривые диаграммы - PullRequest
0 голосов
/ 24 сентября 2018

Я использую график с плавающей точкой для создания графика временной шкалы.Когда я парю над точками, я создаю дугу холста, чтобы построить точки на кривой.Когда я двигаю мышь по кривой, эти точки часто мерцают.Я хочу, чтобы он плавно двигался с помощью мыши, как на старшей диаграмме (https://www.highcharts.com/demo/line-time-series).

. Пожалуйста, найдите мой код ниже:

<html>

<head>
    <script type="text/javascript" src="http://www.jqueryflottutorial.com/js/lib/jquery-1.8.3.min.js"></script>
    <!--[if lte IE 8]><script language="javascript" type="text/javascript" src="/js/flot/excanvas.min.js"></script><![endif]-->
    <script type="text/javascript" src="http://www.jqueryflottutorial.com/js/flot/jquery.flot.min.js"></script>
    <script type="text/javascript" src="http://www.jqueryflottutorial.com/js/flot/jquery.flot.time.js"></script>
    <script type="text/javascript" src="http://www.jqueryflottutorial.com/js/flot/jshashtable-2.1.js"></script>
    <script type="text/javascript" src="http://www.jqueryflottutorial.com/js/flot/jquery.numberformatter-1.2.3.min.js"></script>
    <script type="text/javascript" src="http://www.jqueryflottutorial.com/js/flot/jquery.flot.symbol.js"></script>
    <script type="text/javascript" src="http://www.jqueryflottutorial.com/js/flot/jquery.flot.axislabels.js"></script>
    <script src="https://www.flotcharts.org/flot/jquery.flot.crosshair.js"></script>
    <style>
        .tooltip {
            text-decoration: none;
            position: relative;
        }

        .tooltip+span {
            display: none;
        }

        .tooltip:hover+span {
            display: block;
            position: fixed;
            padding: 10px;
            background-color: #333;
            color: #fff;
        }
    </style>
    <style>
        * {
            padding: 0;
            margin: 0;
            vertical-align: top;
        }

        body {
            background: url(background.png) repeat-x;
            font: 18px/1.5em "proxima-nova", Helvetica, Arial, sans-serif;
        }

        a {
            color: #069;
        }

        a:hover {
            color: #28b;
        }

        h2 {
            margin-top: 15px;
            font: normal 32px "omnes-pro", Helvetica, Arial, sans-serif;
        }

        h3 {
            margin-left: 30px;
            font: normal 26px "omnes-pro", Helvetica, Arial, sans-serif;
            color: #666;
        }

        p {
            margin-top: 10px;
        }

        button {
            font-size: 18px;
            padding: 1px 7px;
        }

        input {
            font-size: 18px;
        }

        input[type=checkbox] {
            margin: 7px;
        }

        #header {
            position: relative;
            width: 900px;
            margin: auto;
        }

        #header h2 {
            margin-left: 10px;
            vertical-align: middle;
            font-size: 42px;
            font-weight: bold;
            text-decoration: none;
            color: #000;
        }

        #content {
            width: 880px;
            margin: 0 auto;
            padding: 10px;
        }

        #footer {
            margin-top: 25px;
            margin-bottom: 10px;
            text-align: center;
            font-size: 12px;
            color: #999;
        }

        .demo-container {
            box-sizing: border-box;
            width: 850px;
            height: 450px;
            padding: 20px 15px 15px 15px;
            margin: 15px auto 30px auto;
            border: 1px solid #ddd;
            background: #fff;
            background: linear-gradient(#f6f6f6 0, #fff 50px);
            background: -o-linear-gradient(#f6f6f6 0, #fff 50px);
            background: -ms-linear-gradient(#f6f6f6 0, #fff 50px);
            background: -moz-linear-gradient(#f6f6f6 0, #fff 50px);
            background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px);
            box-shadow: 0 3px 10px rgba(0, 0, 0, 0.15);
            -o-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
            -ms-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
            -moz-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
            -webkit-box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1);
        }

        .demo-placeholder {
            width: 100%;
            height: 100%;
            font-size: 14px;
            line-height: 1.2em;
            cursor: crosshair;
        }

        .legend table {
            border-spacing: 5px;
        }

        .legend {
            display: none;
        }
    </style>


    <script>
        $(function () {
            var sin = [], cos = [];
            for (var i = 0; i < 14; i += 0.1) {
                sin.push([i, Math.sin(i)]);
                cos.push([i, Math.cos(i)]);
            }
            plot = $.plot("#placeholder", [
                { data: sin, label: "sin(x) = -0.00" },
                { data: cos, label: "cos(x) = -0.00" }
            ], {
                    series: {
                        lines: {
                            show: true
                        }
                    },
                    crosshair: {
                        mode: "x"
                    },
                    grid: {
                        hoverable: true,
                        autoHighlight: false
                    },
                    yaxis: {
                        min: -1.2,
                        max: 1.2
                    }
                });
            var tooltip = $("#infos span");
            tooltip.each(function () {
                // fix the widths so they don't jump around
                $(this).css('width', $(this).width());
            });

            var canvas = $(".overlay")[0];
            var ctx = canvas.getContext("2d");
            function plotPoint(x, y, radius, fillStyle, symbol) {
                ctx.beginPath();
                ctx.strokeStyle = "rgb(255, 255, 255)";
                ctx.lineWidth = 3;
                ctx.arc(x, y, radius, 0, Math.PI * 2, false);
                ctx.closePath();
                ctx.stroke();

                ctx.fillStyle = fillStyle;
                ctx.fill();

                ctx.beginPath();
                ctx.lineWidth = 1;
                ctx.strokeStyle = "rgb(160,149,117)";
                ctx.arc(x, y, radius + 2, 0, Math.PI * 2, false);
                ctx.closePath();
                ctx.stroke();
            }

            var updateTooltipTimeout = null;
            var latestPosition = null;
            function updateTooltip() {
                updateTooltipTimeout = null;
                var pos = latestPosition;
                var axes = plot.getAxes();
                if (pos.x < axes.xaxis.min || pos.x > axes.xaxis.max ||
                    pos.y < axes.yaxis.min || pos.y > axes.yaxis.max) {
                    return;
                }
                var i, j, dataset = plot.getData();
                for (i = 0; i < dataset.length; ++i) {
                    var series = dataset[i];
                    // Find the nearest points, x-wise
                    for (j = 0; j < series.data.length; ++j) {
                        if (series.data[j][0] > pos.x) {
                            break;
                        }
                    }
                    // Now Interpolate
                    var y,
                        p1 = series.data[j - 1],
                        p2 = series.data[j];
                    if (p1 == null) {
                        y = p2[1];
                    } else if (p2 == null) {
                        y = p1[1];
                    } else {
                        y = p1[1] + (p2[1] - p1[1]) * (pos.x - p1[0]) / (p2[0] - p1[0]);
                    }
                    tooltip.eq(i).text(y.toFixed(2));

                    var o = plot.pointOffset({
                        x: pos.x,
                        y: y
                    });
                    // if(i==0){

                    // }
                    // if(i==1){

                    // }
                    plotPoint(o.left, o.top, 5, "rgb(153,180,125)", "circle");
                }
            }

            $("#placeholder").bind("plothover", function (event, pos, item) {
                latestPosition = pos;
                if (!updateTooltipTimeout) {
                    updateTooltipTimeout = setTimeout(updateTooltip, 50);
                }
            });
            var tooltips = document.querySelector('#infos');

            window.onmousemove = function (e) {
                var x = (e.clientX + 20) + 'px',
                    y = (e.clientY + 20) + 'px';
                if (tooltips) {
                    tooltips.style.top = y;
                    tooltips.style.left = x;
                }
            };
        });

    </script>
</head>

<body>
    <div id="content">

        <div class="demo-container">
            <div id="placeholder" class="demo-placeholder tooltip">
            </div>
            <span id="infos">
                <div>sin(x) :
                    <span></span>
                </div>
                <div>cos(x) :
                    <span></span>
                </div>
            </span>
        </div>
    </div>
</body>

</html>

Вот скриншот графика enter image description here

...