Вариантов, на самом деле, несколько.
С учётом что у Вас jQuery, то предложу следующее:
Заведите переменную, отвечающую за состояние формы.
Состояние будет определять какую группу контролов показывать через css, например по data-атрибуту. (Ведёт к разбуханию CSS. Лучше тоглить JSом по соответствующему селектору);
Таким образом, например, можно менять значение дата атрибута на самой форме, а значение атрибута будет значение состояния.
Каждой группе контролов назначаем обработчик, который будет менять состояние на следующее. (В примере через делигирование).
Собственно.. ПРОФИТ.
Набросок примера. На работоспособность не проверял:
.form__input_stage{
display: none;
}
.form[data-stage="1"] .form__input_stage[data-stage="1"]{
display: block;
}
.form[data-stage="2"] .form__input_stage[data-stage="2"]{
display: block;
}
<form action="" class="form" data-stage="1">
<input type="text" class="form__input">
<input type="text" class="form__input form__input_stage" data-stage="1">
<input type="text" class="form__input form__input_stage" data-stage="2">
</form>
var form = document.querySelector('.form');
form.addEventListener('change', formChangeHandler);
function formChangeHandler(evt){
var stage = Number(evt.target.dataset.stage);
var nextStage = stage+1;
form.dataset.stage = nextStage;
}