Todo list ์ปจํ ์คํธ์ ์ฐธ๊ฐํ๊ธฐ ์ํด ์์ํ ๋ฐ๋๋ผ ์๋ฐ์คํํธ ํ๋ก์ ํธ
(21๋ ๋น์ ๊นํ๋ธ)
๋ฌด๋ ค ๐์ธ๊ธฐ์์ ๋น์ฒจ์ด ๋์๋ค! (์นํจ ๊ฐ์ฌํฉ๋๋ค!)
์ด ํ๋ก์ ํธ์ ํฌํํด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ์ด ์๋ฆฌ๋ฅผ ๋น๋ ค ๊ฐ์ฌ์ ๋ง์์ ๋๋ฆฐ๋ค.
Only Javascript
์๋ ํํฐ๋ ์ผ์ฒด ์ฌ์ฉํ์ง ์์๋ค. (๋ ธ๋ ์ฒจ๊ฐ์จ 0%)
์ดํ๋ ํ์ฌ ๋ชจ๋ ๊ตฌํ๋ ๊ธฐ๋ฅ๋ค์ด๋ค.
๋ชจ๋ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก LocalStorage
์ ์ ์ฅ๋๋ค.
ํผ์น๊ธฐ/์ ๊ธฐ
-
Display name ์ค์ (์ต์ด 1ํ) ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
๋ก๊ทธ์์(๋ฐ์ดํฐ ์ด๊ธฐํ)
-
์นด๋ ์์ฑ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
์นด๋ ์ญ์ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
์นด๋ ์์ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
์นด๋ ๊ฒ์(๊ธฐ์ค: ์นด๋ ๋ด์ฉ)
-
์นด๋ ์ํ๋ณ๊ฒฝ (
Todo
-Complete
) ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ -
์นด์ดํธ ๋ค์ด(์ต๋ 24์๊ฐ)
-
์นด๋ ์ต์๋จ ๊ณ ์ ๊ธฐ๋ฅ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
๊ฐ ์นด๋์ ํด์ํ๊ทธ ๋ถ์ฌ ๊ฐ๋ฅ(๊ฐ์ ์ ํ X) ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
ํด์ํ๊ทธ ํํฐ๋ง ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
ํ๊ทธ ์ ์์ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
ํ๊ทธ ์ญ์ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
๊ฐ์ข ๋ฉ๋ด
-
Todo ์ง์ฒ๋ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
-
ํ๋กํ ์จ๊ธฐ๊ธฐ ๊ฐ๋ฅ ย ๋ฏธ๋ฆฌ๋ณด๊ธฐ
- ๋๋ฐ์ด์ค ๋์ด๋ฅผ ๊ณ ๋ คํ์ฌ ์๋์ผ๋ก ํ๋กํ์ด ์จ๊ฒจ์ง(๋๋ฐ์ด์ค ๋์ด 1000px ๋ฏธ๋ง ์)
- ์ธ์ด ๋ณ๊ฒฝ ์ง์(ํ๊ตญ์ด, ์์ด)
-
ํ๋ก์ ํธ ์์ ๐ 2021๋ 2์ 2์ผ
-
ํ๋ก์ ํธ ์ข ๋ฃ ๐ 2021๋ 2์ 10์ผ
๋๋ต ์ผ์ฃผ์ผ ๋จ์ง ๊ฑธ๋ ธ๋ค.
- ๊ตฌํํ๋ฉด์ ๊ฐ์ฅ ํ๋ค์๋ ์์๋ ์ด๋ฒคํธ > ํด์ํ๊ทธ ๊ตฌํ > ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ์ ํ > ๋๋จธ์ง ์๋ค.
- ์ง๊ธ๋ณด๋ฉด ์ง์ง ์๋ฌด๊ฒ๋ ๋ชจ๋ฅผ ๋ ๋ง๋ ํ๋ก์ ํธ์ธ๋ฐ ์ด๋ป๊ฒ ์ด๋ฐ๊ฑฐ ๋ง๋ค์๋ ์ถ๊ธด ํ๋ค. ์ํผ์ ๊ฐ์ ๋ฃ์๊ฒ ์ง?
- ์ด์ ๊ตฌํํ ๋ ๊ฐ์ฅ ํ๋ ์์๊ฐ ๊ฑฐ๊พธ๋ก ๋์๋๋ฐ, ์ด์ ์ด ๋์ณค๋ ๊ฒ ๊ฐ๋ค ใ ใ ใ
- ์์ฌ์ด ๋ถ๋ถ์ด ๊ต์ฅํ ๋ง์ด ๋์ ๋๋ค. UI๋ถํฐ ์์ํด์... ํนํ ํด๋ฆฐ ์ฝ๋๊ฐ ๋๋ฌด ๋ถ์กฑํ๋ค. ๊ทผ๋ฐ ์ด์ฐ ๋์๊ฐ๋ ๊ฒ ๋ ์ ๊ธฐํ๋ค.
LocalHost
์ ์ ์ฅ๋ ์นด๋์ ์ ๊ทผํ๊ธฐ ์ํ ์๋ณ์๋ก ๊ฐ ์นด๋ ๋ฐ์ดํฐ์ ID๋ฅผ ๋ถ์ฌํ๊ธฐ๋ก ํ๋ค.
๊ทธ๋ฌ๋ ID๋ฅผ ์ด๋ค ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ง ๊ณ ๋ฏผ์ด ๋์๋ค.
๋จ์ํ๊ฒ ๋ ์ฌ๋ฆฐ ์๊ฐ์ผ๋ก๋
1. ID๋ฅผ ์ค๋ณต๋์ง ์๋ 1, 2, 3, 4... ๋ก ๋ถ์ฌํ์.
2. ํด์ํจ์์ ์นด๋์ ํ
์คํธ๋ฅผ ๋ฃ์ด์ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ID๋ก ์ฌ์ฉํ์.
๊ฐ ์์๋ค.
๊ทธ๋ฌ๋ ์ด ๋ ๋ฐฉ๋ฒ์ ์ ๋ถ ์น๋ช ์ ์ธ(?) ๋จ์ ์ด ์กด์ฌํ๋ค.
- 1๋ฒ์ ID๋ฅผ ๋ถ์ฌํ๋ ๊ตฌ์กฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ง๊ฒ ๋๋ฉด ๋ก์ง์ด ๋งค์ฐ ๋ณต์กํด์ง๋ค๋ ๊ฒ(+ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ฉํด์ผ ํจ), ๋จ์ํ๊ฒ ์ง ๋ค๊ณ ํ๋๋ผ๋ ์นด๋๋ฅผ ๋ง์ด ์์ฑํ๋ค๋ฉด ID์ ํฌ๊ธฐ๊ฐ ๋ฌดํํ ์ปค์ง๋ค๋ ๊ฒ.
- 2๋ฒ์ ๊ฐ์ ํ ์คํธ๋ฅผ ๊ฐ์ง ์นด๋๊ฐ ์กด์ฌํ๋ค๋ฉด, ์ ์ผํ ID๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค๋ ์ .
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๋ง ์ข์ ์์ด๋์ด๋ฅผ ๋ ์ฌ๋ ธ๋ค.
- 10๊ธ์์ ๋๋คํ
Salt
๋ฅผ ์์ฑํ๋ค.
getSalt: () => {
let salt = "";
for (let i = 0; i < 10; i++) {
if (Math.random() > 0.5) {
const ascii = Math.floor(Math.random() * 26) + 97;
const c = String.fromCharCode(ascii);
salt += c;
} else {
salt += Math.floor(Math.random() * 10);
}
}
return salt;
},
- Hash ํจ์๋ฅผ ๋ง๋ค์๋ค. 32bit์ ์ ์๋ก ๋ณํํ๋ ํจ์์ด๋ค.
createHash(str) {
let hash = 0;
let chr;
for (let i = 0; i < str.length; i++) {
chr = str.charCodeAt(i);
hash = (hash << 5) - hash + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
},
- ์นด๋ ํ
์คํธ์
Salt
๋ฅผ ๊ฒฐํฉํ์ฌ ๊ณ ์ ํ ID๋ฅผ ์์ฑํ๋ค!
const toConvert = card.text + getSalt();
const id = createHash(toConvert); // Unique ID!
๊ทธ๋ฅ ํ์ฌ ์๊ฐ์ ms๋ก ๋ณํํด์ ๊ทธ๊ฑฐ๋ฅผ ์์ด๋๋ก ์จ๋ ๊ด์ฐฎ์์๋ฏ ํ๋ค..
์นด๋ ์์ฑ, ์นด๋ ์์ , ํด์ํ๊ทธ ํํฐ๋ง ๋ฑ๋ฑ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ๊ฐ์ Modal์ ์ฌ์ฌ์ฉํ๊ณ ์ถ์๋ค.
React
๋ผ๋ฉด state๋ฅผ ์ด์ฉํด ์์ฝ๊ฒ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ฐ๋๋ผ๋ผ ๊ทธ๋ ๊ธฐ๋ ํ๋ค์๋ค.
- modal Class์
setState
๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ค.
setState(nextData) {
this.data = nextData;
... ์ค๋ต
this.renderModal();
}
renderModal
๋ฉ์๋์์this.data
๋ฅผ ์ด์ฉํด modal์ ํ์ํ ๋ถ๋ถ๋ง ์ฌ๋ ๋๋งํ๋ค.
renderModal() {
const {
title,
...์๋ต,
} = this.data;
// modal์ title ์ฌ๋ ๋๋ง
const $modalTitle = this.$modalContainer.querySelector(
".modal-content__title"
);
$modalTitle.textContent = title;
... ์ค๋ต
}
๊ฐ๋ น, ์๋์ ๊ฐ์ด ๋ฐ์ ์์ผ๋ก ํ๊ทธ์ ์์ด ์ค์ ๋์ด ๋ฒ๋ฆฌ๋ฉด ํ๊ทธ์ ํ ์คํธ๊ฐ ๋ณด์ด์ง ์์๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ์ ํ
์คํธ์ ์์ ์ด๋ก๊ฒ ๋ง๋๋ ๋ก์ง์ ์ถ๊ฐํ ๊น ๊ณ ๋ฏผํ์ง๋ง,
๋ก์ง์ด ๋ณต์กํด์ง ๊ฒ ๊ฐ์๊ณ ์ด๊ฒ์ด ํจ์จ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ ๊ฒ ๊ฐ์๋ค.
๊ทธ๋ฌ๋ค ์ข์ ์์ด๋์ด๋ฅผ ๋ฐ๊ฒฌํ๋ค.
โ ํ๊ทธ ์์ฑ์, ํ๊ทธ ๋ฐฐ๊ฒฝ์์ alpha ๊ฐ์ ์๋์ ์ผ๋ก ๋ฎ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ค.
์ด๊ฒ์ด ๋งค์ฐ ํจ๊ณผ์ ์ด์๋ ์ด์ ๊ฐ ์๋ค.
1. ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ ํธ๋ ๋คํฌ๋ชจ๋์ด๊ธฐ ๋๋ฌธ์, alpha ๊ฐ์ ๋ฎ๊ฒ ์ค์ ํ๋ฉด ๊ทธ๋งํผ ํ๊ทธ์ ์๋ ์ด๋์์ง๋ค.
2. ํ๊ทธ์ ํ
์คํธ๊ฐ ํ๊ทธ ๋ฐฐ๊ฒฝ์์ ๋นํด ์๋์ ์ผ๋ก ์ด๋์์ง๋ค.
๋ค์์ ํ๊ทธ ๋ฐฐ๊ฒฝ์์ alpha๊ฐ์ ๋ฐ๋ฅธ ํ๊ทธ์ ๋ชจ์ต์ด๋ค.
alpha=1 | alpha=0.6 | alpha=0.2 |
---|---|---|
์ ๋ง ๊ฐ๋จํ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค!
(2๋ ํ ์ ๋ฐ์ดํธ) HSL ์ปฌ๋ฌ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ ํค์ผ๋ก ๋ ๋๋งํ๋ฉด opacity๋ฅผ ๋ฎ์ถ ํ์๊ฐ ์๋ค.
๋ฌธ์ ๋ ๋ผ์ดํธ๋ชจ๋์์๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ๋ ๊ฒ์ด๋ค.
๋ถ๋ช
opacity๋ง์ผ๋ก๋ ํ๊ณ๊ฐ ์์ ๊ฒ์ด๋ค.
๊ทธ๋์ ์๊ฐํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด RGB ๋์ HSL ์ปฌ๋ฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
Hue ๊ฐ์ ๋ฒ์๋ฅผ ์ ์ฒด๋ก ๋๊ณ ,
Saturation์ ๋ฒ์๋ฅผ ๋๋ต 55 ~ 60%,
Lightness์ ๋ฒ์๋ฅผ ๋๋ต 75 ~ 85%
์ ๋๋ก ํด๋๊ณ ๋๋ค์ผ๋ก ๋ ๋๋งํ๋ฉด ๋ฐ์ ํค์ ํ์คํ ์์์ด ๋์จ๋ค.
์ด ๋ฐฉ๋ฒ์ ๋ ์ฌ๋ฆฌ๊ณ , ๊ฐ์ ๋ฐฉ์์ ํ๊ทธ ์์ฑ์ ์ด ํ๋ก์ ํธ์ ์ ์ฉํ์๋ค.
์ด๋ฅผ ์ ์ฉํ๊ธฐ ์ ์, ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ๋๋ถ๋ถ์ Stackoverflow, ๋ธ๋ก๊ทธ, ํฌ์คํธ ๋ฑ์์ setTimeout
์ ์ฌ์ฉํจ์ ์๊ฒ๋์๋ค.
์๋ฅผ ๋ค์ด,
/* CSS */
.element {
... ์ค๋ต
opacity: 0;
animation: customAnimation 0.5s linear forwards;
}
@keyframes customAnimation {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
// JS
const element = document.querySelector(".element");
// ์ ๋๋ฉ์ด์
์ข
๋ฃ (css์ ๋ง์ฐฌ๊ฐ์ง๋ก 0.5์ด๋ก ์ค์ )
setTimeout(whenAnimationEnd, 500);
์ฒ๋ผ ๋ง์ด๋ค.
๊ทธ๋์ ๋น์ฐํ ์ด๊ฒ์ด ์ ์์ ์ธ ๋ฐฉ๋ฒ์ธ์ค ์๊ณ ์์๋ค.
// JS
const element = document.querySelector(".element");
// ์ ๋๋ฉ์ด์
์ข
๋ฃ์ด๋ฒคํธ
element.addEventListener("animationend", whenAnimationEnd);
์ด๊ฒ์ ์๊ฒ๋ ํ ๋ฉํ์ด ๋๊ฐ ๋ปํ๋ค. ๐ญ๐ญ
๋ถ์กฑํ ๋ด ๊ฒ์๋ฅ๋ ฅ์ ํํ๋ค.