๊ฐœ๋ฐœ ๐Ÿพ/ReactJS

[React, css] textarea ์‚ฌ์šฉ์‹œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ฒ˜๋ฆฌ

JOTOKKI 2021. 12. 26. 20:17
728x90

๋‹ค์–‘ํ•œ ์ž…๋ ฅํผ์„ ๋‹ค๋ฃฐ๋•Œ input๋ง๊ณ ๋„ textarea๋„ ์ƒ๋‹นํžˆ ๋งŽ์ด ๋‹ค๋ฃจ๋Š” ํŽธ์ธ๋ฐ, 

textarea๋„ input๊ณผ ๋ณ„๊ฐœ๋กœ ์€๊ทผํžˆ ๋งŽ์€ ์ปค์Šคํ…€์„ ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ธฐ๋ณธ textarea ๊ฐ™์€ ๊ฒฝ์šฐ resize ์˜ต์…˜์ด ๊ธฐ๋ณธ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๊ณ , 

input๊ณผ ๋‹ฌ๋ฆฌ textarea ๋Š” ์—ฌ๋Ÿฌ ์ค„์˜ ๊ธ€์„ ๊ธธ๊ฒŒ ์ž…๋ ฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์—, 

์ถœ๋ ฅ์‹œ์—๋„ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค. 

 

1. textarea resize ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ 

2. textarea placeholder ์—์„œ ์ค„๋ฐ”๊ฟˆ ์ฒ˜๋ฆฌํ•˜๊ธฐ

3. textarea ์—์„œ tab ์‚ฌ์šฉํ•˜๊ธฐ 

 

 


1. ๊ธฐ๋ณธ ์†Œ์Šค 

- JSX

import { useState } from 'react'
import './app.css'

function App() {

  const [textValue, setTextValue] = useState("");
  const handleSetValue = (e) => {
    setTextValue(e.target.value);
  };

  return (
    <div className="app">
      <textarea
        placeholder="์—ฌ๊ธฐ์— ์ž…๋ ฅํ•˜์„ธ์š”"
        value={textValue}
        onChange={(e) => handleSetValue(e)}
      ></textarea>
      <hr />
      <p className="paragraph">{textValue}</p>
    </div>
  );
}

export default App;

- CSS

.app {
    padding: 10px
}

textarea {
    width: 250px;
    height: 200px;
  }

placeholder, ์ž…๋ ฅ ๊ฐ’, ์ถœ๋ ฅ ๊ฐ’

 


2. textarea resize ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ 

๊ธฐ๋ณธ์œผ๋กœ ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ๋กœ textarea์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ ˆ ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด๋Š” css ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

textarea { resize: none; }

 

3. textarea placeholder ์—์„œ ์ค„๋ฐ”๊ฟˆ ์ฒ˜๋ฆฌํ•˜๊ธฐ

placehoder ์—์„œ ์—ฌ๋Ÿฌ ์ค„๋กœ ํ‘œ์‹œ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค. 

์ •ํ™•ํ•œ ์ฐจ์ด๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜, &#13; ํ˜น์€ &#10; ๋˜๋Š” ๋‘๊ฐœ๋ฅผ ๊ฐ™์ด ์ž…๋ ฅํ•ด์ค˜๋„ ๋จนํž™๋‹ˆ๋‹ค.  

 <textarea placeholder="์—ฌ๊ธฐ์—&#13;&#10;์ž…๋ ฅํ•˜์„ธ์š”"></textarea>

 

4. textarea ์—์„œ tab ์‚ฌ์šฉํ•˜๊ธฐ

textarea์—์„œ tab์„ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ Element๋กœ focus ๊ฐ€ ๋„˜์–ด๊ฐ€ ๋ฒ„๋ฆฌ๊ธฐ๋•Œ๋ฌธ์— tab์ž…๋ ฅ์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด keyCode๊ฐ’์„ ๋ฐ›์•„ 9(tab์˜ keyCode๊ฐ’)์ธ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ธ ๋‹ค์Œ Element์— ํฌ์ปค์Šค ์ด๋™์„ ๋ฐฉ์ง€์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€ ๋’ค, select๊ฐ€ ๋œ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ๊ตฌํ•ด ๊ทธ ์‚ฌ์ด์— "\t" ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. 

\t๋ฅผ ์ž…๋ ฅํ•˜๋Š”๊ฒƒ์ด tab์„ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

โ€ป ์ฐธ๊ณ ๋กœ keyCode๊ฐ’์€ onChange๋กœ ๋ฐ›์ง€ ์•Š๊ณ  onKeyDown์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

๋กœ์ง์„ ์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. 

1. ํฌ์ปค์Šค ๊ธฐ๋Šฅ ๋ฐฉ์ง€

 e.preventDefault();

2. selection ๊ธฐ์ค€์œผ๋กœ ์‹œ์ž‘๊ณผ ๋ ๊ตฌํ•˜๊ธฐ

let start = e.target.selectionStart;
let end = e.target.selectionEnd;

3. \t ์‚ฝ์ž…ํ•˜๊ธฐ

value = val.substring(0, start) + "\t" + val.substring(end);

ํ•ด๋‹น ์ฝ”๋“œ๋Š”  React์—์„œ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ, javascript๋‚˜ jquery๋กœ ๊ตฌํ˜„ํ• ๋•Œ๋„ ๋˜‘๊ฐ™์€ ์›๋ฆฌ์ž…๋‹ˆ๋‹ค. 

 

4. ์ถœ๋ ฅ์‹œ \t, \n ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ด๋ ‡๊ฒŒ ์ž…๋ ฅ์‹œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋„ ์ถœ๋ ฅ์‹œ์—๋Š” ๋ชจ๋‘ ๋ฌด์‹œ๋œ ์ฑ„๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

์ด๋Š” ์ผ์ผ์ด split์„ ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ css๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

white-space: pre-wrap;

 

๊ฒฐ๊ณผํ™”๋ฉด

 


๊ฒฐ๊ณผ์ฝ”๋“œ

 

๋ฐ˜์‘ํ˜•