ν°μ€ν 리 λ·°
λ€μκ³Ό κ°μ΄ λ³μ μ νκ°ν μ μλ 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 |