反馈已提交

网络繁忙

JS实现时钟效果

  • 文档创建者:axing
  • 历史版本:14
  • 最近更新:Eran 于 2023-12-01
  • 1. 概述

    1.1 预期效果

    在做报表的时候希望实时的展现时间,并有一个比较美观的钟表效果,如下图所示:


    222

    1.2 实现思路

    利用 HTIML的画布功能并配合 JavaScript 代码,获取系统的实时时间,并间隔一秒绘制一次时钟。

    2. 示例

    2.1 准备模板

    新建模板,在 A1 单元格中添加 HTML 代码,设置单元格显示方式为「用 HTML 显示内容」。如下图所示:

    HTML 代码如下:

    注:代码中的宽和高属性可以根据自己的需要调整。

    <canvas id="view" height="300px" width="300px"></canvas>

    2.2 添加事件

    点击「模板>模板Web属性>分页预览设置」,选择「为该模板单独设置」,增加一个「加载结束」事件,如下图所示:

    JavaScript 代码如下:

    注:决策报表中,可通过给 body 或者报表块添加一个「初始化后」事件实现。代码需要加一个延迟函数,即将上述代码添加到setTimeout(function(){ },1000);代码的 { } 中。

    var dom=document.getElementById("view");  //获取canvas元素
    var ctx=dom.getContext("2d");            //创建context对象
    var width=ctx.canvas.width;
    var height=ctx.canvas.height;
    var r=width/2;
    //绘制时钟背景
    function drawBackground(){
    ctx.translate(r,r);      //将画布原点重置为画布的中心
    ctx.beginPath();
    ctx.lineWidth=10;
    ctx.arc(0,0,r-5,0,2*Math.PI);    //绘制一个圆,即时钟的边框
    ctx.stroke();
    //绘制时钟上的刻度
    for(var i=0;i<60;i++){
        var x=(r-20)*Math.cos(Math.PI*2/60*i);
        var y=(r-20)*Math.sin(Math.PI*2/60*i);
    //每逢5个刻度使用黑色绘制,其余用灰色绘制
        if(i%5===0){
    ctx.fillStyle="#000000";
    }else{
    ctx.fillStyle="#cccccc";
    }
    ctx.beginPath();
    ctx.arc(x,y,5,0,2*Math.PI);
    ctx.fill();
    }
    //绘制时钟上的数字
    ctx.font="20px Arial";
    ctx.textAlign="center";
    ctx.textBaseline="middle";
    ctx.fillStyle="#000000";
    for(var j=0;j<12;j++){
        var ax=(r-50)*Math.cos(Math.PI*2/12*j);
        var ay=(r-50)*Math.sin(Math.PI*2/12*j);
    ctx.beginPath();
    ctx.fillText(j>9?j-9:j+3,ax,ay);  //因为PI的角度计算是从3点钟方向顺时针计算的,所以要对数字判断处理
    ctx.fill();
    }
    }
    //绘制时针
    function drawHour(hour,minute,second){
    ctx.save();      //保存当前绘图环境
    ctx.beginPath();
    //时针的角度等于小时的角度加分钟和秒钟转化为小时的角度
    var rad=2*Math.PI/12*hour+2*Math.PI/12/60*minute+2*Math.PI/12/60/3600*second;
    ctx.rotate(rad);
    ctx.lineWidth=14;
    ctx.lineCap="round"; //设置画线结束端为圆帽形
    ctx.moveTo(0,20);
    ctx.lineTo(0,-r+100);
    ctx.stroke();
    ctx.restore();   //返回之前保存的绘图环境
    }
    //绘制分针
    function drawMinute(minute,second){
    ctx.save();      //保存当前绘图环境
    ctx.beginPath();
    //分针的角度等于分钟的角度加秒钟转化为分钟的角度
    var rad=2*Math.PI/60*minute+2*Math.PI/3600*second;
    ctx.rotate(rad);
    ctx.lineWidth=10;
    ctx.lineCap="round";
    ctx.moveTo(0,20);
    ctx.lineTo(0,-r+80);
    ctx.stroke();
    ctx.restore();   //返回之前保存的绘图环境
    }
    //绘制秒针
    function drawSecond(second){
    ctx.save();      //保存当前绘图环境
    ctx.beginPath();
    ctx.fillStyle="#FF0000";
    var rad=2*Math.PI/60*second;   //秒针的角度为当前秒钟的角度
    ctx.rotate(rad);
    ctx.lineWidth=2;
    ctx.lineCap="round";
    ctx.moveTo(0,30);
    ctx.lineTo(8,0);
    ctx.lineTo(0,-r+30);
    ctx.lineTo(-8,0);
    ctx.lineTo(0,30);
    ctx.fill();
    ctx.restore();   //返回之前保存的绘图环境
    }
    //重新绘制时钟
    function run(){
    ctx.clearRect(0,0,width,height);   //清空整张画布,在下面的代码中重新绘制
    ctx.save();     //保存当前绘图环境
    var time =new Date();      //获取当前时间
    var hour=time.getHours();    //获取小时数
    var minute=time.getMinutes();  //获取分钟数
    var second=time.getSeconds();  //获取秒数
    drawBackground();              //绘制背景
        drawHour(hour,minute,second);  //绘制时针
        drawMinute(minute,second);     //绘制分针
        drawSecond(second);            //绘制秒针
    //绘制时钟中心的那个点
        ctx.fillStyle="#555";
        ctx.beginPath();
    ctx.arc(0,0,8,0,2*Math.PI);
    ctx.fill();
    ctx.restore();  //返回之前保存的绘图环境
    }
    window.setInterval(function(){run();},1000);  //每隔一秒重新绘制时钟

    2.3 效果预览

    保存模板,点击「分页预览」,效果如下图所示:

    注:不支持移动端。

    3. 模板下载

    已完成模板可参考%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doc\JS\js实现时钟效果.cpt 

    点击可下载模板:js实现时钟效果.cpt

    附件列表


    主题: 报表应用
    • 有帮助
    • 没帮助
    • 只是浏览
    中文(简体)

    鼠标选中内容,快速反馈问题

    鼠标选中存在疑惑的内容,即可快速反馈问题,我们将会跟进处理。

    不再提示

    10s后关闭

    联系我们
    在线支持
    获取专业技术支持,快速帮助您解决问题
    工作日9:00-12:00,13:30-17:30在线
    页面反馈
    针对当前网页的建议、问题反馈
    售前咨询
    采购需求/获取报价/预约演示
    或拨打: 400-811-8890 转1
    qr
    热线电话
    咨询/故障救援热线:400-811-8890转2
    总裁办24H投诉:17312781526
    提交页面反馈
    仅适用于当前网页的意见收集,帆软产品问题请在 问答板块提问前往服务平台 获取技术支持