Html – 文字时钟
文字时钟,之前在Android上实现了相关效果,闲来无事,弄个网页版的玩玩。。。
直接上代码:
<! DOCTYPE html >
< html lang = " en" >
< head> < meta charset = " UTF-8" > < title> Text Clock</ title> < style type = " text/css" > html, body { margin : 0; padding : 0; background : black; } .root { display : flex; justify-content : center; } .container { display : block; background : black; } </ style>
</ head>
< body>
< div class = " root" > < canvas id = " container" class = " container" > </ canvas>
</ div> < script type = " text/javascript" > const HOURS = [ "一点" , "二点" , "三点" , "四点" , "五点" , "六点" , "七点" , "八点" , "九点" , "十点" , "十一点" , "十二点" ] ; const MINUTES = [ "一分" , "二分" , "三分" , "四分" , "五分" , "六分" , "七分" , "八分" , "九分" , "十分" , "十一分" , "十二分" , "十三分" , "十四分" , "十五分" , "十六分" , "十七分" , "十八分" , "十九分" , "二十分" , "二十一分" , "二十二分" , "二十三分" , "二十四分" , "二十五分" , "二十六分" , "二十七分" , "二十八分" , "二十九分" , "三十分" , "三十一分" , "三十二分" , "三十三分" , "三十四分" , "三十五分" , "三十六分" , "三十七分" , "三十八分" , "三十九分" , "四十分" , "四十一分" , "四十二分" , "四十三分" , "四十四分" , "四十五分" , "四十六分" , "四十七分" , "四十八分" , "四十九分" , "五十分" , "五十一分" , "五十二分" , "五十三分" , "五十四分" , "五十五分" , "五十六分" , "五十七分" , "五十八分" , "五十九分" , "" ] ; const SECONDS = [ "一秒" , "二秒" , "三秒" , "四秒" , "五秒" , "六秒" , "七秒" , "八秒" , "九秒" , "十秒" , "十一秒" , "十二秒" , "十三秒" , "十四秒" , "十五秒" , "十六秒" , "十七秒" , "十八秒" , "十九秒" , "二十秒" , "二十一秒" , "二十二秒" , "二十三秒" , "二十四秒" , "二十五秒" , "二十六秒" , "二十七秒" , "二十八秒" , "二十九秒" , "三十秒" , "三十一秒" , "三十二秒" , "三十三秒" , "三十四秒" , "三十五秒" , "三十六秒" , "三十七秒" , "三十八秒" , "三十九秒" , "四十秒" , "四十一秒" , "四十二秒" , "四十三秒" , "四十四秒" , "四十五秒" , "四十六秒" , "四十七秒" , "四十八秒" , "四十九秒" , "五十秒" , "五十一秒" , "五十二秒" , "五十三秒" , "五十四秒" , "五十五秒" , "五十六秒" , "五十七秒" , "五十八秒" , "五十九秒" , "" ] ; const INTERVAL_UPDATE = 1000 ; const mColorCenetr = "#ffffff" ; const mColorCur = "#ff0000" ; const mColorCom = "#bdbdbd" ; const mColorBg = "#000000" ; const mFont = "华文行楷" ; var mWidth, mHeight; var mH, mM, mS; var mH24; var mWeek, mDate, mTime; var mRadiusH, mRadiusM, mRadiusS; var mDegreeH, mDegreeM, mDegreeS; var mTextSizeCom; var mTextSizeCenter; var mOffset; var mCenterHeight; var canvas; var cxt; var hd, md, sd, av; window. onload = function ( ) { initial ( ) ; } window. onresize = function ( ) { calcSize ( ) ; } function initial ( ) { canvas = document. getElementById ( "container" ) ; cxt = canvas. getContext ( "2d" ) ; calcSize ( ) ; curTime ( ) ; startTask ( ) ; } function calcSize ( ) { mWidth = window. innerWidth; mHeight = window. innerHeight; mWidth = mHeight = Math. min ( mWidth, mHeight) ; canvas. width = mWidth; canvas. height = mHeight; mTextSizeCom = mWidth / 50 ; mTextSizeCenter = mWidth / 35 ; mOffset = mTextSizeCenter / 2 ; mCenterHeight = ( mHeight - mTextSizeCom) / 2 ; mRadiusH = mWidth / 6 ; mRadiusM = mRadiusH + 4 * mTextSizeCom; mRadiusS = mRadiusM + 5 * mTextSizeCom; } function startTask ( ) { setInterval ( function ( ) { curTime ( ) ; var times = 0 ; var interval = setInterval ( function ( ) { if ( times > 6 ) { clearInterval ( interval) ; } else { doAnimation ( ) ; times++ ; } } , 10 ) } , INTERVAL_UPDATE ) ; } function doAnimation ( ) { av = av - 0.9 ; if ( mM === 0 && mS === 0 ) { mDegreeH = hd + av * 5 ; } if ( mS === 0 ) { mDegreeM = md + av; } mDegreeS = sd + av; drawCanvas ( ) ; } function updateBg ( ) { cxt. fillStyle = mColorBg; cxt. fillRect ( 0 , 0 , mWidth, mHeight) ; } function drawCenterInfo ( ) { cxt. save ( ) ; cxt. fillStyle = mColorCenetr; cxt. font = mTextSizeCenter + "px " + mFont; var len = ( mTime. length - 2 ) * mTextSizeCenter / 2 ; cxt. fillText ( mTime, ( mWidth - len) / 2 , mHeight / 2 - mTextSizeCenter * 3 / 2 - mOffset) ; var len2 = ( mDate. length- 2 ) * mTextSizeCenter / 2 ; cxt. fillText ( mDate, ( mWidth - len2) / 2 , mHeight / 2 - mTextSizeCenter / 2 ) ; var len3 = mWeek. length * mTextSizeCenter; cxt. fillText ( mWeek, ( mWidth - len3) / 2 , mHeight / 2 + mTextSizeCenter / 2 + mOffset) ; cxt. restore ( ) ; } function drawHour ( ) { cxt. save ( ) ; cxt. translate ( mWidth / 2 , mHeight / 2 ) ; cxt. rotate ( mDegreeH * Math. PI / 180 ) ; cxt. translate ( - mWidth / 2 , - mHeight / 2 ) ; for ( var i = 0 ; i < HOURS . length; i++ ) { cxt. save ( ) ; cxt. translate ( mWidth / 2 , mHeight / 2 ) ; cxt. rotate ( 30 * i * Math. PI / 180 ) ; cxt. translate ( - mWidth / 2 , - mHeight / 2 ) ; if ( i + 1 === mH || ( i === 11 && mH === 0 ) ) { cxt. fillStyle = mColorCur; } else { cxt. fillStyle = mColorCom; } cxt. font = mTextSizeCom + "px " + mFont; cxt. fillText ( HOURS [ i] , mWidth / 2 + mRadiusH, mCenterHeight) ; cxt. restore ( ) ; } cxt. restore ( ) ; } function drawMinute ( ) { cxt. save ( ) ; cxt. translate ( mWidth / 2 , mHeight / 2 ) ; cxt. rotate ( mDegreeM * Math. PI / 180 ) ; cxt. translate ( - mWidth / 2 , - mHeight / 2 ) ; for ( var i = 0 ; i < MINUTES . length; i++ ) { cxt. save ( ) ; cxt. translate ( mWidth / 2 , mHeight / 2 ) ; cxt. rotate ( 6 * i * Math. PI / 180 ) ; cxt. translate ( - mWidth / 2 , - mHeight / 2 ) ; if ( i + 1 === mM) { cxt. fillStyle = mColorCur; } else { cxt. fillStyle = mColorCom; } cxt. font = mTextSizeCom + "px " + mFont; cxt. fillText ( MINUTES [ i] , mWidth / 2 + mRadiusM, mCenterHeight) ; cxt. restore ( ) ; } cxt. restore ( ) ; } function drawSecond ( ) { cxt. save ( ) ; cxt. translate ( mWidth / 2 , mHeight / 2 ) ; cxt. rotate ( mDegreeS * Math. PI / 180 ) ; cxt. translate ( - mWidth / 2 , - mHeight / 2 ) ; for ( var i = 0 ; i < MINUTES . length; i++ ) { cxt. save ( ) ; cxt. translate ( mWidth / 2 , mHeight / 2 ) ; cxt. rotate ( 6 * i * Math. PI / 180 ) ; cxt. translate ( - mWidth / 2 , - mHeight / 2 ) ; if ( i + 1 === mS) { cxt. fillStyle = mColorCur; } else { cxt. fillStyle = mColorCom; } cxt. font = mTextSizeCom + "px " + mFont; cxt. fillText ( SECONDS [ i] , mWidth / 2 + mRadiusS, mCenterHeight) ; cxt. restore ( ) ; } cxt. restore ( ) ; } function drawCanvas ( ) { updateBg ( ) ; drawCenterInfo ( ) ; drawHour ( ) ; drawMinute ( ) ; drawSecond ( ) ; } function curTime ( ) { let date = new Date ( ) ; let year = date. getFullYear ( ) ; let month = date. getMonth ( ) + 1 ; let day = date. getDate ( ) ; let week = date. getDay ( ) ; mH24 = date. getHours ( ) ; mM = date. getMinutes ( ) ; mS = date. getSeconds ( ) ; mH = mH24 >= 12 ? mH24 - 12 : mH24; mTime = formatTime ( mH24) + ':' + formatTime ( mM) + ':' + formatTime ( mS) ; mDate = year + '/' + formatTime ( month) + '/' + formatTime ( day) ; mWeek = parseWeek ( week) ; calculateDegree ( ) ; } function calculateDegree ( ) { mDegreeH = - 360 / 12 * ( mH - 1 ) ; mDegreeM = - 360 / 60 * ( mM - 1 ) ; mDegreeS = - 360 / 60 * ( mS - 1 ) ; hd = mDegreeH; md = mDegreeM; sd = mDegreeS; av = 6 ; } function formatTime ( fn ) { return fn < 10 ? "0" + fn : fn; } function parseWeek ( week ) { var mWeek; switch ( week) { case 1 : mWeek = "星期一" ; break ; case 2 : mWeek = "星期二" ; break ; case 3 : mWeek = "星期三" ; break ; case 4 : mWeek = "星期四" ; break ; case 5 : mWeek = "星期五" ; break ; case 6 : mWeek = "星期六" ; break ; case 7 : mWeek = "星期日" ; break ; } return mWeek; }
</ script>
</ body>
</ html>