淺談時(shí)鐘的生成(js手寫(xiě)簡(jiǎn)潔代碼)
在生成時(shí)鐘的過(guò)程中自己想到布置表盤(pán)的寫(xiě)法由這么幾種:
當(dāng)然利用那種模式都可以實(shí)現(xiàn),所以我們要用一個(gè)最好理解,代碼有相對(duì)簡(jiǎn)便的方法實(shí)現(xiàn)
1、利用三角函數(shù)
用js在三角函數(shù)布置表盤(pán)的過(guò)程中有遇見(jiàn)到這種情況:是在表盤(pán)的刻度處,利用三角函數(shù)計(jì)算具體的值時(shí)不能得到整數(shù),需要向上或者向下取整,這樣無(wú)形中就會(huì)存在些許偏差,而且這樣的偏差難利用樣式來(lái)調(diào)整到位,即使最終效果都可以實(shí)現(xiàn),但是細(xì)微處的縫隙和角度的偏差都會(huì)影響整體的視覺(jué)體驗(yàn),作為一名程序開(kāi)發(fā)人員,這樣的視覺(jué)體驗(yàn)很難讓別人認(rèn)可,放棄。
2、利用遮罩層
js利用遮罩層,主要還是在表盤(pán)的刻度處,表盤(pán)的刻度有長(zhǎng)和短,每5個(gè)刻度都有一根較長(zhǎng)的刻度,這樣我們利用遮罩層遮住的刻度的長(zhǎng)短都是一致的,很難繼續(xù)調(diào)整其余的刻度所以也放棄。
3、利用定位以及(父子級(jí)關(guān)系)(推薦)
利用定位以及父子級(jí)關(guān)系的方法我覺(jué)得最好理解和上手,在這里為大家分享一下。下面是實(shí)現(xiàn)代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style media="screen"> * { margin: 0; padding: 0; } #clock { width: 600px; height: 600px; border: 4px solid lightgray; margin: auto; position: relative; border-radius: 50%; } #scale { width: 20px; height: 100%; position: absolute; left: 50%; margin-left: -10px; /*background: green;*/ } #point { width: 4px; height: 10px; background: lightgray; margin: auto; } #number { width: 20px; height: 20px; margin-top: 5px; /*background: red;*/ font-size: 20px; text-align: center; line-height: 20px; } #hour { width: 12px; height: 180px; background: red; border-radius: 6px; transform-origin: 50% 150px; position: absolute; top: 150px; left: 50%; margin-left: -6px; } #minute { width: 8px; height: 250px; background: orange; position: absolute; border-radius: 4px; transform-origin: 50% 200px; top: 100px; left: 50%; margin-left: -4px; } #second { width: 4px; height: 360px; background: red; border-radius: 2px; position: absolute; top: 0; left: 50%; margin-left: -2px; transform-origin: 50% 300px; z-index: 100; } </style> </head> <body> <div id="clock"> <div id="hour"> </div> <div id="minute"> </div> <div id="second"> </div> </div> </body> <script type="text/javascript"> var clock = document.getElementById('clock'); var hour = document.getElementById('hour'); var minute = document.getElementById('minute'); var second = document.getElementById('second'); function surface() { var currentDate = new Date(); var hours = currentDate.getHours(); var minutes = currentDate.getMinutes(); var seconds = currentDate.getSeconds(); seconds = hours * 3600 + minutes * 60 + seconds; hour.style.transform = 'rotate('+seconds / 120+'deg)'; minute.style.transform = 'rotate('+seconds * 0.1+'deg)'; second.style.transform = 'rotate('+seconds * 6+'deg)'; } setInterval('surface()', 1000); for (var i = 1; i < 61; i++) { var scale = document.createElement('div'); scale.id = 'scale'; scale.style.transform = 'rotate('+i * 6+'deg)'; clock.appendChild(scale); var point = document.createElement('div'); point.id = 'point'; scale.appendChild(point); var number = document.createElement('div'); number.id = 'number'; number.style.transform = 'rotate(-'+i * 6+'deg)' if (i % 5 == 0) { number.innerHTML = i / 5; point.style.height = '15px'; } scale.appendChild(number); } </script> </html>
校正中需要注意:
1、以下是分步實(shí)現(xiàn)的效果圖,最后做到細(xì)節(jié)處緊密貼合,不用其他的方法在對(duì)她進(jìn)行微調(diào),當(dāng)樣式布局全部完成之后就可以獲取當(dāng)前的時(shí)間加以校正,在校正的過(guò)程中有這樣一個(gè)問(wèn)題,希望大家能注意: 時(shí)針的轉(zhuǎn)動(dòng)角度不能以小時(shí)為單位來(lái)計(jì)算,例如:9:58 這時(shí)的時(shí)針指的位置是9,當(dāng)10 :00 時(shí),時(shí)針以下跳轉(zhuǎn)到10的位置,所以時(shí)針的角度要以分鐘或者秒來(lái)計(jì)算,分針的角度跳轉(zhuǎn)要以分鐘或者秒來(lái)計(jì)算,秒針就是每秒跳轉(zhuǎn)6度。
2、還有一點(diǎn)要注意,三個(gè)指針的轉(zhuǎn)動(dòng)圓心問(wèn)題,利用transform-origin 來(lái)定指針轉(zhuǎn)動(dòng)點(diǎn)一定要定準(zhǔn)
以上這篇淺談時(shí)鐘的生成(js手寫(xiě)簡(jiǎn)潔代碼)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
微信小程序?qū)崿F(xiàn)簡(jiǎn)易的計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡(jiǎn)易的計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09JS簡(jiǎn)單獲取當(dāng)前日期時(shí)間的方法(如:2017-03-29 11:41:10 星期四)
這篇文章主要介紹了JS簡(jiǎn)單獲取當(dāng)前日期時(shí)間的方法,涉及javascript針對(duì)當(dāng)前日期時(shí)間的簡(jiǎn)單運(yùn)算操作,需要的朋友可以參考下2017-03-03微信小程序?qū)崿F(xiàn)form表單本地儲(chǔ)存數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)form表單本地儲(chǔ)存數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06JS簡(jiǎn)單實(shí)現(xiàn)浮動(dòng)窗口效果示例
這篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)浮動(dòng)窗口效果,涉及javascript操作浮動(dòng)窗口的創(chuàng)建、打開(kāi)、關(guān)閉等相關(guān)操作技巧,需要的朋友可以參考下2016-09-09返回頁(yè)面頂部top按鈕通過(guò)錨點(diǎn)實(shí)現(xiàn)(自寫(xiě))
用戶(hù)在使用系統(tǒng)時(shí),會(huì)有很多表單的操作然而很多表單就會(huì)很長(zhǎng),所以就需要一個(gè)返回頁(yè)面頂部的top按鈕啦,于是自己寫(xiě)了一個(gè),喜歡的朋友可以參考下2013-08-08javascript中的糖衣語(yǔ)法Promise對(duì)象詳解
這篇文章主要介紹了javascript中的糖衣語(yǔ)法Promise對(duì)象詳解,Promise 對(duì)象代表了未來(lái)將要發(fā)生的事件,用來(lái)傳遞異步操作的消息,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07基于bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索功能
這篇文章主要為大家詳細(xì)介紹了基于bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07js針對(duì)ip地址、子網(wǎng)掩碼、網(wǎng)關(guān)的邏輯性判斷
這篇文章主要介紹了js針對(duì)ip地址、子網(wǎng)掩碼、網(wǎng)關(guān)的邏輯性判斷,感興趣的小伙伴們可以參考一下2016-01-01