Day 2 - JS and CSS clock VIDEO
START 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" /> <title > JS + CSS Clock</title > </head > <body > <div class ="clock" > <div class ="clock-face" > <div class ="hand hour-hand" > </div > <div class ="hand min-hand" > </div > <div class ="hand second-hand" > </div > </div > </div > <style > html { background: #018ded url(https://unsplash.it/1500/1000?image=881&blur=5); background-size: cover; font-family: "helvetica neue"; text-align: center; font-size: 10px; } body { margin: 0; font-size: 2rem; display: flex; flex: 1; min-height: 100vh; align-items: center; } .clock { width: 30rem; height: 30rem; border: 20px solid white; border-radius: 50%; margin: 50px auto; position: relative; padding: 2rem; box-shadow : 0 0 0 4px rgba (0, 0, 0, 0.1 ), inset 0 0 0 3px #efefef , inset 0 0 10px black , 0 0 10px rgba (0, 0, 0, 0.2 ); } .clock-face { position: relative; width: 100%; height: 100%; transform: translateY( -3px ); } .hand { width: 50%; height: 6px; background: black; position: absolute; top: 50%; } </style > <script > </script > </body > </html >
FINISHED 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" /> <title > JS + CSS Clock</title > </head > <body > <div class ="clock" > <div class ="clock-face" > <div class ="hand hour-hand" > </div > <div class ="hand min-hand" > </div > <div class ="hand second-hand" > </div > </div > </div > <style > html { background: #018ded url(https://unsplash.it/1500/1000?image=881&blur=5); background-size: cover; font-family: "helvetica neue"; text-align: center; font-size: 10px; } body { margin: 0; font-size: 2rem; display: flex; flex: 1; min-height: 100vh; align-items: center; } .clock { width: 30rem; height: 30rem; border: 20px solid white; border-radius: 50%; margin: 50px auto; position: relative; padding: 2rem; box-shadow : 0 0 0 4px rgba (0, 0, 0, 0.1 ), inset 0 0 0 3px #efefef , inset 0 0 10px black , 0 0 10px rgba (0, 0, 0, 0.2 ); } .clock-face { position: relative; width: 100%; height: 100%; transform: translateY( -3px ); } .hand { width: 50%; height: 6px; background: black; position: absolute; top: 50%; transform-origin: 100%; transform: rotate(90deg); transition : all 0.05s ; transition-timing-function : cubic-bezier (0.1 , 2.7 , 0.58 , 1); } </style > <script > const secHand = document .querySelector(".second-hand" ); const minHand = document .querySelector(".min-hand" ); const hourHand = document .querySelector(".hour-hand" ); function setClock ( ) { const now = new Date (); const sec = now.getSeconds(); const secDeg = (sec / 60 ) * 360 + 90 ; secHand.style.transform = `rotate(${secDeg} deg)` ; const min = now.getMinutes(); const minDeg = (min / 60 ) * 360 + (sec / 60 ) * 6 + 90 ; minHand.style.transform = `rotate(${minDeg} deg)` ; const hour = now.getHours(); const hourDeg = (hour / 12 ) * 360 + (min / 60 ) * 30 + 90 ; hourHand.style.transform = `rotate(${hourDeg} deg)` ; } setInterval (setClock, 1000 ); setClock(); </script > </body > </html >
rotate
css 속성을 자주 접하지 않아 난해했다. 아무리 돌려도 중간을 중심으로 침이 돌아가지 않아서 솔루션을 봤는데, css를 수정했어야 했다.
.hand
css 속성에
1 2 3 4 transform-origin : 100%;transform : rotate (90deg );transition : all 0.05s ;transition-timing-function : cubic-bezier (0.1 , 2.7 , 0.58 , 1);
위의 항목을 추가한다. 이 작업만 하면 초마다, 분마다, 시간마다 침이 몇 도(degree
) 움직여야 하는지만 알면 Date()
를 사용하여 현재 초, 분, 시간을 받아올 수 있다. 시계는 1초마다 움직이므로 setInterval(function, 1000)
으로 시계를 움직이는 함수를 작성해서 실행한다.