JS實現時鐘效果

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 程式碼如下:

注1:決策報表中,可透過給 body 或者報表塊新增一個「初始化後」事件實現。程式碼需要加一個延遲函式,即將上述程式碼新增到setTimeout(function(){ },1000);程式碼的 { } 中。

注2:FVS 範本中,可透過給表格組件新增「初始化後」事件實現。程式碼與上述決策報表相同,但需要在 JavaScript 程式碼的開頭加上 "use document"; 。

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\doctw\JS\js實現時鐘效果.cpt 

點選可下載範本:js實現時鐘效果.cpt


附件列表


主題: 報表應用
已經是第一篇
已經是最後一篇
  • 有幫助
  • 沒幫助
  • 只是瀏覽
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

5s后關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙

反饋已提交

網絡繁忙