ν‹°μŠ€ν† λ¦¬ λ·°

JS

별점 UI

choi95 2021. 8. 28. 14:36

λ‹€μŒκ³Ό 같이 별점을 평가할 수 μžˆλŠ” 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';
    }
  })
}

 

λŒ“κΈ€
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
TAG
more
Β«   2025/01   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
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
κΈ€ 보관함