在图表Js中合并Jquery旋钮功能

时间:2015-07-30 02:59:07

标签: chart.js

我正在使用ChartJS的圆环图,这是我的代码

<!doctype html>
<html>
    <head>
        <title>Doughnut Chart</title>

        <script src="jquery-1.11.3.min.js"></script>
        <script src="jquery.knob.js"></script>
        <script src="../Chart.js"></script>
        <style>
            body{
                padding: 0;
                margin: 0;
            }
            #canvas-holder{
                width:30%;
            }
        </style>
    </head>
    <body>
        <div id="canvas-holder">
            <canvas id="chart-area" width="250" class="knob" height="250"/>
        </div>
    <script>

        var doughnutData = [
                {
                    value: 200,
                    color:"#F7464A",
                    highlight: "#FF5A5E",
                    label: "Red"
                },
                {
                    value: 200,
                    color: "#46BFBD",
                    highlight: "#5AD3D1",
                    label: "Green"
                },
                {
                    value: 200,
                    color: "#FDB45C",
                    highlight: "#FFC870",
                    label: "Yellow"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                },
                {
                    value: 200,
                    color: "#4D5360",
                    highlight: "#616774",
                    label: "Dark Grey"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                },
                {
                    value: 200,
                    color: "#949FB1",
                    highlight: "#A8B3C5",
                    label: "Grey"
                }


            ];

            var options = {
                //Boolean - Whether we should show a stroke on each segment
                segmentShowStroke : true,

                //String - The colour of each segment stroke
                segmentStrokeColor : "#fff",

                //Number - The width of each segment stroke
                segmentStrokeWidth : 0,

                //Number - The percentage of the chart that we cut out of the middle
                percentageInnerCutout : 80, // This is 0 for Pie charts

                //Number - Amount of animation steps
                animationSteps : 100,

                //String - Animation easing effect
                animationEasing : "easeOutBounce",

                //Boolean - Whether we animate the rotation of the Doughnut
                animateRotate : true,

                //Boolean - Whether we animate scaling the Doughnut from the centre
                animateScale : false,

                showTooltips: false

            }


            window.onload = function(){
                var ctx = document.getElementById("chart-area").getContext("2d");
                var myDoughnut = new Chart(ctx).Doughnut(doughnutData, options);

                $("#chart-area").click( function(evt){
                    var activePoints = myDoughnut.getSegmentsAtEvent(evt);           
                    /* do something */
                }
            );  
            };



    </script>
    </body>
</html>

在圆环图中间点击画布时需要更新值(就像在Jquery Knob http://anthonyterrien.com/knob/中那样),即滑动值和点击画布时的值更新。有没有办法合并这两个库的功能

1 个答案:

答案 0 :(得分:1)

使用该控件会更好。也就是说,你也可以做Chart.js。这是一个公平的近似值(请注意,我已经在某些部分使用了jQuery,但你可以使用普通的javascript做同样的事情。)

<强> CSS

<style>
    .myChartWrapper {
        position: relative;
        display: inline-block;
    }

    .myChartValue {
        border: none;
        font-family: 'Helvetica';
        font-size: 20px;
        overflow: visible;
        width: 2em;
        white-space: nowrap;
        text-align: center;
        position: absolute;
        background-color: transparent;
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
    }

        .myChartValue::-ms-clear {
            display: none;
        }
</style>

<强> HTML

<div class="myChartWrapper">
    <canvas id="myChart"></canvas>
    <input id="myChartValue" class="myChartValue" />
</div>

<强>的Javascript

var value = 20;


var MAX = 200;
var STEP = 1;
var HALFSETCOLOR = "rgba(154, 225, 254, 1)";
var SETCOLOR = "rgba(134, 205, 234, 1)";
var UNSETCOLOR = "rgba(237, 237, 237, 1)";


var data = [];
for (var i = 0; i < MAX; i = i + STEP) {
    data.push({
        value: STEP,
        color: (i < value) ? SETCOLOR : UNSETCOLOR,
        label: i
    })
}


var canvas = document.getElementById("myChart");
var ctx = canvas.getContext("2d");
var myDoughnutChart = new Chart(ctx).Doughnut(data, {
    animation: false,
    segmentShowStroke: false,
    showTooltips: false
});

$("#myChartValue").val(value);


// half set the sectors
canvas.onmousedown = function (evt) {
    var activeSegments = myDoughnutChart.getSegmentsAtEvent(evt);
    if (activeSegments.length) {
        var value = Number(activeSegments[0].label);

        var crossed = false;
        myDoughnutChart.segments.forEach(function (segment) {
            if (Number(segment.label) >= value)
                crossed = true;

            if (!crossed && segment.fillColor !== SETCOLOR)
                segment.fillColor = HALFSETCOLOR;
            else if (crossed && segment.fillColor !== UNSETCOLOR)
                segment.fillColor = HALFSETCOLOR;
        })
        myDoughnutChart.update()
        myDoughnutChart.value = value;

        $("#myChartValue").val(value);
    }
};

canvas.onmousemove = function (evt) {
    if (myDoughnutChart.value !== undefined) {
        canvas.onmousedown(evt)
    }
}

// set / unset sectors
canvas.onmouseup = function () {
    var value = myDoughnutChart.value;
    if (value !== undefined) {
        var crossed = false;

        myDoughnutChart.segments.forEach(function (segment, i) {
            if (Number(segment.label) >= value)
                crossed = true;

            if (!crossed)
                segment.fillColor = SETCOLOR;
            else if (crossed)
                segment.fillColor = UNSETCOLOR;
        })

        myDoughnutChart.value = undefined;
        myDoughnutChart.update()
    }
};

$("#myChartValue").on("change", function () {
    myDoughnutChart.value = Number($("#myChartValue").val());
    canvas.onmouseup();
})

它可以做一些清理(比如在不抬起鼠标的情况下处理方向改变),但是非常接近旋钮功能而不需要太多努力。

小提琴 - http://jsfiddle.net/rxrxLo33/

enter image description here