やりたいこと:
テキストエリア幅の拡大・縮小を、改行後も行えるようにしたい。
概要:
・要素の上でダブルクリックをするとテキストエリアが作成される。
・テキストエリアを親要素の右端に近い部分で作成する。
・テキストエリアの中に何でもいいので文字を入力
・文字数に応じてテキストエリアは横に伸びるし縮小もするが、親要素の端まで文字を入力すると文字が改行される。
・その後はテキストエリア幅は固定されるので、文字を削除してテキストエリア内を空にしても幅の拡大・縮小は起きない。
親要素の端までテキストエリアが伸びると自動的に改行になるが、一度テキストエリア幅が伸びて改行してしまうと、
テキストエリアの拡大・縮小が行われなくなってしまう。
仮にこの状態でテキストエリアの文字を削除して空にしても、最初に作成したテキストエリアよりも幅が拡大したままなので、
文字を削除したときにも拡大・縮小が行えるようにしたい。
試してみたこと:
if文を使用して条件分布を行っており、テキストエリア幅が親要素の右端を超えた時に改行を行うようにしている。
下記コードだと一度elseの条件に入ってしまうと、文字を削除してもテキストエリア幅の拡大・縮小は行われない。
ならば、else文も同様にテキストエリア幅の拡大・縮小を行う為にコードを記述してみた。
else {
t.style.whiteSpace = 'normal';
t.style.width = 'auto';
t.style.width = (t.scrollWidth) + 'px';
確かに改行後もテキストエリア幅の拡大・縮小はできるが、これだと条件式を行ったり来たりしてしまう。
t.scrollWidthによりテキストエリア幅が常に変化する為、毎回親要素の右端を超えた時の条件分布を発生してしまう。
条件式によるのかもしれませんが、
else文に入った後でも、文字を削除しても文字数に合わせたテキストエリア幅の拡大・縮小を行えるようにするにはどうすればよいか、
ご教示願います。
全体ソースコード:
https://codepen.io/mio-rei/pen/LYWzJqq
ソースコード:
CSS
1textarea { 2 position: absolute; 3 overflow: hidden; 4}
JavaScript
1element.oninput = (e) => { 2 let t = e.target; 3 if (t.nodeName != 'TEXTAREA') return; 4 if (element.clientWidth - (t.getBoundingClientRect().left - cRect().left) - 0.5 >= t.scrollWidth) { 5 t.style.width = 'auto'; 6 t.style.whiteSpace = 'nowrap'; 7 t.style.width = (t.scrollWidth) + 'px'; 8 } 9 10 else { 11 console.log('規定値を超えました'); 12 t.style.whiteSpace = 'normal'; 13 t.style.width = element.clientWidth - (t.getBoundingClientRect().left - cRect().left) + 'px'; 14 } 15 16 t.style.height = "auto"; 17 t.style.height = (t.scrollHeight) + 'px'; 18 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/16 00:17
2021/07/16 01:55
2021/07/16 02:38