Navigate back to the homepage

Day2: JS and CSS Clock

JavaScript30
June 15th, 2021 · 1 min read

專案介紹: 實作一個時鐘。

作品頁面: https://iris1114.github.io/javascript30/02_JS-and-CSS-Clock/index.html

1. 做法:

  • 取得目前時、分、秒
  • 取得時、分、秒角度
  • 再去改變時、分、秒 style transform
  • 初始執行 及 每秒再去執行

2. 取得時、分、秒角度

這個是我覺得最混亂的部分,因為我數學不太好 XD 紀錄一下計算方法:

1const secondsDegrees = seconds * 6; // (360度/60秒= 1秒6度 )
2const minsDegrees = mins * 6 + (seconds * 6) / 60; //(360度/60分鐘= 1分鐘6度 ,目前分鐘*6度)+ (目前秒*6度/60秒)
3const hourDegrees = hour * 30 + (mins * 30) / 60; //(360度/12小時 = 1小時30度, 目前小時*30度)+(目前分鐘*30度/60分鐘)

在時針的部分,為什麼還要加後面的 (mins * 30 / 60) 呢?

因為當目前時間為 1145 時,時針也會趨近 12 的方向,所以需加入(目前分鐘*30 度/60 分鐘),讓時針跟著一起動,而不會一直只指向 11 點。

3. setInterval & setTimeOut & requestAnimationFrame

setInterval : 固定延遲了某段時間之後,才去執行對應的程式碼,然後「不斷循環」

setTimeOut: 是在延遲了某段時間 (單位為毫秒) 之後,才去執行「一次」指定的程式碼

requestAnimationFrame() :通知瀏覽器我們想要產生動畫,並且要求瀏覽器在下次重繪畫面前呼叫特定函數更新動畫。處理畫面更新的 setTimeOut。

4. code

1(() => {
2 const hourHand = document.querySelector(".hour-hand");
3 const minsHand = document.querySelector(".min-hand");
4 const secondsHand = document.querySelector(".second-hand");
5
6 const setTime = () => {
7 const now = new Date();
8 const seconds = now.getSeconds();
9 const mins = now.getMinutes();
10 const hour = now.getHours();
11
12 const secondsDegrees = seconds * 6; // (360度/60秒= 1秒6度 )
13 const minsDegrees = mins * 6 + (seconds * 6) / 60; //(360度/60分鐘= 1分鐘6度 ,目前分鐘*6度)+ (目前秒*6度/60秒)
14 const hourDegrees = hour * 30 + (mins * 30) / 60; //(360度/12小時 = 1小時30度, 目前小時*30度)+(目前分鐘*30度/60分鐘)
15
16 secondsHand.style.transform = `rotate(${secondsDegrees}deg)`;
17 minsHand.style.transform = `rotate(${minsDegrees}deg)`;
18 hourHand.style.transform = `rotate(${hourDegrees}deg)`;
19 };
20
21 setInterval(setTime, 1000);
22 setTime(); //初始化畫面
23})();

5. 參考資料

https://developer.mozilla.org/zh-TW/docs/Web/CSS/transform https://kuro.tw/posts/2019/02/23/%E8%AB%87%E8%AB%87-JavaScript-%E7%9A%84-setTimeout-%E8%88%87-setInterval/ https://developer.mozilla.org/zh-TW/docs/Web/API/window/requestAnimationFrame

More articles from Iris Blog

挑戰 JavaScript 30 Day1

自從疫情警戒第三級後 ​,待在家除了作息不正常外,也沒做什麼營養的事 (大概就一直看劇滑手機)。最近終於覺得這樣下去不行,開始實施了「10 億早晨習慣」,

June 13th, 2021 · 1 min read

Observer 好強大 - IntersectionObserver 筆記

昨天上班接到一個需求是當畫面滑動到某個位置的時候,送出 GA 事件。菜菜的我只想到用 scroll 來監聽去算 offsetTop 等等

December 1st, 2020 · 1 min read
© 2020–2021 Iris Blog
Link to $mailto:qweichew@gmail.comLink to $https://github.com/iris1114Link to $https://www.instagram.com/iris.justdoit/Link to $https://www.linkedin.com/in/iris-chew