2023.09.01 ~ 2023.09.27 λμ μ§ννλ μκ³¨λΌ νλ‘μ νΈμμ ν¬μ€νΈ μμ±μ μν΄ textArea νκ·Έλ₯Ό μ¬μ©ν΄μΌ νλ μν©μ΄ μμλ€. textArea νκ·Έ λ΄μμ μ¬μ©μκ° ν μ€νΈλ₯Ό μ λ ₯νλ©΄ μ΄ λ΄μ©μ λ°νμΌλ‘ ν¬μ€νΈκ° μμ±λλ€.
μ΄ ν μ€νΈμ λ΄μ©μ μκ°μ μΌλ‘ ν λμ νμ ν μ μλλ‘ νκΈ° μν΄, μ¬μ©μκ° ν μ€νΈλ₯Ό μ λ ₯νλλΌλ textArea νκ·Έ λ΄μ μ€ν¬λ‘€μ΄ μκΈ°μ§ μμμΌλ©΄ νλ€. κ·Έλμ textArea λ΄μ ν μ€νΈ λ΄μ©μ 5μ€λ‘ μ ννκ³ μΆμλ€.
μ΄λ₯Ό μν΄ λ€μν λ°©λ²μ μλνλ€.
첫λ²μ§Έλ‘ μλνλ λ°©λ²μ textArea
μμμ rows
μμ±μ μ¬μ©νλ λ°©λ²μ΄μλ€. μ΄ rows
μμ±μ textAreaλ΄μ κ°μμ μΈ heightμ μ€μ ν μ μλ μμ±μ΄μ§λ§, μμμ height
μ΄ cssλ‘ μ ν΄μ Έμλ μνμμλ μ΄ rows
μμ±μ΄ μ μ©λμ§ μμλ€. κ·Έλμ λμ μλλλ‘ λμνμ§ μμκΈ°μ λ€λ₯Έ λ°©λ²μ μκ°ν΄λ³΄μλ€.
/n
κ° 4κ° λ€μ΄μμΌλ©΄ 5μ€ μ΄μμ΄λΌκ³ νλ¨textArea
λ΄μ ν
μ€νΈκ° 5μ€μ΄λΌλ κ²μ μ¬μ©μκ° μν°λ₯Ό 4λ² μ
λ ₯νμ κ²μ΄λΌκ³ νλ¨ν΄, μ
λ ₯λ textμΈ string
κ°μμ κ°ν λ¬Έμ /n
μ κ°μλ₯Ό νλ¨ν΄, μ΄ κ°μκ° 4κ° μ΄μμ΄λΌλ©΄ λ μ΄μ μ
λ ₯νμ§ λͺ»νλλ‘ ν΄μ£Όλ©΄ λκ² λ€κ³ μκ°νλ€. ꡬκΈμ κ²μν΄λ³΄μμ λλ, μ΄λ¬ν λ°©λ²μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°ν μ¬λ‘κ° λ§μκ³ μ΄μ κ΄λ ¨λ ν¨μ μ½λλ€λ λ§μ΄ 곡μ λκ³ μμλ€.
νμ§λ§ μ’ λ κ³°κ³°μ΄ μκ°ν΄λ³΄λ, νμ¬ νλ‘μ νΈ λ΄ textArea
μμλ κ³ μ μ μΈ width
κ° μ ν΄μ Έμλ μνμ΄κ³ , μν°λ₯Ό μ
λ ₯νμ§ μμλ μ
λ ₯λ textμ κΈΈμ΄κ° κΈΈλ©΄ textArea λ΄μμ μλμ€λ°κΏ(\n
μ μμ§λ§ μ€λ°κΏμ΄ λμ΄μ 2μ€μ΄ λ¨)μ΄ λκΈ° λλ¬Έμ μ΄λ κ² νλ¨ν μλ μκ² λ€κ³ μκ°νλ€.
μ¬λ¬κ°μ§ λ°©λ²μ μ°Ύμλ³΄λ€ Element.scrollHeight
μ΄λΌλ μμ±μ μκ² λμλ€.
Element.scrollHeight
μμ κ·Έλ¦Όμμ λ³Ό μ μλ―μ΄, HTML elementμ λλΉμ λμ΄λ₯Ό λνλ΄λ μμ±μ μ¬λ¬κ°μ§κ° μκ³ , μ΄ μ€ λμ΄λ₯Ό λνλ΄λ μμ± μ€ clientHeightκ³Ό scrollHeightμ΄ μλ€.
clientHeight
=> border, scrollBarλ₯Ό μ μΈν μ€μ λ΄λΆ 컨ν μΈ κ° μ°¨μ§νλ ν¬κΈ°λ₯Ό λνλΈλ€. μ¦, μμ λ΄μ μ€ν¬λ‘€μ΄ λλ 컨ν μΈ κ° μλλΌλ, μ€μ λ‘ λμ 보μ΄λ μμμ λμ΄λ₯Ό λνλΈλ€.
Element.scrollHeight
=> νλ©΄μμ 보μ΄λ μμκ³Ό μκ΄μμ΄, μ€μ μ리먼νΈμ λμ΄λ₯Ό λνλΈλ€. μ¦, μμ λ΄μ μ€ν¬λ‘€μ΄ λλ 컨ν μΈ κ° μλ€λ©΄ κ·Έ 컨ν μΈ μ λμ΄κΉμ§ λ€ λνλ΄μ£Όλ μμ±μ΄λ€.
λ§μ½ μμμ μ½ν μΈ κ° μ€ν¬λ‘€λ° μμ΄ λͺ¨λ 보μ΄λ κ²½μ°, μμμ
scrollHeight
μclientHeight
μ λμΌνλ€.HTML μμμ ν¬κΈ° μμ±μ λν λ μμΈν λ΄μ©μ μ¬κΈ°λ₯Ό μ°Έκ³ νλ€.
μ΄λ¬ν λ΄μ©μ λ°νμΌλ‘, κ²°κ΅ μ¬μ©μμ ν
μ€νΈ μ
λ ₯μ΄ λ§μμ Έ μμ μμ μ€ν¬λ‘€μ΄ μκΈΈ κ²½μ° μμμ scrollHeight
κ°μ΄ λ³νκ² λλ€λ μ¬μ€μ μκ²λμλ€.
κ·Έλμ textArea
μμμ height
μ ν
μ€νΈκ° 5μ€ μ
λ ₯λ λκΉμ§λ μ€ν¬λ‘€μ΄ μκΈ°μ§ μκ³ , 6μ€μ μ
λ ₯νμ λ μ€ν¬λ‘€μ΄ μκΈΈ μ λμ νΉμ κ°(ex) 256px
) λ‘ μ§μ ν΄λκ³ , ν
μ€νΈ μ
λ ₯ μ textArea
μ scrollHeight
μ΄ λ³νλ€λ©΄, κ·Έ μ
λ ₯μ 6μ€ μ΄μμ μ
λ ₯μ΄κΈ° λλ¬Έμ μ μ©λμ§ μλλ‘ νλ©΄ λκ² λ€κ³ μκ°νλ€.
κ·Έλμ μ²μμ λ€μκ³Ό κ°μ΄ μμμ scrollHeight
κ°μ΄ λ³νμ§ μμ λλ§ μ
λ ₯μ΄ κ°λ₯ν΄λλ‘ ν΄μ£Όμλ€.
const MAX_OPTION_SCROLL_HEIGHT = 252;
const handleChangeOptionValues = (e: ChangeEvent<HTMLTextAreaElement>) => {
const { id, value } = e.target;
if (e.target.scrollHeight === MAX_OPTION_SCROLL_HEIGHT) {
// scrollHeightμ΄ λ³νμ§ μμ λλ§ μ
λ ₯ κ°λ₯
setInputValues({
...inputValues,
[id]: value.substring(0, MAX_TITLE_OPTION_LENGTH),
});
}
};
νμ§λ§ μ’ λ μκ°ν΄λ³΄λ, μ€ν¬λ‘€μ΄ μκΈ°κΈ° μ μλ μμμ clientHeight
κ°κ³Ό scrollHeight
κ°μ΄ κ°μ κ²μ΄κ³ μ€ν¬λ‘€μ΄ μκΈΈ λ μ΄ κ°μ΄ μλ‘ λ¬λΌμ§ κ²μ΄κΈ° λλ¬Έμ, κ΅³μ΄ μμκ°μΈ const MAX_OPTION_SCROLL_HEIGHT = 252;
μ μ μΈν΄ λΉκ΅νμ§ μκ³ clientHeight
κ°κ³Ό scrollHeight
μ λΉκ΅νλλ‘ λ‘μ§μ λ³κ²½νλ€. κ·Έλ¦¬κ³ νμ ν¨μλ₯Ό textArea
μ onChange
μ΄λ²€νΈ νΈλ€λ¬λ‘ μ°κ²°ν΄μ£Όμλ€.
const handleChangeOptionValues = (e: ChangeEvent<HTMLTextAreaElement>) => {
const { id, value } = e.target;
if (e.target.scrollHeight === e.target.clientHeight) {
setInputValues({
...inputValues,
[id]: value.substring(0, MAX_INPUT_LENGTH),
});
}
};
κ·Έλ¦¬κ³ textArea
λ΄μ 5μ€μ΄ κ°μ κ°κ²©μΌλ‘ λ°°μΉλλλ‘ νκΈ° μν΄ μμμ height
μΈ 212λ₯Ό 5λ‘ λλ 42 κ°μ line-height
κ°μΌλ‘ μ€μ ν΄μ£Όμλ€.
const OptionInput = styled.textarea`
line-height: 42px;
`;
clientHeight
κ°κ³Ό scrollHeight
μ λΉκ΅ν΄ 5μ€λ‘ μ νμ ν΄μ£Όμμ§λ§, μ΄λ κ² μ«μλ₯Ό κ³μ μ
λ ₯νλ©΄ νκΈμ νΉμ λ κΈμ μ λλ λ€μ μ€λ‘ λ΄λ €μ€λ λ²κ·Έκ° λ°μνλ€. κ·Έλμ, μΆκ°λ‘ css μμ±μΈ word-break
κ³Ό overflow
κ°μ μ€μ ν΄μ£Όμ΄ μ΄λ¬ν λΆλΆμ 보μ΄μ§ μλλ‘ μ€μ ν΄μ£Όμλ€.
const OptionInput = styled.textarea`
word-break: break-all;
overflow: hidden;
`;
λ°λΌμ textArea
μμ λ΄ μ€ μλ₯Ό μ ννκΈ° μν΄μ λ€μκ³Ό κ°μ λ°©λ²μ μ μ©νλ€.
λͺ μ€ μ νν κ±΄μ§ λ¨Όμ κ²°μ => n
μ€
μνλ μμμ λμ΄λ₯Ό μ€μ νκ³ , lineHeight
μ μμμ λμ΄
/ n
κ°μΌλ‘ μ€μ
β n
κ° μ€ μ΄μ μ
λ ₯ μ μ€ν¬λ‘€μ΄ μκΈΈ κ²μ
μμμ clientHeight
κ°κ³Ό scrollHeight
κ°μ΄ κ°μ λλ§ μμμ λ΄μ©μ΄ λ³κ²½λλλ‘ ν΄μ£ΌκΈ°
const handleChangeOptionValues = (e: ChangeEvent<HTMLTextAreaElement>) => {
const { id, value } = e.target;
if (e.target.scrollHeight === e.target.clientHeight) {
// μμμ λ΄μ© λ³κ²½
}
};
κ·Έλλ κ°λ ν λ κΈμλ λ°μΌλ‘ λ΄λ €κ°λ―λ‘ ν΄λΉ μμμ cssμ λ μμ± μ¨μ£ΌκΈ°
word-break: break-all;
overflow: hidden;