1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Javascriptで改行したら下に伸びるテキストボックスをつくる

Last updated at Posted at 2020-02-19

#はじめに

読んで字の通り、可変テキストボックスを実装する関数をつくってみました。
改行するごとに下へ下へと枠が伸びてゆくので、見栄えはよくなるかも。

#コード
仕組みとしては、改行文字(\n)の数を数えて、改行文字 ✕ 一行分の高さ + もともとの高さ となるようにした感じ。
パソコンは改行そのものも「改行という名の文字」として認識しているので、そこを突いてやればいいというわけだ。

なお、CSSは適用されているスタイルをブラウザから自動取得してくる仕組みになっている。
わざわざJsを書き換えてやらずとも、使いまわすことができるというわけだ。

javascript

function afeed(element){
	if(element.tagName == 'TEXTAREA'){

		// 行の高さとpadding値を取得する。IEやSafariなど、ブラウザによって必要な関数が異なるので、or(||)で3パターン分取れるようにしてある。
		var stylelists = window.getComputedStyle(element, null) || element.currentStyle || document.defaultView.getComputedStyle(element, '');

		// 1行あたりの高さ。
		if(stylelists.getPropertyValue('line-height') === "normal"){
			var line_height = 1.2 * stylelists.getPropertyValue('font-size').replace(/px/g , "");
		}else if(Number.isNaN(stylelists.getPropertyValue('line-height'))){
			var line_height = stylelists.getPropertyValue('line-height').replace(/px/g , "");
		}else{
			console.log("エラー!line-heightが不正な値です。");
		}

		// 高さの初期値。
		var firstheight = Number(element.offsetHeight) - stylelists.getPropertyValue('padding-top').replace(/px/g , "") - stylelists.getPropertyValue('padding-top').replace(/px/g , "");


		element.style.height = firstheight + 'px';
		element.style.resize = 'none';

		var line_length;
		var result_height;
		element.addEventListener('input', function(){

			// 改行文字の個数を取得
			if(element.value.match(/\n/g) === null){
				line_length = 0;
			}else{
				line_length = element.value.match(/\n/g).length;
			}

			// 見栄えの関係上、1つ以上改行があるときは文字のすぐ下に枠が来るようにする
			if(line_length === 0){
				result_height = firstheight;
			}else{
				result_height = ((line_length - 1) * line_height) + firstheight;
			}
			element.style.height = result_height + 'px';
		}, false);
	}else{
		console.log('Error: テキストエリアでないものに対して適用されています。');
	}
}

#Codepenを用いたサンプル

See the Pen テキストエリア自動改行 by Yomogenium (@yomogenium) on CodePen.

#おわりに

間違いやわかりにくい箇所ありましたら、編集リクエストをお願いいたします。

#参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?