兼容IE8的canvas自制圆形比例图

 兼容IE8的canvas自制圆形比例图,代码如下:    

            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
            <HTML>
            <HEAD>
                <TITLE> IE8支持HTML5+CSS3 </TITLE>
                <meta charset="UTF-8">
            <head>
            
            
            <!--IE8下显示状态-->
            <!--[if IE 8]>
                <style type="text/css">
                    #cv {
                        margin-top:100px;
                        margin-left:500px;
                        position: relative;
                         300px;
                        height: 300px;
                        border:1px solid red;
                        border-radius: 20px;
                        background-color:#fff;
                    }
                    @media screen{
                        #cv{
                            behavior: url(ie-css3.htc);
                        }
                    }
                    .mySpan{
                        position:absolute;
                        font-size:50px;
                        z-index:99;
                        top: 208px;
                        left: 600px;
                    }
                </style>
            
                <script type="text/javascript" src="jquery-1.7.js"></script>
            
                <script type="text/javascript" src="html5.js"></script>
                <script type="text/javascript" src="excanvas.compiled.js"></script>
                <script type="text/javascript">
                    function test() {
                        //声明外圆的半径和内圆的半径
                        var myR = 80;
                        var myNeiR = 50;
                        //获取输入框里面的值
                        var myInput1_Value = parseInt($(".myInput1").val());
                        var myInput2_Value = parseInt($(".myInput2").val());
            
                        var canvas  = document.getElementById("cv");
                        var cxt = canvas.getContext("2d");
            
                        //声明第一个进度条所占的百分比并转换成角度值
                        var myfirst = Math.PI * 2 * myInput1_Value / 100;
            
                        //声明第二个进度条所占的百分比并转换成角度值
                        var mysecond = Math.PI * 2 * myInput2_Value / 100;
            
                        //声明x,y边的变量,并获取变量的长度
                        var myYBian = Math.sin(myfirst) * 65;
                        var myXBian = Math.cos(myfirst) * 65;
                        console.log(myYBian + "===================" + myXBian);
            
                        //声明并获取最前面圆的圆心坐标
                        var myYuanX1 = null;
                        var myYuanY1 = null;
                        if (myInput1_Value >= 25 && myInput1_Value <= 50) {
                            var myYuanX1 = myXBian + 126;
                            var myYuanY1 = myYBian + 125;
                        } else if (myInput1_Value > 50 && myInput1_Value <= 75) {
                            var myYuanX1 = myXBian + 125;
                            var myYuanY1 = myYBian + 126;
                        } else if (myInput1_Value > 75 && myInput1_Value <= 100) {
                            var myYuanX1 = myXBian + 124;
                            var myYuanY1 = myYBian + 125;
                        } else {
                            var myYuanX1 = myXBian + 125;
                            var myYuanY1 = myYBian + 124;
                        }
            
                        var myYBian2 = Math.sin(myfirst + mysecond) * 65;
                        var myXBian2 = Math.cos(myfirst + mysecond) * 65;
                        var myYuanX2 = null;
                        var myYuanY2 = null;
                        if (myInput1_Value + myInput2_Value >= 25 && myInput1_Value + myInput2_Value <= 50) {
                            var myYuanX2 = myXBian2 + 126;
                            var myYuanY2 = myYBian2 + 125;
                        } else if (myInput1_Value + myInput2_Value > 50 && myInput1_Value + myInput2_Value <= 75) {
                            var myYuanX2 = myXBian2 + 125;
                            var myYuanY2 = myYBian2 + 126;
                        } else if (myInput1_Value + myInput2_Value > 75 && myInput1_Value + myInput2_Value <= 100) {
                            var myYuanX2 = myXBian2 + 124;
                            var myYuanY2 = myYBian2 + 125;
                        } else {
                            var myYuanX2 = myXBian2 + 125;
                            var myYuanY2 = myYBian2 + 124;
                        }
            
            
                            //画出最外面的一个圆形
                            cxt.fillStyle = "#ff3300";
                            cxt.beginPath();
                            cxt.arc(125, 125, myR, 0, Math.PI * 2, true);
                            cxt.closePath();
                            cxt.fill();
            
            
                        //再次重新声明变量颜色
                        cxt.fillStyle = "#0A72CB";
                        //画一个我角度为我所需要的扇形
                        DrawSector(canvas, myfirst, myfirst + mysecond, myR, true, false);
                        //画一个添加在我所画扇形前面的半圆
                        DrawSector3(canvas, myfirst + mysecond, myfirst + mysecond + Math.PI, (myR - myNeiR) / 2, true, false);
            
            
                        //重新给画笔声明颜色
                        cxt.fillStyle = "#000";
                        //画一个我角度为我所需要的扇形
                        DrawSector(canvas, 0 * Math.PI, myfirst, myR, true, false);
                        //画一个添加在我所画扇形前面的半圆
                        DrawSector2(canvas, myfirst, myfirst + Math.PI, (myR - myNeiR) / 2, true, false);
            
            
            
                        //画一个白色的实心圆形
                        cxt.fillStyle = "#fff";
                        cxt.beginPath();
                        cxt.arc(125, 125, myNeiR, 0, Math.PI * 2, true);
                        cxt.closePath();
                        cxt.fill();
            
                        //画进度条所需要调用的函数
                        function DrawSector(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                            var centerPoint = {x: 125, y: 125};
                            start_angle = start_angle || 0;
                            if (canvas_tag.getContext) {
            //开始绘制路径
                                ctx = canvas_tag.getContext("2d");
                                ctx.beginPath();
            //画出弧线
                                ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                                ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                                if (fill) {
                                    ctx.fill();
                                } else {
                                    ctx.closePath();
                                    ctx.stroke();
                                }
                            } else {
                                alert('You need Safari or Firefox 1.5+ to see this demo.');
                            }
                        }
            
                        //画最前面半圆所需要调用的函数
                        function DrawSector2(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                            var centerPoint = {x: myYuanX1, y: myYuanY1};
                            start_angle = start_angle || 0;
                            if (canvas_tag.getContext) {
            //开始绘制路径
                                ctx = canvas_tag.getContext("2d");
                                ctx.beginPath();
            //画出弧线
                                ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                                ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                                if (fill) {
                                    ctx.fill();
                                } else {
                                    ctx.closePath();
                                    ctx.stroke();
                                }
                            } else {
                                alert('You need Safari or Firefox 1.5+ to see this demo.');
                            }
                        }
            
                        //画最前面半圆所需要调用的函数
                        function DrawSector3(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                            var centerPoint = {x: myYuanX2, y: myYuanY2};
                            start_angle = start_angle || 0;
                            if (canvas_tag.getContext) {
            //开始绘制路径
                                ctx = canvas_tag.getContext("2d");
                                ctx.beginPath();
            //画出弧线
                                ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                                ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                                if (fill) {
                                    ctx.fill();
                                } else {
                                    ctx.closePath();
                                    ctx.stroke();
                                }
                            } else {
                                alert('You need Safari or Firefox 1.5+ to see this demo.');
                            }
                        }
            
            
            
            
            
                    }
            
                    window.onload = test;
                </script>
            
            
            </head>
            
            <body>
            <span class="mySpan">20%</span>
            <canvas id="cv"></canvas>
            <input type="text" class="myInput1" value="10">
            <input type="text" class="myInput2" value="20">
            <![endif]-->
            
            
            <!--IE9下显示状态-->
            <!--[if gte IE 9]>
            <style>
                #first{
                    margin-top:100px;
                    margin-left:500px;
                    border:1px solid red;
                    position: relative;
                    behavior: url(ie-css3.htc);
                }
                .mySpan{
                    position:absolute;
                    font-size:50px;
                    z-index:99;
                    top: 208px;
                    left: 600px;
                }
            </style>
            </head>
            <body>
            <canvas id="first"width="300" height="300" >
            
            </canvas>
            <span class="mySpan">20%</span>
            <input type="text" class="myInput1" value="10">
            <input type="text" class="myInput2" value="20">
            <button type="button" class="myBtn">确定</button>
            
            <script type="text/javascript" src="jquery-1.7.js"></script>
            <script type="text/javascript">
            
            
                console.log(Math.sin(Math.PI/6))
            
                $(function() {
            
                    //声明外圆的半径和内圆的半径
                    var myR = 80;
                    var myNeiR = 50;
            
                    //获取输入框里面的值
                    var myInput1_Value = parseInt($(".myInput1").val());
                    var myInput2_Value = parseInt($(".myInput2").val());
            
                    //判断输入框里面的值相加是否超过100
                    if (myInput1_Value + myInput2_Value <= 100) {
                        $(".mySpan").html(myInput1_Value + "%")
            
                        //声明第一个进度条所占的百分比并转换成角度值
                        var myfirst = Math.PI * 2 * myInput1_Value / 100;
            
                        //声明第二个进度条所占的百分比并转换成角度值
                        var mysecond = Math.PI * 2 * myInput2_Value / 100;
            
                        //声明获取画笔
                        var canvas = document.getElementById('first');
            
                        //声明x,y边的变量,并获取变量的长度
                        var myYBian = Math.sin(myfirst) * 65;
                        var myXBian = Math.cos(myfirst) * 65;
                        console.log(myYBian + "===================" + myXBian);
            
                        //声明并获取最前面圆的圆心坐标
                        var myYuanX1 = null;
                        var myYuanY1 = null;
                        if (myInput1_Value >= 25 && myInput1_Value <= 50) {
                            var myYuanX1 = myXBian + 126;
                            var myYuanY1 = myYBian + 125;
                        } else if (myInput1_Value > 50 && myInput1_Value <= 75) {
                            var myYuanX1 = myXBian + 125;
                            var myYuanY1 = myYBian + 126;
                        } else if (myInput1_Value > 75 && myInput1_Value <= 100) {
                            var myYuanX1 = myXBian + 124;
                            var myYuanY1 = myYBian + 125;
                        } else {
                            var myYuanX1 = myXBian + 125;
                            var myYuanY1 = myYBian + 124;
                        }
            
                        var myYBian2 = Math.sin(myfirst + mysecond) * 65;
                        var myXBian2 = Math.cos(myfirst + mysecond) * 65;
                        var myYuanX2 = null;
                        var myYuanY2 = null;
                        if (myInput1_Value + myInput2_Value >= 25 && myInput1_Value + myInput2_Value <= 50) {
                            var myYuanX2 = myXBian2 + 126;
                            var myYuanY2 = myYBian2 + 125;
                        } else if (myInput1_Value + myInput2_Value > 50 && myInput1_Value + myInput2_Value <= 75) {
                            var myYuanX2 = myXBian2 + 125;
                            var myYuanY2 = myYBian2 + 126;
                        } else if (myInput1_Value + myInput2_Value > 75 && myInput1_Value + myInput2_Value <= 100) {
                            var myYuanX2 = myXBian2 + 124;
                            var myYuanY2 = myYBian2 + 125;
                        } else {
                            var myYuanX2 = myXBian2 + 125;
                            var myYuanY2 = myYBian2 + 124;
                        }
            
            
                        //画出最外面的一个圆形
                        var cxt = canvas.getContext("2d")
                        cxt.fillStyle = "#ff3300";
                        cxt.beginPath();
                        cxt.arc(125, 125, myR, 0, Math.PI * 2, true);
                        cxt.closePath();
                        cxt.fill();
            
            
                        //再次重新声明变量颜色
                        cxt.fillStyle = "#0A72CB";
                        //画一个我角度为我所需要的扇形
                        DrawSector(canvas, myfirst, myfirst + mysecond, myR, true, false);
                        //画一个添加在我所画扇形前面的半圆
                        DrawSector3(canvas, myfirst + mysecond, myfirst + mysecond + Math.PI, (myR - myNeiR) / 2, true, false);
            
            
                        //重新给画笔声明颜色
                        cxt.fillStyle = "#000";
                        //画一个我角度为我所需要的扇形
                        DrawSector(canvas, 0 * Math.PI, myfirst, myR, true, false);
                        //画一个添加在我所画扇形前面的半圆
                        DrawSector2(canvas, myfirst, myfirst + Math.PI, (myR - myNeiR) / 2, true, false);
            
            
                        //画一个白色的实心圆形
                        cxt.fillStyle = "#fff";
                        cxt.beginPath();
                        cxt.arc(125, 125, myNeiR, 0, Math.PI * 2, true);
                        cxt.closePath();
                        cxt.fill();
                    }
            
            
                    //画进度条所需要调用的函数
                    function DrawSector(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                        var centerPoint = {x: 125, y: 125};
                        start_angle = start_angle || 0;
                        if (canvas_tag.getContext) {
            //开始绘制路径
                            ctx = canvas_tag.getContext("2d");
                            ctx.beginPath();
            //画出弧线
                            ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                            ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                            if (fill) {
                                ctx.fill();
                            } else {
                                ctx.closePath();
                                ctx.stroke();
                            }
                        } else {
                            alert('You need Safari or Firefox 1.5+ to see this demo.');
                        }
                    }
            
            
                    //画最前面半圆所需要调用的函数
                    function DrawSector2(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                        var centerPoint = {x: myYuanX1, y: myYuanY1};
                        start_angle = start_angle || 0;
                        if (canvas_tag.getContext) {
            //开始绘制路径
                            ctx = canvas_tag.getContext("2d");
                            ctx.beginPath();
            //画出弧线
                            ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                            ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                            if (fill) {
                                ctx.fill();
                            } else {
                                ctx.closePath();
                                ctx.stroke();
                            }
                        } else {
                            alert('You need Safari or Firefox 1.5+ to see this demo.');
                        }
                    }
            
                    //画最前面半圆所需要调用的函数
                    function DrawSector3(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                        var centerPoint = {x: myYuanX2, y: myYuanY2};
                        start_angle = start_angle || 0;
                        if (canvas_tag.getContext) {
            //开始绘制路径
                            ctx = canvas_tag.getContext("2d");
                            ctx.beginPath();
            //画出弧线
                            ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                            ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                            if (fill) {
                                ctx.fill();
                            } else {
                                ctx.closePath();
                                ctx.stroke();
                            }
                        } else {
                            alert('You need Safari or Firefox 1.5+ to see this demo.');
                        }
                    }
            
                })
            </script>
            <![endif]-->
            
            
            <!--非IE下的显示状态-->
            <![if !IE]>
            <style>
                #first{
                    margin-top:100px;
                    margin-left:500px;
                    border:1px solid red;
                    position: relative;
                    behavior: url(ie-css3.htc);
                }
                .mySpan{
                    position:absolute;
                    font-size:50px;
                    z-index:99;
                    top: 208px;
                    left: 600px;
                }
            </style>
            </head>
            <body>
            <canvas id="first"width="300" height="300" ></canvas>
            <span class="mySpan">20%</span>
            <input type="text" class="myInput1" value="10">
            <input type="text" class="myInput2" value="20">
            <button type="button" class="myBtn">确定</button>
            
            <script type="text/javascript" src="jquery-1.7.js"></script>
            <script type="text/javascript">
            
            
                console.log(Math.sin(Math.PI/6))
            
                $(function() {
            
                    //声明外圆的半径和内圆的半径
                    var myR = 80;
                    var myNeiR = 50;
            
                    //获取输入框里面的值
                    var myInput1_Value = parseInt($(".myInput1").val());
                    var myInput2_Value = parseInt($(".myInput2").val());
            
                    //判断输入框里面的值相加是否超过100
                    if (myInput1_Value + myInput2_Value <= 100) {
                        $(".mySpan").html(myInput1_Value + "%")
            
                        //声明第一个进度条所占的百分比并转换成角度值
                        var myfirst = Math.PI * 2 * myInput1_Value / 100;
            
                        //声明第二个进度条所占的百分比并转换成角度值
                        var mysecond = Math.PI * 2 * myInput2_Value / 100;
            
                        //声明获取画笔
                        var canvas = document.getElementById('first');
            
                        //声明x,y边的变量,并获取变量的长度
                        var myYBian = Math.sin(myfirst) * 65;
                        var myXBian = Math.cos(myfirst) * 65;
                        console.log(myYBian + "===================" + myXBian);
            
                        //声明并获取最前面圆的圆心坐标
                        var myYuanX1 = null;
                        var myYuanY1 = null;
                        if (myInput1_Value >= 25 && myInput1_Value <= 50) {
                            var myYuanX1 = myXBian + 126;
                            var myYuanY1 = myYBian + 125;
                        } else if (myInput1_Value > 50 && myInput1_Value <= 75) {
                            var myYuanX1 = myXBian + 125;
                            var myYuanY1 = myYBian + 126;
                        } else if (myInput1_Value > 75 && myInput1_Value <= 100) {
                            var myYuanX1 = myXBian + 124;
                            var myYuanY1 = myYBian + 125;
                        } else {
                            var myYuanX1 = myXBian + 125;
                            var myYuanY1 = myYBian + 124;
                        }
            
                        var myYBian2 = Math.sin(myfirst + mysecond) * 65;
                        var myXBian2 = Math.cos(myfirst + mysecond) * 65;
                        var myYuanX2 = null;
                        var myYuanY2 = null;
                        if (myInput1_Value + myInput2_Value >= 25 && myInput1_Value + myInput2_Value <= 50) {
                            var myYuanX2 = myXBian2 + 126;
                            var myYuanY2 = myYBian2 + 125;
                        } else if (myInput1_Value + myInput2_Value > 50 && myInput1_Value + myInput2_Value <= 75) {
                            var myYuanX2 = myXBian2 + 125;
                            var myYuanY2 = myYBian2 + 126;
                        } else if (myInput1_Value + myInput2_Value > 75 && myInput1_Value + myInput2_Value <= 100) {
                            var myYuanX2 = myXBian2 + 124;
                            var myYuanY2 = myYBian2 + 125;
                        } else {
                            var myYuanX2 = myXBian2 + 125;
                            var myYuanY2 = myYBian2 + 124;
                        }
            
            
                        //画出最外面的一个圆形
                        var cxt = canvas.getContext("2d")
                        cxt.fillStyle = "#ff3300";
                        cxt.beginPath();
                        cxt.arc(125, 125, myR, 0, Math.PI * 2, true);
                        cxt.closePath();
                        cxt.fill();
            
            
                        //再次重新声明变量颜色
                        cxt.fillStyle = "#0A72CB";
                        //画一个我角度为我所需要的扇形
                        DrawSector(canvas, myfirst, myfirst + mysecond, myR, true, false);
                        //画一个添加在我所画扇形前面的半圆
                        DrawSector3(canvas, myfirst + mysecond, myfirst + mysecond + Math.PI, (myR - myNeiR) / 2, true, false);
            
            
                        //重新给画笔声明颜色
                        cxt.fillStyle = "#000";
                        //画一个我角度为我所需要的扇形
                        DrawSector(canvas, 0 * Math.PI, myfirst, myR, true, false);
                        //画一个添加在我所画扇形前面的半圆
                        DrawSector2(canvas, myfirst, myfirst + Math.PI, (myR - myNeiR) / 2, true, false);
            
            
                        //画一个白色的实心圆形
                        cxt.fillStyle = "#fff";
                        cxt.beginPath();
                        cxt.arc(125, 125, myNeiR, 0, Math.PI * 2, true);
                        cxt.closePath();
                        cxt.fill();
                    }
            
            
                    //画进度条所需要调用的函数
                    function DrawSector(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                        var centerPoint = {x: 125, y: 125};
                        start_angle = start_angle || 0;
                        if (canvas_tag.getContext) {
            //开始绘制路径
                            ctx = canvas_tag.getContext("2d");
                            ctx.beginPath();
            //画出弧线
                            ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                            ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                            if (fill) {
                                ctx.fill();
                            } else {
                                ctx.closePath();
                                ctx.stroke();
                            }
                        } else {
                            alert('You need Safari or Firefox 1.5+ to see this demo.');
                        }
                    }
            
            
                    //画最前面半圆所需要调用的函数
                    function DrawSector2(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                        var centerPoint = {x: myYuanX1, y: myYuanY1};
                        start_angle = start_angle || 0;
                        if (canvas_tag.getContext) {
            //开始绘制路径
                            ctx = canvas_tag.getContext("2d");
                            ctx.beginPath();
            //画出弧线
                            ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                            ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                            if (fill) {
                                ctx.fill();
                            } else {
                                ctx.closePath();
                                ctx.stroke();
                            }
                        } else {
                            alert('You need Safari or Firefox 1.5+ to see this demo.');
                        }
                    }
            
                    //画最前面半圆所需要调用的函数
                    function DrawSector3(canvas_tag, start_angle, angle, radius, fill, anticlockwise) {
                        var centerPoint = {x: myYuanX2, y: myYuanY2};
                        start_angle = start_angle || 0;
                        if (canvas_tag.getContext) {
            //开始绘制路径
                            ctx = canvas_tag.getContext("2d");
                            ctx.beginPath();
            //画出弧线
                            ctx.arc(centerPoint.x, centerPoint.y, radius, start_angle, angle, anticlockwise);
            //画出结束半径
                            ctx.lineTo(centerPoint.x, centerPoint.y);
            //如果需要填充就填充,不需要就算了
                            if (fill) {
                                ctx.fill();
                            } else {
                                ctx.closePath();
                                ctx.stroke();
                            }
                        } else {
                            alert('You need Safari or Firefox 1.5+ to see this demo.');
                        }
                    }
            
                })
            </script>
            <![endif]>
            
            </body>

原文地址:https://www.cnblogs.com/haonantong/p/5065685.html