๋ฌธ์ window.addEventListener('scroll', () => { box.style.width = `${window.pageYOffset}px`; }); ๋ค์๊ณผ ๊ฐ์ด ์คํฌ๋กค๋ Window.pageYoffset๊ฐ ๋งํผ ์์์ ๋ฐ์ค ์์์ ๊ฐ๋ก ๋๋น๋ฅผ ๋์ ์ผ๋ก ๋์ด๋๊ฒ ์ฝ๋๋ฅผ ์์ฑํ์๋ค. ํ๋ฉด์ ๋๋๋ง๋ ์์์ ๋ฐ์ค์ ๊ฐ๋ก ๋๋น๊ฐ ๋์ด๋๋ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ ์ธ๋ป ๋ณด๋ฉด ์์ฐ์ค๋ฌ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์คํฌ๋กค์ ๋ฐฉํฅํค๋ฅผ ํตํด ๋ด๋ ค๋ณธ๋ค๋ฉด ๋ค์ ๋ถ์์ฐ์ค๋ฝ๊ฒ ๋๊ธฐ๋ ๊ฑฐ๋ฅผ ํ์ธํ ์ ์๋ค. ์ด๋ฌํ ํ์์ ํด๊ฒฐํ๊ธฐ ์ํด์ requestAnimationFrame์ ๋์ ์๋ฆฌ๋ฅผ ์ดํด๋ณด๊ณ ๊ตฌํํด ๋ณด๊ณ ์ ํ๋ค. requestAnimationFrame https://developer.mozilla.org/ko/docs/..
๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฆฌ์คํธ ํญ๋ชฉ์ JS ์์์ ๋์ ์ผ๋ก ์ถ๊ฐ๋๊ฒ๋ ๊ตฌํํ์๋ค. ํ์ง๋ง ๋ฆฌ์คํธ ํญ๋ชฉ์ด ํ์ฌ ์์ ์์์ view๋ฅผ overflowํ๊ฒ ๋๋ฉด ์๋กญ๊ฒ ์ถ๊ฐ๋ ํญ๋ชฉ์ผ๋ก ์คํฌ๋กค ๋ทฐ๊ฐ ์๋์ผ๋ก ๋ง์ถฐ์ง์ง ์๋ UX์ ์ผ๋ก ๋ถํธํจ์ด ๋ฐ์ํ์๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฒ์์๋ scrollElement์ scrollTop์ ์๋์ ์์น ๊ฐ์ ์ด์ฉํ์์ง๋ง ์ด๋ณด๋ค ๋ ๊ฐํธํ๊ฒ ํน์ ์์ ์์น๋ก ์คํฌ๋กค ๋ทฐ๋ฅผ ์ด๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด ํฌ์คํ ํ๊ณ ์ ํ๋ค. ๋ฌธ์ ํด๊ฒฐ_element.scrollintoView() https://developer.mozilla.org/ko/docs/Web/API/Element/scrollIntoView element.scrollIntoView - Web API | MDN Element ์ธํฐ..
https://choi95.tistory.com/manage/newpost/149?type=post&returnURL=https%3A%2F%2Fchoi95.tistory.com%2F149 https://choi95.tistory.com/manage/newpost/149?type=post&returnURL=https%3A%2F%2Fchoi95.tistory.com%2F149 choi95.tistory.com ์ด์ ๋น๋ฐ์ง๋ ๋ฌธ์ ๋ฅผ ํ ๋ ์ด์ง์ ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ ํจ์๋ฅผ ๋ง๋ค์ด ์ฃผ์๋ค. function changeBinary(x, n) { let tmpArr = []; while (x) { tmpArr.push(x % 2); x = parseInt(x / 2); } while (tmpArr.le..
๋ค์๊ณผ ๊ฐ์ด ๋ณ์ ์ ํ๊ฐํ ์ ์๋ Rating UI๋ฅผ ๊ตฌํํ๊ณ ์ ํ๋ค. ๋ณ์ Container์ ๋ง์ฐ์ค Position ๊ฐ์ ธ์ค๊ธฐ ํ์ฌ ๋ณ์ UI๋ฅผ ๋ฉํํ๊ณ ์๋ ํด๋์ค๊ฐ stars์ธ ์ปจํ ์ด๋๊ฐ ์ข์ธก์ผ๋ก ์ผ๋ง๋งํผ ๋จ์ด์ ธ ์๋์ง์ ๋ง์ฐ์ค ์ปค์์ ํ์ฌ ์์น ๊ฐ์ ์์์ผ์ง ์ปจํ ์ด๋ ๋ด์์ ํ์ฌ ๋ง์ฐ์ค ์ปค์๊ฐ ์ผ๋ง๋งํผ ์ด๋ํ๋์ง ํ์ ํ ์ ์๋ค. ๋ํ ํ์ฌ ๋ง์ฐ์ค ์ปค์๊ฐ ์ปจํ ์ด๋ ๋ด์์ ์ด๋ํ ๋น์จ์ด ๋ณ์ 0.5์ ๋จ์๋ก ๊ณ์ฐ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด star ์ปจํ ์ด๋ ๋ด์์ ๋ณ์ ๊ฐ๋ก ๋๋น/2์ ๊ฐ์ ํ์ธํด์ผ ๋๋ค. MouseEvent ์ธํฐํ์ด์ค์ clientX ์ฝ๊ธฐ ์ ์ฉ ์์ฑ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ viewport ๋ด์ ์ํ ์ขํ๋ฅผ ์ ๊ณตํ๋ค(ํ์ด์ง ๋ด์ ์ขํ์๋ ๋ฐ๋) const calculateSco..
๋ฐฑ์ค์์ JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ๊ฒ ๋ ๊ฒฝ์ฐ ํ ์คํธ ์ผ์ด์ค ์ ๋ ฅ์ ๊ดํ ์ค์ผ๋ ํค ์ฝ๋๋ฅผ ์ ๊ณตํ๋ ํ๋ก๊ทธ๋๋จธ์ค๋ LeetCode ํ๋ซํผ ๋ฑ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ผ์ ์ฝ์ด์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ๋ ฅ๋ฐ๋ ์ฌ์ ์ค์ ์ฝ๋๋ฅผ ์์ฑํด์ค์ผ ํ๋ค. ์ง๊ธ๊น์ง๋ ๋ฐฑ์ค์์ ๋ฌธ์ ์ง๋ฌธ๋ง ๊ฐ์ ธ์ ์ธ๋ถ ์ฝ๋ ์๋ํฐ์์ ์๊ณ ๋ฆฌ์ฆ ๋ก์ง์ ์์ฑํ๊ฑฐ๋ solution ํจ์ ๋ด๋ถ์์ ๋ฌธ์ ๋ง ํ์ด๋ ๋๋ ํ๋ก๊ทธ๋๋จธ์ค๋ฅผ ์ฌ์ฉํ์๋๋ฐ ๋ฐฑ์ค์์ ์กฐ๊ธ ๋ ๋ค์ํ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ณ ์ถ์ ์์ฌ์ nodeJS์ ์ ์ถ๋ ฅ ๊ด๋ฆฌ์ ๋ํด์ ๋ค์ ๋ฐฑ์ค ๋ฌธ์ ๋ฅผ ์์๋ก ํฌ์คํ ํ๊ณ ์ ํ๋ค. ๋ฌธ์ https://www.acmicpc.net/problem/4344 4344๋ฒ: ํ๊ท ์ ๋๊ฒ ์ง ๋ํ์ ์๋ด๊ธฐ๋ค์ 90%๋ ์์ ์ด ๋ฐ์์ ํ๊ท ์ ๋๋๋ค๊ณ ์๊ฐ..
https://choi95.tistory.com/115 axios Intercept requests_API ์์ฒญ ์ฒ๋ฆฌ ๋์ UI ์์ ๋ณด์ฌ ์ฃผ๊ธฐ ๊ธฐ์กด ์ฝ๋ $searchInput.addEventListener('keyup', async function(event) { $loadingIndicator.style.visibility = 'visible'; //loading UI ์น ์์ ๋๋๋ง await searchKeyword(event.target.value, searchKey.. choi95.tistory.com ์ด์ ํฌ์คํ ์์ API ์์ฒญ ์ฒ๋ฆฌ ๋์์ loading UI๋ฅผ ๋๋๋งํด์ฃผ๊ณ API ์์ฒญ์ด ๋๋๋ฉด ๋ค์ ์ฌ๋ผ์ง๋๋ก axios Intercept requests์ await๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ..
๊ธฐ์กด ์ฝ๋ $searchInput.addEventListener('keyup', async function(event) { $loadingIndicator.style.visibility = 'visible'; //loading UI ์น ์์ ๋๋๋ง await searchKeyword(event.target.value, searchKeywordApi, showKeyword); }) const searchKeywordApi = (data) => { let res = fetch(`${API_URL}?q=${data}`).then(data => { return data.json(); }) return res; } const searchKeyword = async (data, callApi, callback) =..
๋ค์๊ณผ ๊ฐ์ด form ํ๊ทธ ๋ด์์ Input value ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ formData ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์๋ค. ์ดํ formData ์ธ์คํด์ค๋ฅผ ์ฝ๋ ์์์ ์ฐธ์กฐ ๋ฐ ์ฌ์ฉํ๊ธฐ ์ด์ ์ ์ฝ์ ์ฐฝ์์ ์ด๋ค ์ ๋ณด๊ฐ ์ถ๋ ฅ๋๋์ง ํ์ธํ๋ ค๊ณ ํ์ผ๋ formData์ ๋ํ ์ง์ ์ ์ธ ๋ฐ์ดํฐ ์ ๋ณด๊ฐ ์๋ FormData ๊ฐ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐํํ ๋ฟ์ด์๋ค. formData ๊ฐ์ฒด The FormData interface provides a way to easily construct a set of key/value pairs representing form fields and their values, which can then be easily sent using the XMLHttpRequest.send() meth..