创建有效的多步骤表单以获得更好的用户体验
创作时间:
作者:
@小白创作中心
创建有效的多步骤表单以获得更好的用户体验
引用
1
来源
1.
https://www.jiangweishan.com/article/fonmbiaodan23523589.html
多步骤表单是Web开发中常见的一种表单类型,它将复杂的表单数据输入过程分解为多个步骤,从而提高用户体验。本文将详细介绍如何创建一个功能完善的多步骤表单,包括HTML结构、CSS样式、JavaScript交互以及用户体验优化等方面的内容。
表单结构设计
在创建多步骤表单时,首先需要规划各个步骤的逻辑顺序和内容。对于一个工作申请表单,我们可以将其分为以下几个步骤:
- 个人信息:收集申请人的姓名、电子邮件和电话号码。
- 工作经验:收集申请人的最近的公司、职位和工作年限。
- 技能和资格:申请人列出他们的技能并选择他们的最高学位。
- 审核并提交:提供一个机会让申请人在提交前审核所有信息。
根据上述步骤,我们可以设计表单的HTML结构:
<form id="jobApplicationForm">
<!-- Step 1: Personal Information -->
<fieldset class="step" id="step-1">
<legend id="step1Label">Step 1: Personal Information</legend>
<label for="name">Full Name</label>
<input type="text" id="name" name="name" required />
<label for="email">Email Address</label>
<input type="email" id="email" name="email" required />
<label for="phone">Phone Number</label>
<input type="tel" id="phone" name="phone" required />
</fieldset>
<!-- Step 2: Work Experience -->
<fieldset class="step" id="step-2" hidden>
<legend id="step2Label">Step 2: Work Experience</legend>
<label for="company">Most Recent Company</label>
<input type="text" id="company" name="company" required />
<label for="jobTitle">Job Title</label>
<input type="text" id="jobTitle" name="jobTitle" required />
<label for="yearsExperience">Years of Experience</label>
<input type="number" id="yearsExperience" name="yearsExperience" min="0" required />
</fieldset>
<!-- Step 3: Skills & Qualifications -->
<fieldset class="step" id="step-3" hidden>
<legend id="step3Label">Step 3: Skills & Qualifications</legend>
<label for="skills">Skill(s)</label>
<textarea id="skills" name="skills" rows="4" required></textarea>
<label for="highestDegree">Degree Obtained (Highest)</label>
<select id="highestDegree" name="highestDegree" required>
<option value="">Select Degree</option>
<option value="highschool">High School Diploma</option>
<option value="bachelor">Bachelor's Degree</option>
<option value="master">Master's Degree</option>
<option value="phd">Ph.D.</option>
</select>
</fieldset>
<!-- Step 4: Review & Submit -->
<fieldset class="step" id="step-4" hidden>
<legend id="step4Label">Step 4: Review & Submit</legend>
<p>Review your information before submitting the application.</p>
<button type="submit">Submit Application</button>
</fieldset>
</form>
样式设计
为了保持简洁的外观,我们可以使用Simple.css样式框架,并添加一些自定义样式:
body {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
main {
padding: 0 30px;
}
h1 {
font-size: 1.8rem;
text-align: center;
}
.stepper {
display: flex;
justify-content: flex-end;
padding-right: 10px;
}
form {
box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.2);
padding: 12px;
}
input,
textarea,
select {
outline: none;
}
input:valid,
textarea:valid,
select:valid,
input:focus:valid,
textarea:focus:valid,
select:focus:valid {
border-color: green;
}
input:focus:invalid,
textarea:focus:invalid,
select:focus:invalid {
border: 1px solid red;
}
表单导航和验证
为了确保用户在每一步都能获得及时的反馈,我们需要在进入下一步之前验证当前步骤的输入。我们可以通过JavaScript实现这一功能:
<script>
const steps = document.querySelectorAll(".step");
let currentStep = 1;
let errorMsgs = [];
const errorMessagesDiv = document.getElementById("errorMessages");
const currentStepDiv = document.querySelector(".currentStep");
function nextStep() {
errorMsgs = [];
errorMessagesDiv.innerText = "";
switch (currentStep) {
case 1:
addValidationErrors(name, email, phone);
validateStep(errorMsgs);
break;
case 2:
addValidationErrors(company, jobTitle, yearsExperience);
validateStep(errorMsgs);
break;
case 3:
addValidationErrors(skills, highestDegree);
validateStep(errorMsgs);
break;
}
}
function addValidationErrors(fieldOne, fieldTwo, fieldThree = undefined) {
if (!fieldOne.checkValidity()) {
const label = document.querySelector(`label[for="${fieldOne.id}"]`);
errorMsgs.push(`Please Enter A Valid ${label.textContent}`);
}
if (!fieldTwo.checkValidity()) {
const label = document.querySelector(`label[for="${fieldTwo.id}"]`);
errorMsgs.push(`Please Enter A Valid ${label.textContent}`);
}
if (fieldThree && !fieldThree.checkValidity()) {
const label = document.querySelector(`label[for="${fieldThree.id}"]`);
errorMsgs.push(`Please Enter A Valid ${label.textContent}`);
}
if (errorMsgs.length > 0) {
errorMessagesDiv.innerText = errorMsgs.join("\n");
}
}
function validateStep(errorMsgs) {
if (errorMsgs.length === 0) {
showStep(currentStep + 1);
}
}
function showStep(step) {
steps.forEach((el, index) => {
el.hidden = index + 1 !== step;
});
currentStep = step;
currentStepDiv.innerText = currentStep;
localStorage.setItem("storedStep", currentStep);
}
function previousStep() {
errorMessagesDiv.innerText = "";
showStep(currentStep - 1);
}
// Save data on each input event
form.addEventListener("input", () => {
const formData = {
name: document.getElementById("name").value,
email: document.getElementById("email").value,
phone: document.getElementById("phone").value,
company: document.getElementById("company").value,
jobTitle: document.getElementById("jobTitle").value,
yearsExperience: document.getElementById("yearsExperience").value,
skills: document.getElementById("skills").value,
highestDegree: document.getElementById("highestDegree").value,
};
localStorage.setItem("formData", JSON.stringify(formData));
});
// Retrieve data on DOMContentLoaded
window.addEventListener("DOMContentLoaded", () => {
const savedData = JSON.parse(localStorage.getItem("formData"));
if (savedData) {
document.getElementById("name").value = savedData.name || "";
document.getElementById("email").value = savedData.email || "";
document.getElementById("phone").value = savedData.phone || "";
document.getElementById("company").value = savedData.company || "";
document.getElementById("jobTitle").value = savedData.jobTitle || "";
document.getElementById("yearsExperience").value = savedData.yearsExperience || "";
document.getElementById("skills").value = savedData.skills || "";
document.getElementById("highestDegree").value = savedData.highestDegree || "";
}
const storedStep = localStorage.getItem("storedStep");
if (storedStep) {
const storedStepInt = parseInt(storedStep);
steps.forEach((el, index) => {
el.hidden = index + 1 !== storedStepInt;
});
currentStep = storedStepInt;
currentStepDiv.innerText = currentStep;
}
});
// Clear data on form submit
form.addEventListener("submit", () => {
localStorage.removeItem("formData");
localStorage.removeItem("storedStep");
});
</script>
用户体验优化
为了进一步提升用户体验,我们可以添加一个步进器(stepper)来显示当前步骤:
<form id="jobApplicationForm">
<div class="stepper">
<span><span class="currentStep">1</span>/4</span>
</div>
<!-- ... -->
</form>
通过以上步骤,我们可以创建一个功能完善且用户体验良好的多步骤表单。这种表单结构不仅能够帮助用户更清晰地完成复杂的表单填写过程,还能通过即时验证和数据存储等功能提升整体的使用体验。
热门推荐
自闭症儿童的社会支持体系:现状与展望
密歇根州立大学揭秘:自闭症孩子早期干预新招数!
自闭症儿童养育:情感交流与专业干预的双重支持
科技赋能与政策护航:自闭症儿童特殊教育的新趋势
职业健康管理基本原则
游泳8大好處!游泳比陸地運動燃燒更多卡路里,免流汗就能瘦全身!
想利用「跑步机减脂」该怎么做?五种加速燃脂的跑步机运动方式推荐
“健身瘦”和“饿瘦”区别在哪里?看对比图就知道答案,差别很大
运动前吃2种食物燃脂效率翻倍!专家揭秘2大饮食策略
钱塘江南岸最火美食街又要升级了,杭州需要什么样的美食街?
一群朋友旅行中把钱赚了,上海夜市上这支“浙”牌餐车车队开着餐车走天涯
欧洲或将「红酒」踢出“健康推荐”,喝红酒到底好不好?
健康又科学!给老年人的8条专属饮食建议~
神仙居奇峰异石探秘之旅
神仙居:网红打卡与历史文化完美融合的旅游胜地
十三香麻辣小龙虾的做法及配方
江蟹生和宋人爱吃的洗手蟹有什么关系?聊聊温州美食的千年故事
孙悟空:从猴王到斗战胜佛的成长之路
《黑神话:悟空》火爆背后:孙悟空的艺术进化史
孙悟空的心理成长:从叛逆到超越
从妖到佛:孙悟空斩魔后的“心路历程”
全国爱鼻日:如何科学护理你的鼻黏膜?
胆囊虽小,对身体危害不小!预防胆囊炎,出现症状,及时就医
植物蛋白有哪些食物
自闭症儿童的家庭环境如何改善?
自闭症儿童的社交挑战:理解与应对之道
自闭症孩子如何融入社交圈?宝爸宝妈必看!
中医治疗主动脉硬化:现状与展望
中医药新突破:主动脉硬化治疗迎来新希望
退烧后如何科学补充营养?专家建议来了!