テキストボックス(入力制御パターン集)
このコンポーネントについて
テキストボックスはWebフォームの最も基本的な入力要素です。 一口に「テキスト入力」といっても、文字数制限・改行制御・IME制御・高さ自動調整など、要件によって実装が変わるポイントが多くあります。
ユーザー名・コメント欄・メモなど、あらゆる場面で使われます。 このページでは実務でよく必要になる3パターンを動くデモで確認でき、そのままコピペして使えます。
- 基本テキスト入力(改行なし・日本語入力対応) — フォーカス時ボーダー変化・Enterキー無効・日本語IME優先起動を1フィールドに集約
- 文字数制限+カウンター — maxlength で上限設定し、残り文字数をリアルタイム表示(カウンターは0より下にならない)
- テキストエリア(改行・高さ自動調整) — 入力内容に応じてボックスの高さが自動拡張・縮小する
デモ
Pattern 1 — 基本テキスト入力(改行なし・日本語入力対応)
※ Enterキー無効 / 日本語IME優先(inputmode="text")※ IME優先はブラウザ・OS依存のため、環境によっては効果がない場合があります。
Pattern 2 — 文字数制限(20文字)+カウンター
残り20文字Pattern 3 — テキストエリア(改行・高さ自動調整)
サンプルソース
3つのファイルを同じフォルダに保存し、index.html をブラウザで開くとすぐに動作確認できます。
ファイル名:index.html / style.css / script.js
— 保存時の文字コードは UTF-8 を指定してください(Shift-JISだと日本語が文字化けします)。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>テキストボックス サンプル</title>
<link rel="stylesheet" href="./style.css">
</head>
<body>
<!-- Pattern 1: 基本テキスト入力(改行なし・日本語入力対応) -->
<div class="tb-pattern">
<label class="tb-field-label" for="basic-input">氏名</label>
<input type="text" id="basic-input" class="tb-input"
inputmode="text" placeholder="例:山田 太郎">
<span class="tb-hint">※ Enterキー無効 / 日本語IME優先</span>
</div>
<!-- Pattern 2: 文字数制限(20文字)+カウンター -->
<div class="tb-pattern">
<label class="tb-field-label" for="count-input">コメント(最大20文字)</label>
<input type="text" id="count-input" class="tb-input" maxlength="20"
placeholder="20文字以内で入力してください">
<span id="count-display" class="char-counter">残り20文字</span>
</div>
<!-- Pattern 3: テキストエリア(改行・高さ自動調整) -->
<div class="tb-pattern">
<label class="tb-field-label" for="auto-textarea">メモ</label>
<textarea id="auto-textarea" class="tb-textarea" rows="3"
placeholder="入力すると自動で高さが広がります"></textarea>
</div>
<script src="./script.js"></script>
</body>
</html>
/* === テキストボックス パターン集 ===
色を変えたいときは :root の変数を書き換えるだけでOKです */
:root {
--color-accent: #2B7FE8; /* フォーカス時のボーダー・影色 */
--color-warn: #E65100; /* 残り5文字以下のカウンター色 */
--color-danger: #E53935; /* 文字数上限到達のカウンター色 */
--color-text: #1A2332; /* 入力テキスト色 */
--color-label: #5A6A7A; /* ラベル文字色 */
--color-border: #D0D7E0; /* 通常時のボーダー色 */
--color-bg: #F4F6F9; /* カード背景色 */
--color-hint: #9AA5B4; /* ヒントテキスト色 */
}
/* 各パターンを囲むカード */
.tb-pattern {
margin-bottom: 16px;
padding: 20px;
background: var(--color-bg);
border-radius: 8px;
max-width: 520px;
}
.tb-pattern:last-child { margin-bottom: 0; }
/* 入力欄の上に表示するラベル */
.tb-field-label {
display: block;
margin-bottom: 5px;
font-size: 12px;
font-weight: 500;
color: var(--color-label);
}
/* input / textarea 共通スタイル */
.tb-input,
.tb-textarea {
width: 100%;
padding: 9px 12px;
border: 1.5px solid var(--color-border);
border-radius: 6px;
font-size: 14px;
color: var(--color-text);
background: #fff;
outline: none;
transition: border-color 0.2s, box-shadow 0.2s;
box-sizing: border-box;
font-family: sans-serif;
}
/* フォーカス時: ボーダーと薄い影でアクティブ感を出す */
.tb-input:focus,
.tb-textarea:focus {
border-color: var(--color-accent);
box-shadow: 0 0 0 3px rgba(43, 127, 232, 0.12);
}
/* テキストエリア: overflow: hidden にしないと自動拡張時にスクロールバーが出る */
.tb-textarea {
resize: none;
overflow: hidden;
line-height: 1.6;
}
/* 残り文字数カウンター */
.char-counter {
display: block;
margin-top: 5px;
font-size: 12px;
color: var(--color-hint);
text-align: right;
}
.char-counter.warn { color: var(--color-warn); font-weight: 600; }
.char-counter.danger { color: var(--color-danger); font-weight: 700; }
/* ヒントテキスト */
.tb-hint {
display: block;
margin-top: 6px;
font-size: 12px;
color: var(--color-hint);
}
/* スマホ対応: 600px以下でカードを全幅に */
@media (max-width: 600px) {
.tb-pattern { max-width: 100%; }
}
// === Pattern 1: Enterキー無効化 ===
var basicInput = document.getElementById('basic-input');
basicInput.addEventListener('keydown', function (e) {
if (e.key === 'Enter') {
// フォーム送信・改行を止める
e.preventDefault();
}
});
// === Pattern 2: 文字数カウンター ===
// 最大文字数を定数で定義(変更するときはここだけ直す)
var MAX_CHARS = 20;
var countInput = document.getElementById('count-input');
var countDisplay = document.getElementById('count-display');
countInput.addEventListener('input', function () {
// Math.max で 0 未満にならないよう保護
var remaining = Math.max(0, MAX_CHARS - countInput.value.length);
countDisplay.textContent = '残り' + remaining + '文字';
// いったんクラスをリセットしてから、状態に応じてクラスを付け直す
countDisplay.className = 'char-counter';
if (remaining <= 5 && remaining > 0) {
countDisplay.classList.add('warn'); // 残り5文字以下: オレンジ
}
if (remaining === 0) {
countDisplay.classList.add('danger'); // 上限到達: 赤
}
});
// === Pattern 3: テキストエリア 高さ自動調整 ===
var autoTextarea = document.getElementById('auto-textarea');
autoTextarea.addEventListener('input', function () {
// いったん auto に戻してから scrollHeight で高さを再計算する
// auto に戻さないと文字を削除したときに高さが縮まない
autoTextarea.style.height = 'auto';
autoTextarea.style.height = autoTextarea.scrollHeight + 'px';
});
AI用プロンプト
各パターンのプロンプトをコピーしてAIに渡すと、同様のコンポーネントを生成できます。
※ このプロンプトを使ってもデモとまったく同じ動作にならない場合があります。AIの解釈や生成タイミングによって差が出ることをご了承ください。
💡 jQuery・Vue・React など特定のライブラリで実装したい場合は、プロンプトの末尾に「〇〇を使って実装してください」と追記してください。
Pattern 1 — 基本テキスト入力(改行なし・日本語入力対応)
# テキストボックス(基本入力)作成依頼
## 概要
改行なし・日本語IME優先起動を備えた基本テキスト入力フィールドを実装してください。
## 要件
- プレースホルダーとフォーカス時のボーダー色変化(青)・薄い影
- Enterキーを押しても改行・フォーム送信されない
- フォーカス時に日本語IMEが優先起動する(inputmode="text" 属性を使用)
## 技術仕様
- HTML / CSS / バニラJavaScript で実装
- 外部ライブラリ:なし
- レスポンシブ対応:必要
## 動作詳細
inputmode="text" 属性でIMEの日本語入力を促す。
keydown イベントで Enter キーを preventDefault する。
## 出力形式
HTML・CSS・JavaScriptを分けて出力してください。
各ファイルは単独でコピー&ペーストして使えるよう記述してください。
Pattern 2 — 文字数制限+カウンター
# テキストボックス(文字数制限+カウンター)作成依頼
## 概要
最大文字数制限とリアルタイム残り文字数カウンターを持つ入力フィールドを実装してください。
## 要件
- maxlength="20" で入力上限を設定
- 入力のたびにフィールド外側に「残り〇文字」をリアルタイム表示
- カウンターは0より下(マイナス)にはならない
- 残り5文字以下でカウンター文字色をオレンジに変化
- 0文字でカウンター文字色を赤に変化
## 技術仕様
- HTML / CSS / バニラJavaScript で実装
- 外部ライブラリ:なし
- レスポンシブ対応:必要
## 動作詳細
input イベントで残り文字数を Math.max(0, maxLength - input.value.length) で計算する。
カウンターはフィールドの右下に配置する。
## 出力形式
HTML・CSS・JavaScriptを分けて出力してください。
各ファイルは単独でコピー&ペーストして使えるよう記述してください。
Pattern 3 — テキストエリア(改行・高さ自動調整)
# テキストエリア(高さ自動調整)作成依頼
## 概要
入力内容に応じて高さが自動拡張・縮小するテキストエリアを実装してください。
## 要件
- 初期高さは3行分
- 入力が増えるにつれてボックスが自動で縦に拡張する
- テキストを削除すると高さも縮む
- Enterキーで通常の改行が可能
## 技術仕様
- HTML / CSS / バニラJavaScript で実装
- 外部ライブラリ:なし
- レスポンシブ対応:必要
## 動作詳細
input イベントで element.style.height = 'auto' をセットしてから
element.style.height = element.scrollHeight + 'px' を設定する。
overflow: hidden を組み合わせてスクロールバーを非表示にする。
## 出力形式
HTML・CSS・JavaScriptを分けて出力してください。
各ファイルは単独でコピー&ペーストして使えるよう記述してください。
同じカテゴリーの事例
現在準備中です。