ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ค์๊ณผ ๊ฐ์ด ๋ณ์ ์ ํ๊ฐํ ์ ์๋ Rating UI๋ฅผ ๊ตฌํํ๊ณ ์ ํ๋ค.
๋ณ์ Container์ ๋ง์ฐ์ค Position ๊ฐ์ ธ์ค๊ธฐ
ํ์ฌ ๋ณ์ UI๋ฅผ ๋ฉํํ๊ณ ์๋ ํด๋์ค๊ฐ stars์ธ ์ปจํ ์ด๋๊ฐ ์ข์ธก์ผ๋ก ์ผ๋ง๋งํผ ๋จ์ด์ ธ ์๋์ง์ ๋ง์ฐ์ค ์ปค์์ ํ์ฌ ์์น ๊ฐ์ ์์์ผ์ง ์ปจํ ์ด๋ ๋ด์์ ํ์ฌ ๋ง์ฐ์ค ์ปค์๊ฐ ์ผ๋ง๋งํผ ์ด๋ํ๋์ง ํ์ ํ ์ ์๋ค.
๋ํ ํ์ฌ ๋ง์ฐ์ค ์ปค์๊ฐ ์ปจํ ์ด๋ ๋ด์์ ์ด๋ํ ๋น์จ์ด ๋ณ์ 0.5์ ๋จ์๋ก ๊ณ์ฐ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด star ์ปจํ ์ด๋ ๋ด์์ ๋ณ์ ๊ฐ๋ก ๋๋น/2์ ๊ฐ์ ํ์ธํด์ผ ๋๋ค.
MouseEvent ์ธํฐํ์ด์ค์ clientX ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ viewport ๋ด์ ์ํ ์ขํ๋ฅผ ์ ๊ณตํ๋ค(ํ์ด์ง ๋ด์ ์ขํ์๋ ๋ฐ๋)
const calculateScore = (e) => {
const { width, left } = e.currentTarget.getBoundingClientRect();
const x = e.clientX - left;
const scale = width / MAX_SCORE / 2;
const score = Math.floor(x / scale + 1) / 2; //์ต์ 0.5๊ฐ๋งํผ ์ ์ ๊ณ์ฐ์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ณ์ฐ ๋ ๋น์จ ๊ฐ์ 1์ ๊ฐ์ฐ
return score;
}
๋ณ์ ์์น ๊ฐ๋งํผ ์ ์ ๊ณ์ฐ
๊ณ์ฐ๋ ๋ง์ฐ์ค ํฌ์ง์ ์ ์์น๊ฐ์ 0.5๋จ์๋ก ์ด๋ํ๊ณ ์ด๋ฅผ ํตํด ์ ์๋ฅผ ํํํ๊ธฐ ์ํด์ ๋ณ์ UI ๋ฐฐ์ด์ ์ํํ๋ฉฐ ๊ฐ ์ธ๋ฑ์ค ๊ฐ๊ณผ ๋น๊ตํด์ค๋ค.
const setDisplayScore = (score) => {
const starList = Array.from($stars.children);
starList.forEach((star, i) => {
if(score > i) { //ํ์ฌ ๋ง์ฐ์ค ์์น๊ฐ ๊ฐ ์ธ๋ฑ์ค ๊ฐ๋ณด๋ค ํด ๊ฒฝ์ฐ์๋ง ๋ณ UI๋ฅผ ์ฑ์
if(score - i === 0.5) {
star.className = 'star half';
} else {
star.className = 'star full';
}
} else {
star.className = 'star empty';
}
})
}
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์์ ๋์ ์ธ ์์น๊ฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ์คํฌ๋กค์ด ์๋๋ ๋ฌธ์ _element.scrollintoView() (0) | 2021.09.07 |
---|---|
๋นํธ ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์ด์ง์ ๊ฐํธํ๊ฒ ๊ตฌํ๊ธฐ (0) | 2021.09.04 |
๋ฐฑ์ค node.JS ์ ์ถ๋ ฅ ๊ด๋ฆฌ (0) | 2021.08.22 |
rxjs tap operator๋ฅผ ํตํ side-effect (0) | 2021.08.03 |
axios Intercept requests_API ์์ฒญ ์ฒ๋ฆฌ ๋์ UI ์์ ๋ณด์ฌ ์ฃผ๊ธฐ (0) | 2021.08.03 |