44_Custom Range Slider
๐ป ์ฃผ์ : 0 ~ 100๊น์ง ์ฌ์ฉ์๊ฐ ๋ฒ์ ๊ฐ์ ์กฐ์ ํ ๋๋ง๋ค "input" ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉฐ, ์ด๋ฅผ ํ์ฉํ์ฌ ๋ ์ด๋ธ์ ์์น์ ๋ด์ฉ์ ์ ๋ฐ์ดํธ ํจ.
const range = document.getElementById('range')
range.addEventListener('input', (e) => {
// ์ซ์๋ก ๋ณํํ๊ธฐ ์ํด ์์ +๋ฅผ ๋ถ์
// e.target์ input
const value = +e.target.value
// e.target์ ๋ค์ ํ์ ๋ label์
const label = e.target.nextElementSibling
const range_width = getComputedStyle(e.target).getPropertyValue('width')
const label_width = getComputedStyle(label).getPropertyValue('width')
//2๋ p,x
const num_width = +range_width.substring(0, range_width.length - 2)
const num_label_width = +label_width.substring(0, label_width.length - 2)
const max = +e.target.max
const min = +e.target.min
const left = value * (num_width / max) - num_label_width / 2 + scale(value, min, max, 10, -10)
label.style.left = `${left}px`
label.innerHTML = value
})
// https://stackoverflow.com/questions/10756313/javascript-jquery-map-a-range-of-numbers-to-another-range-of-numbers
const scale = (num, in_min, in_max, out_min, out_max) => {
return (num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
๋ ์ด๋ธ(label)์ ์์น๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด width๋ฅผ ์์์ผ ํจ. ํด๋น ์ฝ๋์์ "range" ์ ๋ ฅ ์์์ ๊ฐ์ ์กฐ์ ํ๋ฉด, ๋ ์ด๋ธ์ ์์น๋ฅผ ํด๋น ๊ฐ์ ๋ง์ถ์ด ์กฐ์ ๋์ด์ผ ํ๋ค. ๋ ์ด๋ธ์ด ์ด๋์ ์์นํด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ์ width๋ฅผ ์ฌ์ฉํ๋ค.
range_width์ label_width๋ฅผ ๊ฐ์ ธ์์ ๊ฐ๊ฐ "range" ์์์ "label" ์์์ ๋๋น๋ฅผ ๊ตฌํ๋ค.
์ด๋ ๊ฐ์ ธ์จ ๋๋น ๊ฐ์ "px" ๋จ์๋ฅผ ํฌํจํ๋ฏ๋ก ์ซ์๋ง ์ถ์ถํ์ฌ num_width์ num_label_width ๋ณ์์ ์ ์ฅํ๋ค.
getComputedStyle
JavaScript์ DOM(Document Object Model)์์ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ก, ์น ํ์ด์ง์์ ์ค์ ๋ก ํ์๋๋ ์์์ ๊ณ์ฐ๋ ์คํ์ผ์ ๊ฐ์ ธ์จ๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด CSS ์คํ์ผ ๊ท์น์ด ์ ์ฉ๋ ํ์ ์์์ ์คํ์ผ ๊ฐ์ ์ป์ ์ ์๋ค.
value, max, min, num_width, num_label_width๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ด๋ธ์ ์์น๋ฅผ ๊ณ์ฐํ๋ค.
value * (num_width / max)
ํ์ฌ "range" ์
๋ ฅ ์์์ ๊ฐ์ ์ต๋ ๊ฐ(max)์ผ๋ก ๋๋ ๋น์จ์ ๊ณ์ฐํ๋ค. ์ด ๋น์จ์ ์
๋ ฅ ๊ฐ์ด ์ต๋ ๊ฐ์ ๋ํด ์ผ๋ง๋ ํฐ์ง๋ฅผ ๋ํ๋ธ๋ค. ์ด ๋น์จ์ 0๋ถํฐ 1 ์ฌ์ด์ ๊ฐ์ด ๋ฉ๋๋ค.
num_label_width / 2
๋ ์ด๋ธ์ ๋๋น(num_label_width)๋ฅผ ๋ฐ์ผ๋ก ๋๋ ๊ฐ. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ๋ ์ด๋ธ์ด "range" ์
๋ ฅ ์์์ ์ค๊ฐ ์์น๋ฅผ ์ค์ฌ์ผ๋ก ๋ฐฐ์น๋๋ค.
scale(value, min, max, 10, -10)
์
๋ ฅ ๊ฐ์ ์
๋ ฅ ๋ฒ์(min์์ max)์์ ์ถ๋ ฅ ๋ฒ์(10์์ -10)๋ก ๋ณํํ๋ scale() ํจ์๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ๋ณํ์ ์ํํ๋ค.
๐๐ป"range" ์ ๋ ฅ ๊ฐ์ ๋ฐ๋ผ ๋ ์ด๋ธ์ ์์น๋ฅผ ๊ณ์ฐํ๊ณ , ๊ทธ ์์น๋ฅผ style.left ์์ฑ์ ์ฌ์ฉํ์ฌ ์กฐ์ ํจ์ผ๋ก์จ ์ฌ์ฉ์๊ฐ ์ ํํ ๊ฐ์ ๋ฐ๋ผ ๋ ์ด๋ธ์ด ์์ง์ด๊ฒ ๋๋ค.