๐Ÿ“— React

textarea ์ค„ ์ˆ˜์— ๋”ฐ๋ผ style ๋ณ€๊ฒฝํ•˜๊ธฐ ( line count์— ๋”ฐ๋ฅธ border radius์„ค์ • ๋ฐ textarea line count ๊ฐœ์ˆ˜๋ฅผ ์ด์šฉํ•œ CSS ์„ค์ • )

Tamii 2022. 4. 25. 01:00
๋ฐ˜์‘ํ˜•

๋””์ž์ธํŒ€์—์„œ ์š”์ฒญ์ด ๋“ค์–ด์™”๋‹ค.

textarea์— ๋“ค์–ด๊ฐ€๋Š” line์— ๋”ฐ๋ผ border-radius๊ฐ€ ๋‹ฌ๋ผ์กŒ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์š”์ฒญ!

 

 

ํ•œ ์ค„์ผ๋• ๋™๊ทธ๋ž—๊ฒŒ, ์—ฌ๋Ÿฌ ์ค„์ผ๋•Œ๋ถ€ํ„ฐ๋Š” ๋„ค๋ชจ๋‚ณ๊ฒŒ

 

 

๋ฌธ์ œ๋Š” ํ•ด๋‹น ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณต๊ฐ„์˜ text area์˜ width๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์ด๋‹ค.

์œ ์ €์˜ ๊ธฐ๊ธฐ๋Š” ์ •๋ง ๋‹ค์–‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— width๋ฅผ ๊ณ ์ •ํ•  ์ˆ˜ ๋Š” ์—†์—ˆ๋‹ค

ex) iphone se์—์„œ 3์ค„์ผ๊ฒŒ z-fold์—์„œ๋Š” 1์ค„์ด ๋  ์ˆ˜ ์žˆ๋‹ค.. ๐Ÿ˜…

 

 

1) Textarea์˜ text value๋ฅผ ์ค„๋ฐ”๊ฟˆ ๊ธฐ์ค€์œผ๋กœ split

์ฒ˜์Œ ์ƒ๊ฐํ•œ ๋ฐฉ๋ฒ•์€ text area์˜ value๋ฅผ ์žก์•„์„œ  splilting ํ•˜๋Š” ๋ฒ•!

 

const getCurInputTextLineCnt = useCallback((text) => {
    const lines = text?.split(/\r|\r\n|\n/);
    const count = lines?.length;
    return count;
  }, []);
 <TextArea
      onChange={onChange}
      style={{
        borderRadius: getCurInputTextLineCnt(text)>1? "11px" : "100px"
      }}
    />

line count๊ฐ€ 1 ์ดˆ๊ณผ์ผ ๊ฒฝ์šฐ์™€ ์•„๋‹ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•ด style์„ ์ง€์ •ํ–ˆ๋‹ค.

 

ํ•œ๊ณ„

 

 

๋„ˆ๋ฌด ์‹ ๋‚˜์„œ ์ž˜๋˜๋Š” ์ค„ ์•Œ์•˜๋”๋‹ˆ ์‚ฌ์šฉ์ž๊ฐ€ ์—”ํ„ฐ ์—†์ด ๋‚ด์šฉ์ด ๋งŽ์•„์ ธ ์ค„๋ฐ”๊ฟˆ์ด ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์žก์ง€ ๋ชปํ–ˆ๋‹ค.

 

=> height์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค!

 

 

 

 

 

 

 

 

2) Height๊ณผ text ๋ชจ๋‘ ์ด์šฉ

๐Ÿ”— code sandBox ์ฐธ๊ณ 

Textarea์˜ onChange ์ด๋ฒคํŠธ์—์„œ target์˜ scrollHeight์„ state๋กœ ๋„ฃ๊ณ 

isSingleHeight์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด

์‚ฌ์šฉ์ž๊ฐ€ ์—”ํ„ฐ๋ฅผ ์ณค๊ฑฐ๋‚˜  or ํ…์ŠคํŠธ height์ด ๋„˜์–ด๊ฐ”์„ ๋•Œ style ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •

 

  const getCurInputTextLineCnt = useCallback((text) => {
    const lines = text?.split(/\r|\r\n|\n/);
    const count = lines?.length;

    return count;
  }, []);

  const isSingleHeight = useCallback((text, height) => {
    console.log("text line count", getCurInputTextLineCnt(text));
    console.log("scroll height", height);
    return getCurInputTextLineCnt(text) > 1 || height > SINGLE_ROW_HEIGHT;
  }, []);

 

ํ•œ๊ณ„

height์ด ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„ catch๊ฐ€ ํ•œ ๋ฐ•์ž ๋Š๋ฆฌ๊ฒŒ ๋˜๋ฉด์„œ,

์—ฌ๋Ÿฌ์ค„ -> ํ•œ ์ค„ ์ด ๋˜๋Š” ์ˆœ๊ฐ„์ด ์•„๋‹ˆ๋ผ

์—ฌ๋Ÿฌ์ค„ -> ํ•œ ์ค„์ด ๋˜๊ณ  ์ž…๋ ฅ์ด ์žˆ์–ด์•ผ style ์„ค์ •์ด ๋˜๋Š” ํ•œ๊ณ„๊ฐ€ ์ƒ๊ฒผ๋‹ค. 

 

 

 

 

 

 

๊ทธ ์™ธ ์ถ”๊ฐ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 

Antd  text area์—์„œ autoSize prop์„ ๋ณด๋‹ˆ line count๋ฅผ ํ•˜๋Š” ๋กœ์ง์ด ์žˆ์„ ๊ฒƒ๊ฐ™์•„ antd ๋ฅผ cloneํ•ด์„ ์ƒ…์ƒ…์ด ๋’ค์กŒ๊ณ ..

antd ์—์„œ ๐Ÿ”— rc-textarea ๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ํ™•์ธํ•˜๊ณ  ๋œฏ์–ด๋ณด๋‹ˆ

 

calculateNodeHeight.tsx ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ตฌ์„ฑ ์ค‘์ด์—ˆ๊ณ 

- ๊ฐ€์ƒ์˜ hiddenText area๋ฅผ ๋งŒ๋“ค๊ณ 

- ' ' ๋นˆ value๋ฅผ ์ฃผ์–ด height์„ ์žก๊ณ 

-  singleRowHeight์„ ๋งŒ๋“ค์–ด heightํ•œ์ • ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ™•์ธ..

 

 

 

 

 

 

 

2) Height๊ณผ text ๋ชจ๋‘ ์ด์šฉ

Height๋งŒ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐœ๊ฒฌ!

์œ„ ์ƒํ™ฉ์—์„œ text๋ฅผ ๊ตณ์ด ์ด์šฉํ•œ ์ด์œ ๋Š” ํ•˜๋‚˜ view width๋ฅผ ์ฑ„์šฐ์ง€ ์•Š๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅธ ๊ฒฝ์šฐ๋ฅผ ์žก๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฐ๊ตญ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋‹ค ์—”ํ„ฐ๋ฅผ ์ทจ์†Œํ•ด ๋‹ค์‹œ ํ•œ ์ค„์ด ๋œ ๊ฒฝ์šฐ๋ฅผ ์žก์ง€ ๋ชปํ•˜๋Š” ํ•œ๊ณ„๊ฐ€  ์žˆ์—ˆ๋‹ค.

 

 

์š” ๊ฒฝ์šฐ๋Š” TextArea์— onChange๋Œ€์‹  onKeyUp์„ ์‚ฌ์šฉํ–ˆ๋”๋‹ˆ ํ•ด๊ฒฐ !

 

๋‘ ์ด๋ฒคํŠธ ์š”์†Œ์˜ ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์€๋ฐ,

 

onChange : html์š”์†Œ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ์ฆ‰ focus ๋ฐœ์ƒ ์ „๊ณผ ํ›„๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚ฌ์„ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ

onKeyUp : input ์ด๋ฒคํŠธ ๋ฐœ์ƒ ํ›„ value๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ ์ดํ›„ ์†์„ ๋–ผ๋ฉด ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ

 

 

์ž์„ธํ•œ ๊ฑด input ๊ด€๋ จ ์ด๋ฒคํŠธ ํŒŒํ—ค์น˜๊ธฐ ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”!

 

input ๊ด€๋ จ ์ด๋ฒคํŠธ ํŒŒํ—ค์น˜๊ธฐ - input onChange onKeyUp onKeydown

ํšŒ์‚ฌ์—์„œ value์— ๋”ฐ๋ผ style์ด ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ input์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋Š”๋ฐ, input event๋ฅผ ํ™œ์šฉํ•ด์„œ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ์š”. ์ •ํ™•ํžˆ ์™œ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ์›๋ก ์ ์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด๊ณ  ์‹ถ์–ด

rrecoder.tistory.com