效果图
html
< div class = " clock" > < div class = " second-box" > </ div> < div class = " minute-box" > </ div> < div class = " hour-box" > </ div> < div class = " day-box" > </ div> < div class = " month-box" > </ div> < div class = " year-box" > </ div>
</ div>
JavaScript
function zeroFill ( val = 1 , len = 2 ) { return String ( val) . padStart ( len, '0' ) ;
} let second = ` ` ;
for ( let i = 0 ; i < 60 ; i++ ) { let div = ` <div id="second ${ i} " style="font-size: 20px; width: 100%; text-align: right; position: absolute; display: inline-block; transform: rotate( ${ ( i - 1 ) * - 6 } deg);"> ${ zeroFill ( i) } 秒</div> ` ; second = second + div;
}
document. querySelector ( '.second-box' ) . innerHTML = second; let minute = ` ` ;
for ( let i = 0 ; i < 60 ; i++ ) { let div = ` <div id="minute ${ i} " style="font-size: 20px; width: 100%; text-align: right; position: absolute; display: inline-block; transform: rotate( ${ i * - 6 } deg);"> ${ zeroFill ( i) } 分</div> ` ; minute = minute + div;
}
document. querySelector ( '.minute-box' ) . innerHTML = minute; let hour = ` ` ;
for ( let i = 0 ; i < 24 ; i++ ) { let div = ` <div id="hour ${ i} " style="position: absolute; width: 100%; display: inline-block; text-align: right; font-size: 20px; transform: rotate( ${ ( i - 1 ) * - 15 } deg);"> ${ zeroFill ( i) } 时</div> ` ; hour = hour + div;
}
document. querySelector ( '.hour-box' ) . innerHTML = hour; let day = ` ` ;
let _days = [ 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 ] ;
let _now = new Date ( ) ;
let _year = _now. getFullYear ( ) ;
let _month = _now. getMonth ( ) ;
if ( _year % 4 === 0 && ( _year % 100 !== 0 || _year % 400 === 0 ) ) _days[ 1 ] = 29 ;
let _deg = 360 / _days[ _month] ;
for ( let i = 0 ; i < _days[ _month] ; i++ ) { let div = ` <div id="day ${ i + 1 } " style="font-size: 20px; width: 100%; text-align: right; position: absolute; display: inline-block; transform: rotate( ${ i * - 1 * _deg} deg);"> ${ zeroFill ( i + 1 ) } 日</div> ` ; day = day + div;
}
document. querySelector ( '.day-box' ) . innerHTML = day; let month = ` ` ;
for ( let i = 0 ; i < 12 ; i++ ) { let div = ` <div id="month ${ i + 1 } " style="font-size: 20px; width: 100%; text-align: right; position: absolute; display: inline-block; transform: rotate( ${ i * - 30 } deg);"> ${ zeroFill ( i + 1 ) } 月</div> ` ; month = month + div;
}
document. querySelector ( '.month-box' ) . innerHTML = month; let second360 = 0 ;
let minute360 = 0 ;
let hour360 = 0 ;
let day360 = 0 ;
let month360 = 0 ; let oldsecond = 0 ;
let oldminute = 0 ;
let oldhour = 0 ;
let oldday = 0 ;
let oldmonth = 0 ; function transformBox ( ) { let nowDate = new Date ( ) ; let second = nowDate. getSeconds ( ) ; let minute = nowDate. getMinutes ( ) ; let hour = nowDate. getHours ( ) ; let day = nowDate. getDate ( ) ; let month = nowDate. getMonth ( ) ; let year = nowDate. getFullYear ( ) ; if ( second === 0 && oldsecond !== second) second360 = second360 + 1 ; if ( minute === 0 && oldminute !== minute) minute360 = minute360 + 1 ; if ( hour === 0 && oldhour !== hour) hour360 = hour360 + 1 ; if ( day === 0 && oldday !== day) day360 = day360 + 1 ; if ( month === 0 && oldmonth !== month) month360 = month360 + 1 ; document. querySelector ( '.second-box' ) . style. transform = ` rotate( ${ second360 * 360 + ( second - 1 ) * 6 } deg) ` ; document. querySelector ( '.minute-box' ) . style. transform = ` rotate( ${ minute360 * 360 + ( minute) * 6 } deg) ` ; document. querySelector ( '.hour-box' ) . style. transform = ` rotate( ${ hour360 * 360 + ( hour - 1 ) * 15 } deg) ` ; document. querySelector ( '.day-box' ) . style. transform = ` rotate( ${ day360 * 360 + ( day - 1 ) * _deg} deg) ` ; document. querySelector ( '.month-box' ) . style. transform = ` rotate( ${ month360 * 360 + month * 30 } deg) ` ; document. querySelector ( '.year-box' ) . innerHTML = year + '年' ; let nowDates = document. querySelectorAll ( '.now-date' ) ; nowDates. forEach ( ( ele ) => { ele. classList = '' ; } ) ; document. querySelector ( ` #second ${ second} ` ) . classList = 'now-date' ; document. querySelector ( ` #minute ${ minute} ` ) . classList = 'now-date' ; document. querySelector ( ` #hour ${ hour} ` ) . classList = 'now-date' ; document. querySelector ( ` #day ${ day} ` ) . classList = 'now-date' ; document. querySelector ( ` #month ${ month + 1 } ` ) . classList = 'now-date' ; oldsecond = second; oldminute = minute; oldhour = hour; oldday = day; oldmonth = month;
} transformBox ( ) ; setInterval ( ( ) => { transformBox ( ) ;
} , 1000 ) ;
style
* { margin : 0; padding : 0;
} body { width : 100%; height : 100%;
} .clock { width : 100%; height : 100%; background-color : #141929; position : absolute; display : flex; justify-content : center; align-items : center; color : #cad6dd; overflow : hidden;
} .now-date { background-image : -webkit-linear-gradient ( bottom, yellow, red) ; background-size : 100% 20px; -webkit-background-clip : text; -webkit-text-fill-color : transparent;
} .year-box { width : 10vh; height : 10vh; position : absolute; display : flex; font-size : 20px; justify-content : center; align-items : center; border-radius : 50%; transition : 1s; background-image : -webkit-linear-gradient ( bottom, yellow, red) ; background-size : 100% 20px; -webkit-background-clip : text; -webkit-text-fill-color : transparent;
} .month-box { width : 25vh; height : 25vh; position : absolute; display : flex; align-items : center; border-radius : 50%; transition : 1s;
} .day-box { width : 40vh; height : 40vh; position : absolute; display : flex; align-items : center; border-radius : 50%; transition : 1s;
} .hour-box { width : 55vh; height : 55vh; position : absolute; display : flex; align-items : center; border-radius : 50%; transition : 1s;
} .minute-box { width : 70vh; height : 70vh; position : absolute; display : flex; align-items : center; border-radius : 50%; transition : 1s;
} .second-box { width : 85vh; height : 85vh; position : absolute; display : flex; align-items : center; border-radius : 50%; transition : 1s;
}