canvas实现价格走执图。

本文介绍了一种利用canvas元素实现自适应最大值最小值显示并保持居中的图表绘制方法,通过JavaScript监听窗口resize事件调整图表尺寸,并在页面加载时自动执行,确保图表始终与页面宽度和高度相匹配,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


自动适应最大值最小值,永远显示在中间。只要在页中加个canvas 。
    </script>
 (function(){
            var w = document.documentElement.clientWidth;
            var h = document.documentElement.clientHeight;
            window.addEventListener('resize',function(){
                var data=[{},{"period":"201307","mid_price":"45928"},{"period":"209308","mid_price":"49095"},{"period":"901309","mid_price":"42749"},{"period":"201310","mid_price":"42997"},{"period":"201311","mid_price":"43238"},{"period":"201312","mid_price":"43789"}];
                drawPic("myCanvas",data,'period','mid_price');
            })
            var w = document.documentElement.clientWidth;
            var h = document.documentElement.clientHeight;
            var container = document.getElementById("myCanvas");
            container.setAttribute("width",w +"px");
            container.setAttribute("height",h +"px");
            var data=[{},{"period":"201307","mid_price":"45928"},{"period":"209308","mid_price":"49095"},{"period":"901309","mid_price":"42749"},{"period":"201310","mid_price":"42997"},{"period":"201311","mid_price":"43238"},{"period":"201312","mid_price":"43789"}];
            drawPic("myCanvas",data,'period','mid_price');
        })();
        /**
         *
         * @param w canavs width
         * @param h canvas height
         * @param arv data
         */

        function drawPic(id,arv,xkey,ykey){
            var sum = 0,range, w, h,xa,ya,maxY,minY;
            var container = document.getElementById(id);

            //这里可用可不用 begain
            var w = document.documentElement.clientWidth;
            var h = document.documentElement.clientHeight;
            container.setAttribute("width",w +"px");
            container.setAttribute("height",h +"px");
            //这里可用可不用 end

            var cxt= container.getContext("2d");
            w = container.offsetWidth;
            h = container.offsetHeight;
            cxt.clearRect(0,0,w,h);
            xa = w/arv.length;
            cxt.fillStyle = "#333";
            cxt.font = "14px Arial";
            cxt.textAlign = "center";
            cxt.strokeStyle =  '#adadad';
            cxt.save();
            cxt.translate(10,h-20);
            cxt.beginPath();
            cxt.moveTo(0,0)
            cxt.lineTo(0,-h);
            cxt.moveTo(0,0);
            cxt.lineTo(w,0);
            for(var i=0;i<arv.length;i++){
                if(arv[i][xkey]){
                    cxt.fillText(arv[i][xkey],i*xa,20)
                    cxt.moveTo(i*xa,0);
                    cxt.lineTo(i*xa,5);
                }
                /**
                 * 以下是数组求最大值最小值。
                 * */
                if(arv[i][ykey]){
                    if(!maxY){
                        maxY=minY =arv[i][ykey]
                    }
                    maxY=arv[i][ykey]>maxY?arv[i][ykey]:maxY;
                    minY=arv[i][ykey]<minY?arv[i][ykey]:minY;
                }
            }
            cxt.closePath();
            cxt.stroke();
            cxt.beginPath();
            //下面是画Y轴部分。
            var dataAvg = maxY -minY;
            ya = h/3;//三等分
            cxt.strokeStyle="#53bd1b";
            cxt.fillStyle = "#53bd1b";
            for(var i=0;i<arv.length;i++){
                if(arv[i][ykey]){
                    var py = -(arv[i][ykey] -minY)*(ya/dataAvg)-ya;
                   // cxt.moveTo(i*xa,py+10);//避免最后一笔连串
                    arv[i].ypos = py+10;
                    if(arv[i-1]&&arv[i-1].ypos){
                        cxt.moveTo((i-1)*xa,arv[i-1].ypos);
                        cxt.lineTo(i*xa,py+10);
                    }
                    cxt.moveTo((i)*xa,py+10);
                    cxt.arc((i)*xa,py+10,3, 0, Math.PI * 2, true)
                    cxt.fill();
                    cxt.fillText(arv[i][ykey],i*xa,py)
                }
            }
            cxt.closePath();
            cxt.stroke();
            cxt.restore();
        }

欢迎拍砖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值