๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript/๐Ÿ‘€ tips

scrollIntoVeiw๋กœ ์Šคํฌ๋กค ํ•ญ์ƒ ์•„๋ž˜๋กœ ์œ ์ง€ํ•˜๊ธฐ(+ ํ‚ค๋ณด๋“œ Enter ์ด๋ฒคํŠธ)

by HomieKim 2022. 6. 30.

์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์Šคํฌ๋กค์„ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์กธ์—… ํ”„๋กœ์ ํŠธ๋กœ ๋ชจ๋ฐ”์ผ ์›น์•ฑ์„ ๋งŒ๋“œ๋Š” ๋„์ค‘์— ํ•ด์‰ฌํƒœ๊ทธ๋ฅผ ๊ทธ๋ฆฌ๋“œ ํ˜•์‹์œผ๋กœ ์ž…๋ ฅ๋ฐ›๋Š” ui๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ๋ฅผ ๋ถ™์—ฌ์„œ ํ•ด์‰ฌํƒœ๊ทธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š”๋ฐ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•ด์‰ฌํƒœ๊ทธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋‹ค ๋ณด๋ฉด input ํƒœ๊ทธ๊ฐ€ ์Šคํฌ๋กค ์•„๋ž˜๋กœ ์ˆจ๊ฒจ์ง€๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. input ์ฐฝ์ด ๋‚ด๋ ค๊ฐˆ ๋•Œ๋งˆ๋‹ค ์œ ์ €๊ฐ€ ์Šคํฌ๋กค์„ ๋‚ด๋ ค input ์ฐฝ์„ ํ™”๋ฉด์— ๋ณด์ด๊ฒŒ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด๋ผ ์ƒ๊ฐํ•˜์—ฌ webAPI์˜ scrollIntoView๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ input ํƒœ๊ทธ์— ์Šคํฌ๋กค์ด ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ€๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

https://developer.mozilla.org/ko/docs/Web/API/Element/scrollIntoView

 

element.scrollIntoView - Web API | MDN

Element ์ธํ„ฐํŽ˜์ด์Šค์˜ scrollIntoView() ๋ฉ”์†Œ๋“œ๋Š” scrollIntoView()๊ฐ€ ํ˜ธ์ถœ ๋œ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œ๋˜๋„๋ก ์š”์†Œ์˜ ์ƒ์œ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์Šคํฌ๋กคํ•ฉ๋‹ˆ๋‹ค.

developer.mozilla.org

ํ•ด๋‹น API์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์œ MDN์— ์ž์„ธํžˆ ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ querySelector ๋กœ DOM์„ ์ง์ ‘ ์ œ์–ด ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

// ์˜ˆ์‹œ ์ฝ”๋“œ
const target = document.querySelector('.inputTagClassName');

target.scrollIntoView();

โœ” ๋ฆฌ์•กํŠธ ๋ฐฉ์‹์˜ ์ ์šฉ

์ œ ํ”„๋กœ์ ํŠธ ์—์„œ๋Š” Next.js๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ input tag์— Ref๋ฅผ ๋‹ฌ์•„์„œ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋‹จ, Keyboad Event๋ฅผ ์บ์น˜ํ•ด์„œ tags๋ผ๋Š” state์— ๋ณ€๊ฒฝ๋˜๊ฒŒ ๊ตฌํ˜„์„ ํ–ˆ๋Š”๋ฐ ์ด๋Ÿฐ ๊ฒฝ์šฐ ์Šคํฌ๋กค์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. setStateํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ํ™”๋ฉด๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง ๋˜๊ธฐ ๋•Œ๋ฌธ์— scrollIntoview ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ setTimeout์œผ๋กœ ์งง์€ ์‹œ๊ฐ„์„ ๊ฑธ์–ด์ฃผ๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ–ˆ์Šต๋‹ˆ๋‹ค!

 const onKeyUp = (e: KeyboardEvent<HTMLInputElement>) => {
    if (e.key === "Enter") {
      if(tags.includes(tagInput)) {
        setTagInput("");
        return;
      } // ๊ฐ™์€ ๊ฐ’์€ ์ถ”๊ฐ€ ์•ˆ๋˜๊ฒŒ
      dispatch(uploadSlice.actions.addTag(tagInput)); 
      setTagInput("");
      setTimeout(() => {
        inputRef.current!.scrollIntoView({ behavior: "smooth" });
      }, 100);
    }
  };

๋Œ“๊ธ€