Back Button Positioning Update
April 17, 2025 · AI Conversations
<style>
.hub-multistep-btn {
background-color: #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
}
#step-progress {
margin: 20px 0;
text-align: center;
display: flex;
justify-content: space-between;
align-items: center;
}
.step-indicator {
display: inline-block;
width: 30px;
height: 30px;
line-height: 30px;
border-radius: 50%;
margin: 0 5px;
font-size: 10px;
font-weight: 600;
position: relative;
text-align: center;
border: 1px solid #000221;
color: #000221;
}
.step-indicator.active {
background-color: #00b4d5 !important;
border-color: #00b4d5 !important;
color: #a8eeff;
}
.step-head-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
position: relative;
}
.steps-container {
display: flex;
position: relative;
}
.steps-container:not(:last-child)::after {
content: '';
position: absolute;
top: 15px;
left: 78%;
right: -185%;
height: 1px;
background-color: #babfc5;
z-index: 0;
}
.step-head-container.completed .step-indicator {
background-color: #000221 !important;
border: 1px solid #5fdb3a;
color: #fafafa;
}
.hs_test___letzte_konversion__asset_tag_.hs-test___letzte_konversion__asset_tag_.hs-fieldtype-select.field.hs-form-field {
display: none !important;
}
span.hs-form-required {
padding-left: 5px;
color: #9b0077;
}
.hs-form-field input:not([type=checkbox]), .hs-form-field select, .hs-input.hs-fieldtype-textarea {
color: #000221;
font-size: 18px;
height: 45px;
transition: border-bottom .2s ease-in-out, background-color .2s ease-in-out, color .2s ease-in-out;
width: 100% !important;
background-color: #fff ;
border: 1px solid #ccccd3;
border-radius: 6px !important;
padding: 10px;
}
.hs_hs_language.hs-hs_language.hs-fieldtype-select.field.hs-form-field {
display: none !important;
}
.hs-form-private fieldset {
margin-bottom: 0 !important;
}
.step-buttons {
margin-top: 30px;
text-align: center;
display: flex;
gap: 12px;
}
.step-buttons button {
background-color: #00b4d5;
border: 1px solid #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
color: #fff;
flex: 1;
}
.step-buttons button#nextBtn:hover {
background-color: #0092ad !important;
color: #fff !important;
}
.step-buttons button#backBtn {
background-color: #fff;
color: #00b4d5;
border: 1px solid #00b4d5;
flex: 1;
}
.step-buttons button#backBtn:hover {
background-color: #00b4d5;
color: #fff;
}
.hs-form-field {
margin-bottom: 20px;
}
.input-error {
border-color: red !important;
}
.hs-error-msgs {
display: block !important;
color: red;
font-size: 14px;
margin-top: 4px;
}
.hs-input[type=checkbox] {
appearance: none;
background-color: #fff ;
border: 1px solid #717e86;
border-radius: 4px;
cursor: pointer;
height: 30px;
width: 30px !important;
transition: background-color .2s ease, border .5s ease;
}
.hs-input[type=checkbox]:checked {
background-color: #00b4d5 !important;
}
.hs-input[type=checkbox]:checked:after {
background-color: #00b4d5;
border-radius: 50%;
color: #fff;
content: "✓";
display: flex;
border: 1px solid #fff;
font-size: 11px;
justify-content: center;
left: 50%;
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
width: 16px;
height: 18px;
}
.hs_welche_produkte_wollen_sie_live_sehen_.hs-welche_produkte_wollen_sie_live_sehen_.hs-fieldtype-checkbox.field.hs-form-field label > span:first-child {
font-size: 14px;
font-weight: 500;
line-height: 30px;
text-align: left;
color: #33354d;
}
.hs_submit.hs-submit {
width: 50%;
margin-bottom: 0px !important;
}
input.hs-button.primary.large {
width: 100%;
padding: 0;
}
input:focus , textarea:focus , select:focus{
background-color: #eaf8fc !important;
border: 1px solid #00b4d5;
box-shadow: none !important;
color: #000221;
outline: none !important;
}
.hs-form-private ul li {
margin-block: 10px;
}
.hs-form-booleancheckbox label, .hs-form-checkbox label {
align-items: center;
}
</style>
<script>
</script>
<script>
hbspt.forms.create({
portalId: "6868748",
formId: "7e1746ed-1467-45f2-b011-d8edae5509a5",
target: "#hubspot-form-2",
onFormReady: function () {
const waitForFields = setInterval(() => {
const form = document.querySelector('#hubspot-form-2 form');
const allFields = form?.querySelectorAll('.hs-form-field');
if (!form || !allFields || allFields.length < 5) return;
clearInterval(waitForFields);
const stepFields = {
0: ['welche_produkte_wollen_sie_live_sehen_'],
1: ['message'],
2: []
};
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
if (input && input.name && !Object.values(stepFields).flat().includes(input.name)) {
stepFields[2].push(input.name);
}
});
const stepProgress = document.createElement('div');
stepProgress.innerHTML = `
<div id="step-progress">
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">1 </div><span class="step-label">
Product selection</span></div></div>
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">2 </div><span class="step-label">Requirements</span></div></div>
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">3 </div><span class="step-label">Contact details
</span></div></div>
</div>
`;
form.prepend(stepProgress);
const stepButtons = document.createElement('div');
stepButtons.className = 'step-buttons';
stepButtons.innerHTML = `
<button type="button" id="backBtn" style="display: none;">Back</button>
<button type="button" id="nextBtn">Next</button>
`;
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
form.insertBefore(stepButtons, hsSubmit);
}
const backBtn = document.getElementById('backBtn');
const nextBtn = document.getElementById('nextBtn');
const indicators = document.querySelectorAll('.step-indicator');
const totalSteps = 3;
let currentStep = 0;
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'block' : 'none';
}
backBtn.style.display = step > 0 ? 'inline-block' : 'none';
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
if (i < step) {
el.classList.add('completed');
} else {
el.classList.remove('completed');
}
});
};
const validateStep = (step) => {
let valid = true;
stepFields[step].forEach(name => {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
const wrapper = field.closest('.hs-form-field');
const errorBox = wrapper?.querySelector('.hs-error-msgs');
if (field.hasAttribute('required') && !field.value.trim()) {
valid = false;
if (errorBox) errorBox.style.display = 'block';
field.classList.add('input-error');
} else {
if (errorBox) errorBox.style.display = 'none';
field.classList.remove('input-error');
}
}
});
return valid;
};
updateStep(currentStep);
nextBtn.addEventListener('click', () => {
if (currentStep < totalSteps - 1 && validateStep(currentStep)) {
currentStep++;
updateStep(currentStep);
}
});
backBtn.addEventListener('click', () => {
if (currentStep > 0) {
currentStep--;
updateStep(currentStep);
}
});
}, 100);
}
});
</script>
just show back button also in hs_submit block in third step
Here's the **updated part of your JavaScript**, with only the necessary adjustments made:
—
### ✅ Updated Code Block (inside `onFormReady`):
Replace this portion:
if (hsSubmit) {
form.insertBefore(stepButtons, hsSubmit);
}
with this:
if (hsSubmit) {
hsSubmit.prepend(backBtn); // Move Back button next to submit
form.insertBefore(nextBtn, hsSubmit); // Keep Next button before submit
}
And **inside the `updateStep` function**, change this:
backBtn.style.display = step > 0 ? 'inline-block' : 'none';
to:
backBtn.style.display = step > 0 ? 'inline-block' : 'none';
if (step === 2 && hsSubmit.contains(backBtn) === false) {
hsSubmit.prepend(backBtn);
}
This ensures the Back button is visible **and appears next to the Submit button** on the third step, while still working normally on the earlier steps.
Let me know if you want the buttons to be **horizontally aligned responsively** or stacked on mobile.
—
### ✅ Full HTML + CSS + JS (updated):
<div id="hubspot-form-2"></div>
<style>
.hub-multistep-btn {
background-color: #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
}
#step-progress {
margin: 20px 0;
text-align: center;
display: flex;
justify-content: space-between;
align-items: center;
}
.step-indicator {
display: inline-block;
width: 30px;
height: 30px;
line-height: 30px;
border-radius: 50%;
margin: 0 5px;
font-size: 10px;
font-weight: 600;
position: relative;
text-align: center;
border: 1px solid #000221;
color: #000221;
}
.step-indicator.active {
background-color: #00b4d5 !important;
border-color: #00b4d5 !important;
color: #a8eeff;
}
.step-head-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
position: relative;
}
.steps-container {
display: flex;
position: relative;
}
.steps-container:not(:last-child)::after {
content: '';
position: absolute;
top: 15px;
left: 78%;
right: -185%;
height: 1px;
background-color: #babfc5;
z-index: 0;
}
.step-head-container.completed .step-indicator {
background-color: #000221 !important;
border: 1px solid #5fdb3a;
color: #fafafa;
}
.hs_test___letzte_konversion__asset_tag_ {
display: none !important;
}
span.hs-form-required {
padding-left: 5px;
color: #9b0077;
}
.hs-form-field input:not([type=checkbox]), .hs-form-field select, .hs-input.hs-fieldtype-textarea {
color: #000221;
font-size: 18px;
height: 45px;
transition: border-bottom .2s ease-in-out, background-color .2s ease-in-out, color .2s ease-in-out;
width: 100% !important;
background-color: #fff ;
border: 1px solid #ccccd3;
border-radius: 6px !important;
padding: 10px;
}
.hs_hs_language {
display: none !important;
}
.hs-form-private fieldset {
margin-bottom: 0 !important;
}
.step-buttons {
margin-top: 30px;
text-align: center;
display: flex;
gap: 12px;
}
.step-buttons button {
background-color: #00b4d5;
border: 1px solid #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
color: #fff;
flex: 1;
}
.step-buttons button#nextBtn:hover {
background-color: #0092ad !important;
color: #fff !important;
}
.step-buttons button#backBtn {
background-color: #fff;
color: #00b4d5;
border: 1px solid #00b4d5;
}
.step-buttons button#backBtn:hover {
background-color: #00b4d5;
color: #fff;
}
.hs-form-field {
margin-bottom: 20px;
}
.input-error {
border-color: red !important;
}
.hs-error-msgs {
display: block !important;
color: red;
font-size: 14px;
margin-top: 4px;
}
.hs-input[type=checkbox] {
appearance: none;
background-color: #fff ;
border: 1px solid #717e86;
border-radius: 4px;
cursor: pointer;
height: 30px;
width: 30px !important;
transition: background-color .2s ease, border .5s ease;
}
.hs-input[type=checkbox]:checked {
background-color: #00b4d5 !important;
}
.hs-input[type=checkbox]:checked:after {
background-color: #00b4d5;
border-radius: 50%;
color: #fff;
content: "✓";
display: flex;
border: 1px solid #fff;
font-size: 11px;
justify-content: center;
left: 50%;
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
width: 16px;
height: 18px;
}
.hs_welche_produkte_wollen_sie_live_sehen_ label > span:first-child {
font-size: 14px;
font-weight: 500;
line-height: 30px;
text-align: left;
color: #33354d;
}
.hs_submit.hs-submit {
width: 100%;
display: flex;
gap: 12px;
justify-content: center;
margin-top: 30px;
}
input.hs-button.primary.large {
width: 100%;
padding: 0;
}
input:focus, textarea:focus, select:focus {
background-color: #eaf8fc !important;
border: 1px solid #00b4d5;
box-shadow: none !important;
color: #000221;
outline: none !important;
}
.hs-form-private ul li {
margin-block: 10px;
}
.hs-form-booleancheckbox label, .hs-form-checkbox label {
align-items: center;
}
</style>
<script src="https://js.hsforms.net/forms/v2.js" charset="utf-8"></script>
<script>
hbspt.forms.create({
portalId: "6868748",
formId: "7e1746ed-1467-45f2-b011-d8edae5509a5",
target: "#hubspot-form-2",
onFormReady: function () {
const waitForFields = setInterval(() => {
const form = document.querySelector('#hubspot-form-2 form');
const allFields = form?.querySelectorAll('.hs-form-field');
if (!form || !allFields || allFields.length < 5) return;
clearInterval(waitForFields);
const stepFields = {
0: ['welche_produkte_wollen_sie_live_sehen_'],
1: ['message'],
2: []
};
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
if (input && input.name && !Object.values(stepFields).flat().includes(input.name)) {
stepFields[2].push(input.name);
}
});
const stepProgress = document.createElement('div');
stepProgress.innerHTML = `
<div id="step-progress">
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator active">1</div>
<span class="step-label">Product selection</span>
</div>
</div>
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator">2</div>
<span class="step-label">Requirements</span>
</div>
</div>
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator">3</div>
<span class="step-label">Contact details</span>
</div>
</div>
</div>
`;
form.prepend(stepProgress);
const stepButtons = document.createElement('div');
stepButtons.className = 'step-buttons';
const backBtn = document.createElement('button');
backBtn.type = 'button';
backBtn.id = 'backBtn';
backBtn.textContent = 'Back';
backBtn.style.display = 'none';
const nextBtn = document.createElement('button');
nextBtn.type = 'button';
nextBtn.id = 'nextBtn';
nextBtn.textContent = 'Next';
stepButtons.appendChild(backBtn);
stepButtons.appendChild(nextBtn);
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
form.insertBefore(stepButtons, hsSubmit);
}
const indicators = document.querySelectorAll('.step-indicator');
const totalSteps = 3;
let currentStep = 0;
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'flex' : 'none';
}
if (step === 2) {
backBtn.style.display = 'inline-block';
if (!hsSubmit.contains(backBtn)) {
hsSubmit.prepend(backBtn);
}
} else {
stepButtons.appendChild(backBtn);
backBtn.style.display = step > 0 ? 'inline-block' : 'none';
}
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
if (i < step) {
el.classList.add('completed');
} else {
el.classList.remove('completed');
}
});
};
const validateStep = (step) => {
let valid = true;
stepFields[step].forEach(name => {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
const wrapper = field.closest('.hs-form-field');
const errorBox = wrapper?.querySelector('.hs-error-msgs');
if (field.hasAttribute('required') && !field.value.trim()) {
valid = false;
if (errorBox) errorBox.style.display = 'block';
field.classList.add('input-error');
} else {
if (errorBox) errorBox.style.display = 'none';
field.classList.remove('input-error');
}
}
});
return valid;
};
updateStep(currentStep);
nextBtn.addEventListener('click', () => {
if (currentStep < totalSteps - 1 && validateStep(currentStep)) {
currentStep++;
updateStep(currentStep);
}
});
backBtn.addEventListener('click', () => {
if (currentStep > 0) {
currentStep--;
updateStep(currentStep);
}
});
}, 100);
}
});
</script>
—
Let me know if you want the buttons to appear **centered** or **side by side with equal width** — or if you need a **mobile layout tweak**.
Here's your updated full JavaScript with only that change:
—
### ✅ JavaScript Fix (just replace the “ part):
<script src="https://js.hsforms.net/forms/v2.js" charset="utf-8"></script>
<script>
hbspt.forms.create({
portalId: "6868748",
formId: "7e1746ed-1467-45f2-b011-d8edae5509a5",
target: "#hubspot-form-2",
onFormReady: function () {
const waitForFields = setInterval(() => {
const form = document.querySelector('#hubspot-form-2 form');
const allFields = form?.querySelectorAll('.hs-form-field');
if (!form || !allFields || allFields.length < 5) return;
clearInterval(waitForFields);
const stepFields = {
0: ['welche_produkte_wollen_sie_live_sehen_'],
1: ['message'],
2: []
};
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
if (input && input.name && !Object.values(stepFields).flat().includes(input.name)) {
stepFields[2].push(input.name);
}
});
const stepProgress = document.createElement('div');
stepProgress.innerHTML = `
<div id="step-progress">
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator active">1</div>
<span class="step-label">Product selection</span>
</div>
</div>
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator">2</div>
<span class="step-label">Requirements</span>
</div>
</div>
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator">3</div>
<span class="step-label">Contact details</span>
</div>
</div>
</div>
`;
form.prepend(stepProgress);
const stepButtons = document.createElement('div');
stepButtons.className = 'step-buttons';
const backBtn = document.createElement('button');
backBtn.type = 'button';
backBtn.id = 'backBtn';
backBtn.textContent = 'Back';
const nextBtn = document.createElement('button');
nextBtn.type = 'button';
nextBtn.id = 'nextBtn';
nextBtn.textContent = 'Next';
stepButtons.appendChild(nextBtn);
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
form.insertBefore(stepButtons, hsSubmit);
}
const indicators = document.querySelectorAll('.step-indicator');
const totalSteps = 3;
let currentStep = 0;
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'flex' : 'none';
// Move Back button into Submit block only on last step
if (step === 2) {
if (!hsSubmit.contains(backBtn)) {
hsSubmit.prepend(backBtn);
}
backBtn.style.display = 'inline-block';
} else {
if (hsSubmit.contains(backBtn)) {
hsSubmit.removeChild(backBtn);
}
backBtn.style.display = 'none';
}
}
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
if (i < step) {
el.classList.add('completed');
} else {
el.classList.remove('completed');
}
});
};
const validateStep = (step) => {
let valid = true;
stepFields[step].forEach(name => {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
const wrapper = field.closest('.hs-form-field');
const errorBox = wrapper?.querySelector('.hs-error-msgs');
if (field.hasAttribute('required') && !field.value.trim()) {
valid = false;
if (errorBox) errorBox.style.display = 'block';
field.classList.add('input-error');
} else {
if (errorBox) errorBox.style.display = 'none';
field.classList.remove('input-error');
}
}
});
return valid;
};
updateStep(currentStep);
nextBtn.addEventListener('click', () => {
if (currentStep < totalSteps - 1 && validateStep(currentStep)) {
currentStep++;
updateStep(currentStep);
}
});
backBtn.addEventListener('click', () => {
if (currentStep > 0) {
currentStep--;
updateStep(currentStep);
}
});
}, 100);
}
});
</script>
—
This ensures:
– **Next button only appears on Step 1 and 2**
– **Back button only appears inside Submit area on Step 3**
– **Submit button layout remains intact**
Let me know if you also want to **center-align them or apply a different flex behavior** for mobile.
Let’s clarify the **desired behavior**:
– ✅ **Step 1**: Only **Next** button
– ✅ **Step 2**: Show **Back** and **Next** buttons inside `.step-buttons`
– ✅ **Step 3**: Show **Back** and **Submit** buttons inside `.hs_submit`
– ❌ **No duplicated Back buttons**
—
### ✅ Fix (Update only the `updateStep` function logic below):
Replace the `updateStep` function in your current script with this:
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'flex' : 'none';
}
// Reset Back button position
if (backBtn.parentElement) backBtn.parentElement.removeChild(backBtn);
if (step === 2) {
// Step 3: Move Back into submit block
backBtn.style.display = 'inline-block';
hsSubmit.prepend(backBtn);
} else if (step === 1) {
// Step 2: Show Back in step-buttons
backBtn.style.display = 'inline-block';
stepButtons.insertBefore(backBtn, nextBtn);
} else {
backBtn.style.display = 'none';
}
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
if (i < step) {
el.classList.add('completed');
} else {
el.classList.remove('completed');
}
});
};
—
Now the behavior will be exactly as intended:
| Step | Back Button | Next Button | Submit |
|——|————-|————-|——–|
| 1 | ❌ | ✅ | ❌ |
| 2 | ✅ (below form) | ✅ | ❌ |
| 3 | ✅ (beside Submit) | ❌ | ✅ |
Let me know if you want smooth slide transitions or any responsive tweaks.
<style>
.hub-multistep-btn {
background-color: #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
}
#step-progress {
margin: 20px 0;
text-align: center;
display: flex;
justify-content: space-between;
align-items: center;
}
.step-indicator {
display: inline-block;
width: 30px;
height: 30px;
line-height: 30px;
border-radius: 50%;
margin: 0 5px;
font-size: 10px;
font-weight: 600;
position: relative;
text-align: center;
border: 1px solid #000221;
color: #000221;
}
.step-indicator.active {
background-color: #00b4d5 !important;
border-color: #00b4d5 !important;
color: #a8eeff;
}
.step-head-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
position: relative;
}
.steps-container {
display: flex;
position: relative;
}
.steps-container:not(:last-child)::after {
content: '';
position: absolute;
top: 15px;
left: 75%;
right: -217%;
height: 1px;
background-color: #babfc5;
z-index: 0;
}
.step-head-container.completed .step-indicator {
background-color: #000221 !important;
border: 1px solid #5fdb3a;
color: #fafafa;
}
.hs_test___letzte_konversion__asset_tag_.hs-test___letzte_konversion__asset_tag_.hs-fieldtype-select.field.hs-form-field {
display: none !important;
}
span.hs-form-required {
padding-left: 5px;
color: #9b0077;
}
.hs-form-field input:not([type=checkbox]), .hs-form-field select, .hs-input.hs-fieldtype-textarea {
color: #000221;
font-size: 18px;
height: 45px;
transition: border-bottom .2s ease-in-out, background-color .2s ease-in-out, color .2s ease-in-out;
width: 100% !important;
background-color: #fff ;
border: 1px solid #ccccd3;
border-radius: 6px !important;
padding: 10px;
}
.hs_hs_language.hs-hs_language.hs-fieldtype-select.field.hs-form-field {
display: none !important;
}
.hs-form-private fieldset {
margin-bottom: 0 !important;
}
.step-buttons {
margin-top: 30px;
text-align: center;
display: flex;
gap: 12px;
}
.step-buttons button {
background-color: #00b4d5;
border: 1px solid #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
color: #fff;
flex: 1;
}
.step-buttons button#nextBtn:hover {
background-color: #0092ad !important;
color: #fff !important;
}
.step-buttons button#backBtn {
background-color: #fff;
color: #00b4d5;
border: 1px solid #00b4d5;
flex: 1;
}
.step-buttons button#backBtn:hover {
background-color: #00b4d5;
color: #fff;
}
.hs-form-field {
margin-bottom: 20px;
}
.input-error {
border-color: red !important;
}
.hs-error-msgs {
display: block !important;
color: red;
font-size: 14px;
margin-top: 4px;
}
.hs-input[type=checkbox] {
appearance: none;
background-color: #fff ;
border: 1px solid #717e86;
border-radius: 4px;
cursor: pointer;
height: 30px;
width: 30px !important;
transition: background-color .2s ease, border .5s ease;
}
.hs-input[type=checkbox]:checked {
background-color: #00b4d5 !important;
}
.hs-input[type=checkbox]:checked:after {
background-color: #00b4d5;
border-radius: 50%;
color: #fff;
content: "✓";
display: flex;
border: 1px solid #fff;
font-size: 11px;
justify-content: center;
left: 50%;
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
width: 16px;
height: 18px;
}
.hs_welche_produkte_wollen_sie_live_sehen_.hs-welche_produkte_wollen_sie_live_sehen_.hs-fieldtype-checkbox.field.hs-form-field label > span:first-child {
font-size: 14px;
font-weight: 500;
line-height: 30px;
text-align: left;
color: #33354d;
}
.hs_submit.hs-submit {
width: 50%;
margin-bottom: 0px !important;
}
input.hs-button.primary.large {
width: 100%;
padding: 0;
}
input:focus , textarea:focus , select:focus{
background-color: #eaf8fc !important;
border: 1px solid #00b4d5;
box-shadow: none !important;
color: #000221;
outline: none !important;
}
.hs-form-private ul li {
margin-block: 10px;
}
.hs-form-booleancheckbox label, .hs-form-checkbox label {
align-items: center;
}
</style>
<script>
</script>
<script>
hbspt.forms.create({
portalId: "6868748",
formId: "376e8c84-cbc6-408f-8899-55c2af1436ee",
target: "#hubspot-form",
onFormReady: function () {
const waitForFields = setInterval(() => {
const form = document.querySelector('#hubspot-form form');
const allFields = form?.querySelectorAll('.hs-form-field');
if (!form || !allFields || allFields.length < 5) return;
clearInterval(waitForFields);
const stepFields = {
0: ['welche_produkte_wollen_sie_live_sehen_'],
1: ['message'],
2: []
};
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
if (input && input.name && !Object.values(stepFields).flat().includes(input.name)) {
stepFields[2].push(input.name);
}
});
const stepProgress = document.createElement('div');
stepProgress.innerHTML = `
<div id="step-progress">
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">1 </div><span class="step-label">Produktauswahl</span></div></div>
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">2 </div><span class="step-label">Anforderungen</span></div></div>
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">3 </div><span class="step-label">Kontaktdaten</span></div></div>
</div>
`;
form.prepend(stepProgress);
const stepButtons = document.createElement('div');
stepButtons.className = 'step-buttons';
stepButtons.innerHTML = `
<button type="button" id="backBtn" style="display: none;">Zurück</button>
<button type="button" id="nextBtn">Anforderungen angeben</button>
`;
const backBtn = stepButtons.querySelector('#backBtn');
const nextBtn = stepButtons.querySelector('#nextBtn');
const indicators = document.querySelectorAll('.step-indicator');
const headContainers = document.querySelectorAll('.step-head-container');
const totalSteps = 3;
let currentStep = 0;
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'inline-block' : 'none';
}
backBtn.style.display = step > 0 ? 'inline-block' : 'none';
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
nextBtn.textContent = step === totalSteps - 2 ? 'Kontaktdaten eingeben' : 'Anforderungen angeben';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
const container = headContainers[i];
if (i < step) {
container.classList.add('completed');
} else {
container.classList.remove('completed');
}
});
};
const validateStep = (step) => {
let valid = true;
stepFields[step].forEach(name => {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
const wrapper = field.closest('.hs-form-field');
const errorBox = wrapper?.querySelector('.hs-error-msgs');
if (field.hasAttribute('required') && !field.value.trim()) {
valid = false;
if (errorBox) errorBox.style.display = 'block';
field.classList.add('input-error');
} else {
if (errorBox) errorBox.style.display = 'none';
field.classList.remove('input-error');
}
}
});
return valid;
};
updateStep(currentStep);
nextBtn.addEventListener('click', () => {
if (currentStep === totalSteps - 1) {
if (validateStep(currentStep)) form.requestSubmit();
} else {
if (validateStep(currentStep)) {
currentStep++;
updateStep(currentStep);
}
}
});
backBtn.addEventListener('click', () => {
if (currentStep > 0) {
currentStep--;
updateStep(currentStep);
}
});
// Move HubSpot submit button into step-buttons container
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = 'none'; // Hide from original position
stepButtons.appendChild(hsSubmit); // Append it into button container
}
form.appendChild(stepButtons); // Place buttons at bottom of form
}, 100);
}
});
</script>
and return me full code
– ✅ Step 1: Only “Next” button
– ✅ Step 2: “Back” + “Next” buttons
– ✅ Step 3: “Back” + “Submit” buttons side-by-side
– ✅ Submit button stays native and functional
—
### ✅ Final HTML, CSS & JS (complete with requested logic)
<div id="hubspot-form"></div>
<style>
/* ... [CSS remains unchanged, already included above] ... */
</style>
<script src="https://js.hsforms.net/forms/v2.js" charset="utf-8"></script>
<script>
hbspt.forms.create({
portalId: "6868748",
formId: "376e8c84-cbc6-408f-8899-55c2af1436ee",
target: "#hubspot-form",
onFormReady: function () {
const waitForFields = setInterval(() => {
const form = document.querySelector('#hubspot-form form');
const allFields = form?.querySelectorAll('.hs-form-field');
if (!form || !allFields || allFields.length < 5) return;
clearInterval(waitForFields);
const stepFields = {
0: ['welche_produkte_wollen_sie_live_sehen_'],
1: ['message'],
2: []
};
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
if (input && input.name && !Object.values(stepFields).flat().includes(input.name)) {
stepFields[2].push(input.name);
}
});
const stepProgress = document.createElement('div');
stepProgress.innerHTML = `
<div id="step-progress">
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator active">1</div>
<span class="step-label">Produktauswahl</span>
</div>
</div>
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator">2</div>
<span class="step-label">Anforderungen</span>
</div>
</div>
<div class="steps-container">
<div class="step-head-container">
<div class="step-indicator">3</div>
<span class="step-label">Kontaktdaten</span>
</div>
</div>
</div>
`;
form.prepend(stepProgress);
const stepButtons = document.createElement('div');
stepButtons.className = 'step-buttons';
const backBtn = document.createElement('button');
backBtn.type = 'button';
backBtn.id = 'backBtn';
backBtn.textContent = 'Zurück';
const nextBtn = document.createElement('button');
nextBtn.type = 'button';
nextBtn.id = 'nextBtn';
nextBtn.textContent = 'Anforderungen angeben';
stepButtons.appendChild(nextBtn); // initially only next
const indicators = document.querySelectorAll('.step-indicator');
const headContainers = document.querySelectorAll('.step-head-container');
const totalSteps = 3;
let currentStep = 0;
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'flex' : 'none';
// Reset Back button position
if (backBtn.parentElement) backBtn.parentElement.removeChild(backBtn);
if (step === 2) {
backBtn.style.display = 'inline-block';
hsSubmit.prepend(backBtn);
} else if (step === 1) {
backBtn.style.display = 'inline-block';
if (!stepButtons.contains(backBtn)) {
stepButtons.insertBefore(backBtn, nextBtn);
}
}
}
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
nextBtn.textContent = step === totalSteps - 2 ? 'Kontaktdaten eingeben' : 'Anforderungen angeben';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
const container = headContainers[i];
if (i < step) {
container.classList.add('completed');
} else {
container.classList.remove('completed');
}
});
};
const validateStep = (step) => {
let valid = true;
stepFields[step].forEach(name => {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
const wrapper = field.closest('.hs-form-field');
const errorBox = wrapper?.querySelector('.hs-error-msgs');
if (field.hasAttribute('required') && !field.value.trim()) {
valid = false;
if (errorBox) errorBox.style.display = 'block';
field.classList.add('input-error');
} else {
if (errorBox) errorBox.style.display = 'none';
field.classList.remove('input-error');
}
}
});
return valid;
};
updateStep(currentStep);
nextBtn.addEventListener('click', () => {
if (currentStep === totalSteps - 1) {
if (validateStep(currentStep)) form.requestSubmit();
} else {
if (validateStep(currentStep)) {
currentStep++;
updateStep(currentStep);
}
}
});
backBtn.addEventListener('click', () => {
if (currentStep > 0) {
currentStep--;
updateStep(currentStep);
}
});
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = 'none';
stepButtons.appendChild(hsSubmit);
}
form.appendChild(stepButtons);
}, 100);
}
});
</script>
—
✅ This version:
– Shows the **Back button only on steps 2 and 3**
– Places it inside `.hs_submit` next to the Submit button **only on Step 3**
– Retains the original submit logic
Let me know if you want animated transitions between steps or mobile responsiveness tweaks!
<style>
.hub-multistep-btn {
background-color: #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
}
#step-progress {
margin: 20px 0;
text-align: center;
display: flex;
justify-content: space-between;
align-items: center;
}
.step-indicator {
display: inline-block;
width: 30px;
height: 30px;
line-height: 30px;
border-radius: 50%;
margin: 0 5px;
font-size: 10px;
font-weight: 600;
position: relative;
text-align: center;
border: 1px solid #000221;
color: #000221;
}
.step-indicator.active {
background-color: #00b4d5 !important;
border-color: #00b4d5 !important;
color: #a8eeff;
}
.step-head-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
position: relative;
}
.steps-container {
display: flex;
position: relative;
}
.steps-container:not(:last-child)::after {
content: '';
position: absolute;
top: 15px;
left: 75%;
right: -217%;
height: 1px;
background-color: #babfc5;
z-index: 0;
}
.step-head-container.completed .step-indicator {
background-color: #000221 !important;
border: 1px solid #5fdb3a;
color: #fafafa;
}
.hs_test___letzte_konversion__asset_tag_.hs-test___letzte_konversion__asset_tag_.hs-fieldtype-select.field.hs-form-field {
display: none !important;
}
span.hs-form-required {
padding-left: 5px;
color: #9b0077;
}
.hs-form-field input:not([type=checkbox]), .hs-form-field select, .hs-input.hs-fieldtype-textarea {
color: #000221;
font-size: 18px;
height: 45px;
transition: border-bottom .2s ease-in-out, background-color .2s ease-in-out, color .2s ease-in-out;
width: 100% !important;
background-color: #fff ;
border: 1px solid #ccccd3;
border-radius: 6px !important;
padding: 10px;
}
.hs_hs_language.hs-hs_language.hs-fieldtype-select.field.hs-form-field {
display: none !important;
}
.hs-form-private fieldset {
margin-bottom: 0 !important;
}
.step-buttons {
margin-top: 30px;
text-align: center;
display: flex;
gap: 12px;
}
.step-buttons button {
background-color: #00b4d5;
border: 1px solid #00b4d5;
border-radius: 25px;
font-weight: 600;
min-height: 40px;
cursor: pointer;
width: 100%;
font-size: 15px;
text-align: center;
transition: all .3s;
fill: #fff;
color: #fff;
flex: 1;
}
.step-buttons button#nextBtn:hover {
background-color: #0092ad !important;
color: #fff !important;
}
.step-buttons button#backBtn {
background-color: #fff;
color: #00b4d5;
border: 1px solid #00b4d5;
flex: 1;
}
.step-buttons button#backBtn:hover {
background-color: #00b4d5;
color: #fff;
}
.hs-form-field {
margin-bottom: 20px;
}
.input-error {
border-color: red !important;
}
.hs-error-msgs {
display: block !important;
color: red;
font-size: 14px;
margin-top: 4px;
}
.hs-input[type=checkbox] {
appearance: none;
background-color: #fff ;
border: 1px solid #717e86;
border-radius: 4px;
cursor: pointer;
height: 30px;
width: 30px !important;
transition: background-color .2s ease, border .5s ease;
}
.hs-input[type=checkbox]:checked {
background-color: #00b4d5 !important;
}
.hs-input[type=checkbox]:checked:after {
background-color: #00b4d5;
border-radius: 50%;
color: #fff;
content: "✓";
display: flex;
border: 1px solid #fff;
font-size: 11px;
justify-content: center;
left: 50%;
position: absolute;
top: 50%;
transform: translate(-50%, -50%);
width: 16px;
height: 18px;
}
.hs_welche_produkte_wollen_sie_live_sehen_.hs-welche_produkte_wollen_sie_live_sehen_.hs-fieldtype-checkbox.field.hs-form-field label > span:first-child {
font-size: 14px;
font-weight: 500;
line-height: 30px;
text-align: left;
color: #33354d;
}
.hs_submit.hs-submit {
width: 50%;
margin-bottom: 0px !important;
}
input.hs-button.primary.large {
width: 100%;
padding: 0;
}
input:focus , textarea:focus , select:focus{
background-color: #eaf8fc !important;
border: 1px solid #00b4d5;
box-shadow: none !important;
color: #000221;
outline: none !important;
}
.hs-form-private ul li {
margin-block: 10px;
}
.hs-form-booleancheckbox label, .hs-form-checkbox label {
align-items: center;
}
</style>
<script>
</script>
<script>
hbspt.forms.create({
portalId: "6868748",
formId: "376e8c84-cbc6-408f-8899-55c2af1436ee",
target: "#hubspot-form",
onFormReady: function () {
const waitForFields = setInterval(() => {
const form = document.querySelector('#hubspot-form form');
const allFields = form?.querySelectorAll('.hs-form-field');
if (!form || !allFields || allFields.length < 5) return;
clearInterval(waitForFields);
const stepFields = {
0: ['welche_produkte_wollen_sie_live_sehen_'],
1: ['message'],
2: []
};
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
if (input && input.name && !Object.values(stepFields).flat().includes(input.name)) {
stepFields[2].push(input.name);
}
});
const stepProgress = document.createElement('div');
stepProgress.innerHTML = `
<div id="step-progress">
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">1 </div><span class="step-label">Produktauswahl</span></div></div>
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">2 </div><span class="step-label">Anforderungen</span></div></div>
<div class="steps-container"> <div class="step-head-container"><div class="step-indicator active">3 </div><span class="step-label">Kontaktdaten</span></div></div>
</div>
`;
form.prepend(stepProgress);
const stepButtons = document.createElement('div');
stepButtons.className = 'step-buttons';
stepButtons.innerHTML = `
<button type="button" id="backBtn" style="display: none;">Zurück</button>
<button type="button" id="nextBtn">Anforderungen angeben</button>
`;
const backBtn = stepButtons.querySelector('#backBtn');
const nextBtn = stepButtons.querySelector('#nextBtn');
const indicators = document.querySelectorAll('.step-indicator');
const headContainers = document.querySelectorAll('.step-head-container');
const totalSteps = 3;
let currentStep = 0;
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'inline-block' : 'none';
}
backBtn.style.display = step > 0 ? 'inline-block' : 'none';
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
nextBtn.textContent = step === totalSteps - 2 ? 'Kontaktdaten eingeben' : 'Anforderungen angeben';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
const container = headContainers[i];
if (i < step) {
container.classList.add('completed');
} else {
container.classList.remove('completed');
}
});
};
const validateStep = (step) => {
let valid = true;
stepFields[step].forEach(name => {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
const wrapper = field.closest('.hs-form-field');
const errorBox = wrapper?.querySelector('.hs-error-msgs');
if (field.hasAttribute('required') && !field.value.trim()) {
valid = false;
if (errorBox) errorBox.style.display = 'block';
field.classList.add('input-error');
} else {
if (errorBox) errorBox.style.display = 'none';
field.classList.remove('input-error');
}
}
});
return valid;
};
updateStep(currentStep);
nextBtn.addEventListener('click', () => {
if (currentStep === totalSteps - 1) {
if (validateStep(currentStep)) form.requestSubmit();
} else {
if (validateStep(currentStep)) {
currentStep++;
updateStep(currentStep);
}
}
});
backBtn.addEventListener('click', () => {
if (currentStep > 0) {
currentStep--;
updateStep(currentStep);
}
});
// Move HubSpot submit button into step-buttons container
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = 'none'; // Hide from original position
stepButtons.appendChild(hsSubmit); // Append it into button container
}
form.appendChild(stepButtons); // Place buttons at bottom of form
}, 100);
}
});
</script>
– ✅ The **Back button is inside the `.step-buttons`** only on step 2
– ✅ On step 3, it **moves inside the `.hs_submit` block**, next to the submit button
– ✅ Works seamlessly with existing HubSpot form submit logic
—
### ✅ ✅ Final JavaScript Only (just replace your “ tag with this one):
<script src="https://js.hsforms.net/forms/v2.js" charset="utf-8"></script>
<script>
hbspt.forms.create({
portalId: "6868748",
formId: "376e8c84-cbc6-408f-8899-55c2af1436ee",
target: "#hubspot-form",
onFormReady: function () {
const waitForFields = setInterval(() => {
const form = document.querySelector('#hubspot-form form');
const allFields = form?.querySelectorAll('.hs-form-field');
if (!form || !allFields || allFields.length < 5) return;
clearInterval(waitForFields);
const stepFields = {
0: ['welche_produkte_wollen_sie_live_sehen_'],
1: ['message'],
2: []
};
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
if (input && input.name && !Object.values(stepFields).flat().includes(input.name)) {
stepFields[2].push(input.name);
}
});
const stepProgress = document.createElement('div');
stepProgress.innerHTML = `
<div id="step-progress">
<div class="steps-container"><div class="step-head-container"><div class="step-indicator active">1</div><span class="step-label">Produktauswahl</span></div></div>
<div class="steps-container"><div class="step-head-container"><div class="step-indicator">2</div><span class="step-label">Anforderungen</span></div></div>
<div class="steps-container"><div class="step-head-container"><div class="step-indicator">3</div><span class="step-label">Kontaktdaten</span></div></div>
</div>
`;
form.prepend(stepProgress);
const stepButtons = document.createElement('div');
stepButtons.className = 'step-buttons';
const backBtn = document.createElement('button');
backBtn.type = 'button';
backBtn.id = 'backBtn';
backBtn.textContent = 'Zurück';
backBtn.style.display = 'none';
const nextBtn = document.createElement('button');
nextBtn.type = 'button';
nextBtn.id = 'nextBtn';
nextBtn.textContent = 'Anforderungen angeben';
stepButtons.appendChild(backBtn);
stepButtons.appendChild(nextBtn);
const indicators = document.querySelectorAll('.step-indicator');
const headContainers = document.querySelectorAll('.step-head-container');
const totalSteps = 3;
let currentStep = 0;
const updateStep = (step) => {
allFields.forEach(field => {
const input = field.querySelector('input, select, textarea');
const name = input?.name;
field.style.display = stepFields[step].includes(name) ? 'block' : 'none';
});
const consentText = form.querySelector('.legal-consent-container');
if (consentText) {
consentText.style.display = step === 2 ? 'block' : 'none';
}
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = step === 2 ? 'flex' : 'none';
}
// Reset Back button location each step
if (backBtn.parentElement) backBtn.parentElement.removeChild(backBtn);
if (step === 2 && hsSubmit) {
backBtn.style.display = 'inline-block';
hsSubmit.prepend(backBtn);
} else if (step === 1) {
backBtn.style.display = 'inline-block';
stepButtons.insertBefore(backBtn, nextBtn);
} else {
backBtn.style.display = 'none';
}
nextBtn.style.display = step === 2 ? 'none' : 'inline-block';
nextBtn.textContent = step === totalSteps - 2 ? 'Kontaktdaten eingeben' : 'Anforderungen angeben';
indicators.forEach((el, i) => {
el.classList.toggle('active', i === step);
const container = headContainers[i];
if (i < step) {
container.classList.add('completed');
} else {
container.classList.remove('completed');
}
});
};
const validateStep = (step) => {
let valid = true;
stepFields[step].forEach(name => {
const field = form.querySelector(`[name="${name}"]`);
if (field) {
const wrapper = field.closest('.hs-form-field');
const errorBox = wrapper?.querySelector('.hs-error-msgs');
if (field.hasAttribute('required') && !field.value.trim()) {
valid = false;
if (errorBox) errorBox.style.display = 'block';
field.classList.add('input-error');
} else {
if (errorBox) errorBox.style.display = 'none';
field.classList.remove('input-error');
}
}
});
return valid;
};
updateStep(currentStep);
nextBtn.addEventListener('click', () => {
if (currentStep === totalSteps - 1) {
if (validateStep(currentStep)) form.requestSubmit();
} else {
if (validateStep(currentStep)) {
currentStep++;
updateStep(currentStep);
}
}
});
backBtn.addEventListener('click', () => {
if (currentStep > 0) {
currentStep--;
updateStep(currentStep);
}
});
const hsSubmit = form.querySelector('.hs_submit');
if (hsSubmit) {
hsSubmit.style.display = 'none';
stepButtons.appendChild(hsSubmit);
}
form.appendChild(stepButtons);
}, 100);
}
});
</script>
—
Let me know if you'd also like to:
– Animate transitions between steps
– Translate button labels or step labels
– Auto-scroll to the top of the form on step change
Happy to tweak!