โ HTML CSS Js SVG ์๊ณ ๐
๋ช ๊ฐ์ง ํต์ฌ ์ฌํญ๋ง ์ผ๋์ ๋๋ฉด ๊ทธ๋ฆฌ ๋ณต์กํ์ง ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก svg circle ์ด๋ฏธ์ง๋ฅผ Html ํ์ด์ง์ ์ง์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
<div class="clock-container flex">
ย <svg class="svg-seconds" width="24px" height="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.486 2 2 6.486 2 12s4.486 10 10 10 10-4.486 10-10S17.514 2 12 2z"/></svg>
ย <svg class="svg-minutes" width="24px" height="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.486 2 2 6.486 2 12s4.486 10 10 10 10-4.486 10-10S17.514 2 12 2z"/></svg>
ย <svg class="svg-hours" width="24px" height="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2C6.486 2 2 6.486 2 12s4.486 10 10 10 10-4.486 10-10S17.514 2 12 2z"/></svg>
ย ย
ย ย <div class="time-box">
ย ย ย ย ย ย <div class="time">00:00:00</div>
ย ย </div>
</div>
์ด๊ฒ์ด ์ค์ ๋ก ํ์ํ ๋ชจ๋ HTML ์ฝ๋์ ๋๋ค.
Css ๋ถ๋ถ์ ๊ฒฝ์ฐ ์๊ฐ ์์ div์ ์๋์ ์ธ ์์น๋ฅผ ์ง์ ํด์ผ ํ๋ฏ๋ก Svg ์์ ๊ทธ ์์ ์ ๋์ ์ผ๋ก ๋ฐฐ์นํ ์ ์์ต๋๋ค.
.time-box{
ย ย position: relative;
...
}
/* SVGS ย */
svg.svg-seconds{ ย
ย ย position: absolute;
ย ย width: 360px;
ย ย height: 360px;
ย ย fill: var(--second);
ย ย stroke: var(--third);
ย ย stroke-width: 0.5;
ย ย stroke-dasharray: 63;
}
svg.svg-minutes{ ย
ย ย position: absolute;
ย ย width: 330px;
ย ย height: 330px;
ย ย fill: transparent;
ย ย stroke: var(--fourth);
ย ย stroke-width: 0.6;
ย ย stroke-dasharray: 63;
}
svg.svg-hours{ ย
ย ย position: absolute;
ย ย width: 270px;
ย ย height: 270px;
ย ย fill: transparent;
ย ย stroke: var(--seventh);
ย ย stroke-width: 3;
ย ย stroke-dasharray: 63;
}
๋์ javascript ๋ถ๋ถ์ ๊ฒฝ์ฐ Svg ์์ ์คํธ๋กํฌ๋ฅผ ๋ณ๊ฒฝํ๊ณ ์๊ฐ ๋ฌธ์์ด์ ๋ฐํํ๋ ๊ฐ๋จํ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
// TIME FN
function timeFn (){
ย ย let time = new Date();
ย ย let hours = addZero(time.getHours());
ย ย let minutes = addZero(time.getMinutes());
ย ย let seconds = time.getSeconds().toString().padStart(2,0);
ย ย // 4 SVG OFFSET
ย ย secCircle.style.strokeDashoffset = -(63 - (64 * seconds) / 60);
ย ย minCircle.style.strokeDashoffset = -(63 - (64 * minutes) / 60);
ย ย hoursCircle.style.strokeDashoffset = -(63 - (64 * hours) / 24)
ย ย // FULL TIME
ย ย let fullTime = `${hours}:${minutes}:${seconds}`;
ย ย // console.log(fullTime)
ย ย return fullTime;
}
0์ ์ถ๊ฐํ๋ ค๋ฉด ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
function addZero (timeValue) {
ย ย return Number(timeValue) >= 10 ? timeValue : '0'+ timeValue;
};
๋๋ padStart() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ญ์์ค.
.toString().padStart(2,0);
์ด์ ๊ฐ๊ฒฉ์ 1์ด(๊ธฐ๋ณธ๊ฐ)๋ก ์ค์ ํ๊ณ ๋งค๋ฒ time div์ ๋ด๋ถ HTML์ ๋ณ๊ฒฝํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
setInterval(()=> time.innerHTML = timeFn());
์ฌ๊ธฐ์์ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋คgithub.
์ด๊ฒ์ ๊ฐ๋จํฉ๋๋คvideo guide
๐
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(โ HTML CSS Js SVG ์๊ณ ๐), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/alexpaper/html-css-js-svg-clock-43mgํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค