概要:
前回の質問の内容と重複しますが下記ソースコードは、
・デフォルト値のテキストエリア幅は157
・テキストエリア幅はの縮小はデフォルト値以下にはならない
・文字入力数に応じてテキストエリアが拡大・縮小する
やりたいこと:
・最初に取得したclientWidthの値(157)を取得して維持するようにしたい。
下記の様に変数に要素の幅を取得した値を格納する。
let hoge = element.clientWidth; element→テキストエリア
上記要素の幅は文字の入力数に応じて可変する。
その為、clientWidthの値は常に変化する。
・テキストエリア幅デフォルト値の部分を、最初に自分がテキストエリア右下にて拡大・縮小した値になる様にしたい。
ただし入力文字数を減らした際の縮小はデフォルト値以下になるようにする。←訂正: テキストエリア『右下』で拡大・縮小した値が最小値
それ以外は変わらない。
試してみたこと:
・constを使用することで値を変化させないようにしたが、エラーが出た(あくまで変数を固定するもので値は固定するわけではない)
・静的変数static(値を維持する変数)について調べ、それを使用してみようと試みたが、そもそも値を維持する意味合いが認識違いであった。
※ここでの値を維持するとは、変数の処理後、値はリセットされるが、値をリセットせずに維持し続けるという意味合い
・下記は最初に取得したテキストエリア幅を基準に処理を切り替えるというのを構想していた。
testであらかじめテキストエリア幅の状態を維持。
最初のテキストエリア幅(157)を超えたら処理を切り替える
横幅取得
test = t.clientWidth;
dummyElement.style.width = dummyElement.scrollWidth + test + "px";
if文にて条件式を追加(テキストエリア幅(157))
if (isDummyobserve && t.clientWidth < dummyElement.scrollWidth) {
dummyElement.style.width = dummyElement.scrollWidth + "px";
Math.min(observeElement.scrollWidth, dummyElement.scrollWidth),minWidth) + "px";
↓変更
Math.min(observeElement.scrollWidth, dummyElement.scrollWidth) + "px";
}
何卒教えて頂きたくお願い致します。
全体ソースコード:
https://codepen.io/mio-rei/pen/OJmEoPZ?editors=1111
ソースコード:
JavaScript
1 element.oninput = (e) => { 2 let t = e.target; 3 4 /********** 追加ここから **********/ 5 // ダミーテキストエリアに文字を移植 6 dummyElement.textContent = t.value; 7 // 幅を一旦0にする 8 dummyElement.style.width = 0; 9 if (t.value.length == 0) { 10 // 文字がなくなったらテキストエリアも消すようにしています。 11 // 別に消さなくていいなら削除してください 12 t.remove(); 13 } else { 14 // observeフラグ等をセット 15 isDummyobserve = true; 16 observeElement = t; 17 test = t.clientWidth; 18 } 19 /********** ここまで **********/ 20 21 if (t.nodeName != "TEXTAREA") return; 22 23 /********** 変更ここから**********/ 24 const widthBoundary = 25 element.clientWidth - (t.getBoundingClientRect().left - cRect().left); 26 if (widthBoundary > t.scrollWidth + 16) { 27 //if (element.clientWidth - (t.getBoundingClientRect().left - cRect().left) - 0.5 >= t.scrollWidth) { 28 /********** ここまで **********/ 29 t.style.width = "auto"; 30 t.style.whiteSpace = "nowrap"; 31 t.style.width = t.scrollWidth + "px"; 32 } else { 33 console.log("規定値を超えました"); 34 t.style.whiteSpace = "normal"; 35 /********** 変更ここから**********/ 36 t.style.width = widthBoundary + "px"; 37 /********** ここまで **********/ 38 } 39 40 t.style.height = "auto"; 41 t.style.height = t.scrollHeight + "px"; 42 }; 43 44 45 46const dummyElement = document.querySelector("#dummy"); 47const minWidth = 157; 48let observeElement = null; 49let isDummyobserve = false; 50let test = ""; 51 52const observer = new MutationObserver(() => { 53 if (isDummyobserve) { 54 // ダミーの幅をセット(その前の幅は必ず0にしているので、scrollWidthがセットされる) 55 dummyElement.style.width = dummyElement.scrollWidth + "px"; 56 // ダミーと本当のテキストエリアの幅のうち小さい方を採用 57 // ただし、minWidthよりは大きくする 58 observeElement.style.width = 59 Math.max( 60 Math.min(observeElement.scrollWidth, dummyElement.scrollWidth), 61 minWidth 62 ) + "px"; 63 console.log(test); 64 }
回答3件
あなたの回答
tips
プレビュー