createElement()
とappendChild()
を用い、ボタンをクリックすると入力欄が増えていく実装方法を紹介します。
ユーザーの状況に応じてフォーム数を変更したい場合に便利です。
自分の学習・メモ用がメインですが、プログラミング学習初心者の参考になればとも思います!
目次
実装例(3つ)とコード
ボタンクリックで入力欄が増える
『入力欄を増やす』をクリックすると、連絡事項を入力するフォームが増えていく。
入力欄のラベルも変える
入力フォームが増えると同時に、ラベルに記載された数字も増えていく。
自動計算
+
合計:0
『入力欄を増やす』をクリックすると、数字を入力するフォームと「+」が追加される。
さらにそのフォームに数値を入れると、その合計が下に表示される。
【発展】不要な要素を消せるようにする
各欄の右横に「✖」アイコンを設置し、クリックするとその欄が消えるような実装も可能です。
コードは以下の記事で公開していますので、本記事と合わせてご覧ください。
あわせて読みたい


【JavaScript】クリックで特定のフォームやテーブル行を消す
クローズボタン(✖)をクリックすると、特定の入力欄やテーブル行が削除される実装方法を紹介します。不要になった入力フォームなど、特定のHTML要素を消すのに…
【発展】ボタンを立体的にする方法
思わずクリックしたくなるような、ちょっとしたアニメーション付きのボタンをCSSで実装できます。
コードは以下の記事で公開していますので、本記事と合わせてご覧ください。
あわせて読みたい


【CSS】押し込まれるような立体的なボタンを作る
CSSの「box-shadow」プロパティや「active」擬似クラスを使って、クリックしたときに実際にボタンが押されているような、立体感のあるボタンの作り方を公開します。自分…
ボタンクリックで入力欄が増える
document.createElement()
を使ってinput要素とlabel要素を作り、appendChild()
で要素を追加することで実装できる。
HTML/CSS/JavaScript コードはこちら
<div>
<button>入力欄を増やす</button>
<label>連絡事項:<input type="text"></label>
</div>
div {
width: 100%;
padding: 8px 16px;
margin: 16px auto;
text-align: center;
display: flex;
flex-direction: column;
}
label {
margin-top: 8px;
}
button {
width: 50%;
height: 2.5em;
margin: 8px auto;
padding: 4px 0;
border-radius: 4px;
background-color: blue;
color: white;
}
button:hover {
opacity: .7;
}
document.querySelector('button').addEventListener('click', () => {
const newForm = document.createElement('input');
newForm.type = 'text';
const newLabel = document.createElement('label');
newLabel.textContent = '連絡事項:';
newLabel.appendChild(newForm);
document.querySelector('div').appendChild(newLabel);
});
- document.createElement(‘input’)でinput要素を作り、type属性にtextを設定する。
- 次にdocument.createElement(‘label’)でlabel要素を作り、このlabel要素の下にappendChild()でinput要素を追加する。
- 最後に、appendChild()でdiv要素の一番下にlabel要素を追加する。
ボタンクリックで入力欄が増えると同時に、ラベルの添字も増える
ボタンクリック時にinput要素数を計算し、その要素数に応じて追加するラベルの添字を決定する。
HTML/CSS/JavaScript コードはこちら
<div>
<button>入力欄を増やす</button>
<label>連絡事項(1):<input type="text"></label>
</div>
div {
width: 100%;
padding: 8px 16px;
margin: 16px auto;
text-align: center;
display: flex;
flex-direction: column;
}
label {
margin-top: 8px;
}
button {
width: 50%;
height: 2.5em;
margin: 8px auto;
padding: 4px 0;
border-radius: 4px;
background-color: blue;
color: white;
}
button:hover {
opacity: .7;
}
document.querySelector('button').addEventListener('click', () => {
const formCount = document.querySelectorAll('input').length + 1;
const newForm = document.createElement('input');
newForm.type = 'text';
const newLabel = document.createElement('label');
newLabel.textContent = '連絡事項(' + formCount + '):';
newLabel.appendChild(newForm);
document.querySelector('div').appendChild(newLabel);
});
- クリックした時点のinput要素数 + 1を変数formCountに代入する。
- document.createElement(‘input’)でinput要素を作り、type属性にtextを設定する。
- 次にdocument.createElement(‘label’)でlabel要素を作り、label名に変数formCountを使う。また、このlabel要素の下にappendChild()でinput要素を追加する。
- 最後に、appendChild()でdiv要素の一番下にlabel要素を追加する。
ボタンクリックで計算式の項を増やす
ボタンクリックで数値を入力できる項を増やす。実際に入力すると、各項に入力された数字の和が表示される。
HTML/CSS/JavaScript コードはこちら
<div>
<button>入力欄を増やす</button>
<input type="number">
<p>+</p>
<input type="number">
</div>
<div>
<p id="total">合計:</p>
</div>
div {
width: 100%;
padding: 8px 16px;
margin: 16px auto;
text-align: center;
display: flex;
flex-direction: column;
}
label {
margin-top: 8px;
}
input {
margin: 0 auto;
width: 60%;
height: 2em;
text-align: center;
}
button {
width: 50%;
height: 2.5em;
margin: 8px auto;
padding: 4px 0;
border-radius: 4px;
background-color: blue;
color: white;
}
button:hover {
opacity: .7;
}
#total {
margin: 4px auto;
}
let numberForms = document.querySelectorAll('input');
function calc() {
let result = 0;
const total = document.getElementById('total');
numberForms.forEach(numberForm => {
result += Number(numberForm.value);
});
total.textContent = '合計:' + result;
}
numberForms.forEach(numberForm => {
numberForm.addEventListener('input', calc);
});
document.querySelector('button').addEventListener('click', () => {
const newForm = document.createElement('input');
newForm.type = 'number';
const plus = document.createElement('p');
plus.textContent = '+';
const div = document.querySelector('div');
div.appendChild(plus);
div.appendChild(newForm);
numberForms = document.querySelectorAll('input');
numberForms.forEach(numberForm => {
numberForm.addEventListener('input', calc);
});
});
- まず計算部分のJavaScriptを記述。自動計算式の作り方は こちらの記事 を参照。
- 入力フォームの増やし方は前述と同じだが、要素が増えるたびにinput要素を再取得し、自動計算のクリックイベントを設定する必要がある。(設定しないと、新しい項に数値を入れても計算されないため。)