JavaScriptを使ってtextareaの高さを
入力された内容に合わせて自動で可変させる方法
お問い合わせフォームなどに付けるtextarea
で、よく設定する高さはどれくらいが適切かということに悩んだ事はありませんか?
あまりに高さを低く設定してしまうと書いた内容を見直す時に何度も何度もスクロールしなければならない一方で、高さを高くしすぎるとページの大半が最初からtextarea
だけで埋まってしまって見た目が良くない…と考えたりしてしまいます。
実は、そんなtextarea
の高さの最適解は、入力内容に応じて高さを自動で広げたり縮めたりとJavaScriptを使って自動的に調整してくれる方法がありそれを使うべきとも言えます。
今回はそんなtextarea
の高さを入力内容に合わせて自動で調整する方法についてまとめています。
自動でtextareaの高さが可変するコード
こういうのはコードを見て解説していく方が早いかと思いますので、下記にサンプル・デモを用意していますので、1つ1つ見ていきましょう。
使うHTMLのコード
<textarea id="textarea"></textarea>
大事になるポイントは、id
を指定しているところです。
このid
を指定していることによって、JavaScriptで要素を取得できる(しやすく)ようになっています。
使うCSSのコード
#textarea{
width: 100%;
height: 300px;
}
CSSは逆にこれといったところはありません。
何も入力されていないtextarea
の際に表示される高さや横のサイズを指定しておきましょう。
使うJavaScriptのコード
ここが今回の一番のポイントになります。
const ta = document.getElementById('textarea');
const ch = ta.clientHeight;
textarea.addEventListener('input', ()=>{
ta.style.height = ch + 'px';
const sh = ta.scrollHeight;
ta.style.height = sh + 'px';
});
ということで、1つ1つ見ていきましょう。
const ta= document.getElementById('textarea');
ここで、textarea
の要素を取得しています。id=textarea
と指定したので、そのid
の値を取得していることになります。
const ch = ta.clientHeight;
ここで、textarea
のデフォルトの高さを取得しています。○○.clientHeight;
というのが、表示域の高さを取得するJavaScriptのコードになります。
textarea.addEventListener('input', ()=>{
ta.style.height = ch + 'px';
const sh = ta.scrollHeight;
ta.style.height = sh + 'px';
});
1行目が、input
イベントと呼ばれるものになり、今回の場合で言うとtextarea
に文字が入力された時にということになります。
2行目が、先ほど取得したデフォルトのtextarea
高さをpx単位として、それをtextarea
のheight
に設定をしています。○○.style.height
というのが、○○の要素のcss
のheight
プロパティの値を設定するというJavsScriptのコードになります。
3行目が、再度textarea
の高さを取得しています。
4行目が、3行目で取得したtextarea
の高さをpx単位として、textarea
のheight
に設定をしています。
いまいちこれだけだと分からないという方もいるかもしれませんので、この1行目~4行目の流れを説明すると
- 今のテキストエリアの高さを取得
- その値を
textarea
のheight
の高さに指定 - テキストエリアに文字が入力されたら、その高さを再び取得
- その値を
textarea
のheight
の高さに指定
というのをひたすら繰り返しているという事になります。
簡単に言えば、文字が入力される度に高さを取得し、その高さをtextarea
のheight
に設定しているということになります。
そのため、文字が入力された際に、改行されていない場合はtextarea
の高さには変化がないため高さは変わりませんが、改行された場合はtextarea
の高さが変わるため、高さを取得してpx単位としてそれをtextarea
のheight
に指定している。という処理になります。
実際にtextareaの高さが自動可変するサンプル
では上記のコードを実際に書いて見たらこのようになります。
ただもしかすると他のcss設定などとバッティングしてしまって多少見た目などにズレが出てしまったりおかしくなったりする場合もあるかもしれませんが、その場合は下記を試してみましょう。
スクロールバーが表示される場合
今回の設定では、自動で可変されるためtextarea
にスクロールバーは本来表示されません。
上記のtextarea
でも文字を入力して行数を増やしていけば、自動で可変されますがスクロールバーは出ずに高さが自動的に変わっていきます。
しかしながらスクロールバーがもし表示されてしまうという場合はoverflow
の値を追加しておくと消える事になります。
textarea{
overflow: hidden;
}
ただし高さの可変がうまくいかないときにこれをいれると、高さが変わらないままスクロールもできないとなるので注意しましょう。
高さが変わる時にアニメーションが付く場合
普段は便利なアニメーションですが、textarea
にtransition
の設定を入れている場合、今回の自動可変の場合は改行が入る度に動きが付いてしまって逆に鬱陶しくなってしまいます。
そんな場合は、transition
の設定を消しておきましょう。
textarea{
transition: unset;
}
ちなみに、transition
のデフォルトはunset
になります。(ただしnone
でも同じ動きにはなります)
高さが長くなりすぎると今度は使いにくい場合も
高さが自動で可変していくということは、言い換えれば極論ではどこまでも長く続いていくという事にもなります。そのため、割と長文を入れるような場合には逆に不適切になってしまう場合があります。
こういったケースでは、max-height
の値を入れておくことで、それ以上は自動で可変せずスクロールバーを表示する形にするといった見せ方にもできます。この場合は、overflow
の値をいじってるとおかしくなるのでそこも注意が必要です。
どういう内容が想定されるのかなどに合わせて、使い分けておくと良いのではないかと思います。
CSSのresizeも合わせて設定しておく
この記事の前にCSS
のresize
について解説しました。
- CSSでtextareaをマウスドラッグでのリサイズを禁止したり制御する方法
- 資料請求系にはあまり使わないかもしれませんが、お問い合わせフォーム系など何かしら内容を書いてもらう際には、必ずと言って良いほどにtextareaが用い...
resize
はtextarea
の右下に出てくるつまみでサイズ変更を制御するものになりますが、今回のtextarea
の高さを自動で調整する場合、このresize
も禁止しておく必要があります。
禁止をしないと、仮につまみでリサイズをしたとしても、文字を入力した瞬間にその高さを自動取得して、その高さの値をheight
に設定するため、リサイズしたものが入力した瞬間に無効になってしまいます。
そのため、下記のcss
も合わせて入れて置く方がよいと言えます。
textarea{
resize: none;
}
こうすることで、高さが入力内容に合わせて自動で可変していくテキストエリアの完成になります。
まとめ
お問い合わせフォームなどに設定するtextarea
の高さが入力内容に合わせて自動で変わる設定について見て来ました。
フォームなどに長文の入力なら事前にメモやテキストエディタなどで作ってから貼り付けて投稿をする方も多いかもしれませんが、そういうのはお問い合わせフォームなど定型文を送るパターンだったりで、実際にはその場で都度入力して送るというケースも多かったりします。
そういう時に、入力内容に応じて高さが自動的に変わってくれればわかりやすく読み直しなどもしやすくなるケースもあるかと思います。
とはいえ100行でも200行でも改行を入れれば入れるだけ高さは伸びていくので、最大値を設定するかそもそも長文が入力されるフォームでは違う対策をという考えも大事になってくるかもしれません。
とはいえ使い方さえ間違えなければ割と使い勝手も良いものにもなるので、用途に合わせて使っていきましょう。
記事のシェアにご協力お願いします