テキストエリアに入力した文章の長さに合わせて、高さを自動調整する方法を紹介します。入力内容が増えて表示領域に収まらなくなると、テキストエリアが下方向へ広がり、スクロールせずに文章全体を確認できるようになります。
今回のデモでは、文字を入力したり改行を増やしたりすると、必要な高さまで入力欄が自動的に広がります。反対に、文章や改行を削除すると高さも縮小し、設定された最小の高さまで戻ります。入力欄の右下をドラッグして、手動でサイズを変更する必要はありません。
テキストエリアの高さはJavaScriptで入力内容に合わせて調整しています。入力した文章は通常のテキストエリアと同じように文字列として取得できるため、高さが変化しても入力内容をそのまま利用できます。具体的な高さの調整方法や設定値の変更については、「ファイル構成と設置方法」で説明します。
デモ
テキストエリアに文章を入力して改行を増やすと、入力内容に合わせて高さが自動的に広がります。文字を削除すると高さも縮小し、設定された最小の高さまで戻ります。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コードをUTF-8に設定する -->
<meta charset="UTF-8">
<!-- スマートフォンなどの画面幅に合わせて表示する -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ブラウザのタブに表示するページタイトル -->
<title>高さが自動調整されるテキストエリア</title>
<!-- テキストエリアのデザインを定義したCSSを読み込む -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- テキストエリア全体:横幅を制御する親要素 -->
<div class="textarea-auto-expand_container">
<!-- 入力欄の項目名:for属性とtextareaのidを一致させる -->
<label class="textarea-auto-expand_label" for="textarea-auto-expand-input">
お問い合わせ内容
</label>
<!-- 高さが自動調整されるテキストエリア -->
<!-- idはJavaScriptで入力欄を取得するために使用する -->
<!-- placeholderは入力前に表示する案内文 -->
<textarea class="textarea-auto-expand_input" id="textarea-auto-expand-input" placeholder="お問い合わせ内容を入力してください。"></textarea>
</div>
<!-- 入力内容に合わせて高さを調整するJavaScriptを読み込む -->
<script src="script.js"></script>
</body>
</html>
コードをコピーする場合 使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。 サンプル一式を取得する場合 HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
Q ダウンロードしたけど、これをネット上で動かすにはどうするの?
Googleアカウントがあれば、InfinityFreeで無料サーバーを作成して、ダウンロードしたサンプルをネット上で動かせます。
InfinityFreeを初めて利用する場合は①から、すでにサーバーを作成している場合は②へ進んでください。
ファイル構成と設置方法
このサンプルは、HTML・CSS・JavaScriptを組み合わせて、入力内容に応じて高さが変わるテキストエリアを作成しています。CSSで入力欄の最小の高さや横幅を設定し、JavaScriptで入力内容に必要な高さを計算して反映する仕組みです。
ファイル構成
ZIPファイルを展開すると、次の3つのファイルが入っています。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlには、お問い合わせ内容のラベルとテキストエリアを配置しています。style.cssでは入力欄の横幅・最小の高さ・枠線・フォーカス時のデザインなどを設定し、script.jsで文字の入力や削除に合わせて高さを再計算します。
設置方法・使い方
「サンプル一式をダウンロード」からZIPファイルを保存して展開し、index.html・style.css・script.jsを同じフォルダに配置してください。index.htmlをブラウザで開くとテキストエリアが表示されます。文章を入力して改行を増やすと入力欄が広がり、文章を削除すると必要な高さまで縮小します。
入力内容に合わせて高さを変更する仕組み
script.jsでは、resizeTextarea()関数でテキストエリアの高さを調整しています。最初にheightをautoへ戻すことで、文章を削除した場合にも高さを縮小できるようにしています。
function resizeTextarea() {
// 高さを一度リセットし、文章を削除した際にも縮小できるようにする
textarea.style.height = "auto";
// 入力内容全体に必要な高さをscrollHeightで取得する
const contentHeight = textarea.scrollHeight;
// CSSに設定された最小の高さを取得する
const minHeight = parseFloat(getComputedStyle(textarea).minHeight);
// 入力内容の高さと最小の高さを比較し、大きい方を採用する
// pxを付けてテキストエリアの高さに反映する
textarea.style.height = Math.max(contentHeight, minHeight) + "px";
}
scrollHeightは、テキストエリア内の文章全体を表示するために必要な高さを取得するプロパティです。getComputedStyle(textarea).minHeightでCSSの最小の高さを取得し、Math.max()で比較することで、入力内容が少ない場合でも最小の高さを維持します。
また、textarea.addEventListener("input", resizeTextarea);によって、文字の入力・改行・削除が行われるたびに高さを再計算しています。ページを開いたときにもresizeTextarea()を実行するため、初期状態の入力内容にも対応できます。
テキストエリアの横幅と最小の高さ
入力欄のサイズはstyle.cssで調整できます。親要素のmax-width: 600px;が最大横幅を指定し、テキストエリアのmin-height: 120px;が最小の高さを指定しています。
.textarea-auto-expand_container {
width: 100%; /* 設置先の横幅に合わせて表示する */
max-width: 600px; /* 最大横幅。大きくすると入力欄全体が横に広がる */
margin: 40px auto; /* 上下40pxの余白。左右は自動調整して中央に配置する */
box-sizing: border-box; /* 横幅の計算に余白と枠線を含める */
}
max-widthの数値を大きくすると入力欄全体の最大横幅が広がり、小さくすると狭くなります。margin: 40px auto;は上下に40pxの余白を設け、左右を自動調整して中央に配置する指定です。
.textarea-auto-expand_input {
display: block; /* 入力欄をブロック要素として表示する */
width: 100%; /* 親要素の横幅いっぱいに表示する */
min-height: 120px; /* 最小の高さ。大きくすると入力欄が縦に広がる */
padding: 16px; /* 内側の余白。大きくすると文字と枠線の間隔が広がる */
border: 2px solid #dbe5f1; /* 枠線。2pxを大きくすると線が太くなる */
border-radius: 12px; /* 角丸。大きくすると丸みが強くなる */
}
min-heightを大きくすると初期状態の入力欄が高くなり、小さくすると低くなります。入力内容が最小の高さを超えた場合は、JavaScriptによって必要な高さまで自動的に広がります。paddingは文字と枠線の間隔、border-radiusは角の丸みを調整する指定です。
入力した値をJavaScriptで取得する方法
テキストエリアに入力された文章は、通常のテキストエリアと同じようにvalueプロパティで取得できます。次のコードでは、id="textarea-auto-expand-input"の入力欄を取得し、入力内容をvalue変数へ代入しています。
const textarea = document.getElementById("textarea-auto-expand-input");
const value = textarea.value;
valueには入力された文章が文字列(string)として格納され、改行も含めて取得できます。未入力の場合は空文字列になります。このコードは値の取得方法を説明するための例であり、ZIP内のscript.jsには含まれていません。実際に使用する場合は、script.js内でテキストエリアを取得したあと、入力値が必要なタイミングでtextarea.valueを読み取ってください。
レスポンシブ対応
style.cssでは、親要素にwidth: 100%;とmax-width: 600px;を指定しているため、画面が狭い場合は設置先の横幅に合わせて縮小します。また、画面幅640px以下では、テキストエリアの内側余白を16pxから14pxへ変更しています。
@media (max-width: 640px) {
/* 画面幅640px以下では入力欄の内側余白を小さくする */
.textarea-auto-expand_input {
padding: 14px; /* 内側の余白。大きくすると文字と枠線の間隔が広がる */
}
}
640pxはスマートフォン向けのスタイルへ切り替える基準です。この数値を変更すると、余白の調整が適用される画面幅を変更できます。テキストエリアの高さを自動調整する処理は、PC・タブレット・スマートフォンで共通です。
コメント