如何实现signIn与signUp表单的点击切换显示隐藏功能
实现登录/注册表单切换功能
要完成点击「Sign up here」显示注册表单、点击「Login here」显示登录表单的切换效果,对现有代码做以下几处修改即可实现:
关键调整点
- 默认隐藏注册表单,初始仅展示登录表单
- 为切换链接添加唯一标识并绑定点击事件
- 修复重复ID问题,避免JS选择器失效
- 添加表单切换逻辑,控制显示/隐藏状态
修改后的HTML代码
<div class="main"> <div class="signIn"> <div class="container"> <div class="header"> <h2>Login</h2> </div> <!-- 修正重复表单ID --> <form class="form" id="signInForm"> <div class="form-control"> <label for="signInEmail">Email</label> <!-- 修正重复输入框ID --> <input type="email" placeholder="" id="signInEmail" /> </div> <div class="form-control"> <label for="signInPassword">Password</label> <input type="password" id="signInPassword" /> </div> <button>Submit</button> </form> </div> <div class="footer"> <!-- 添加切换按钮ID,修改href阻止页面跳转 --> <p>Not have an account? <a href="#" id="showSignUp">Sign Up Here</a></p> </div> </div> <div id="signUpID" class="signUp"> <div class="container"> <div class="header"> <h2>Create Account</h2> </div> <!-- 修正重复表单ID --> <form id="signUpForm" class="form"> <div class="form-control"> <label for="username">Username</label> <input type="text" placeholder="Yeroma" id="username" /> <i class="fas fa-check-circle"></i> <i class="fas fa-exclamation-circle"></i> <small>Error message</small> </div> <div class="form-control"> <label for="signUpEmail">Email</label> <!-- 修正重复输入框ID --> <input type="email" placeholder="210103293@stu.sdu.edu.kz" id="signUpEmail" /> <i class="fas fa-check-circle"></i> <i class="fas fa-exclamation-circle"></i> <small>Error message</small> </div> <div class="form-control"> <label for="signUpPassword">Password</label> <!-- 修正重复输入框ID --> <input type="password" placeholder="password" id="signUpPassword" /> <i class="fas fa-check-circle"></i> <i class="fas fa-exclamation-circle"></i> <small>Error message</small> </div> <div class="form-control"> <label for="password2">Password verification</label> <input type="password" placeholder="password" id="password2" /> <i class="fas fa-check-circle"></i> <i class="fas fa-exclamation-circle"></i> <small>Error message</small> </div> <button>Submit</button> <div class="footer"> <br> <p>By clicking the Sign Up button, you agree to our </p> <p><a href="#">Terms and Condition</a> and <a href="#">Policy Privacy</a></p> </div> </form> </div> <div class="footer"> <!-- 修改href阻止页面跳转,保留切换按钮ID --> <p>Already have an account? <a href="#" id="showSignIn">Login here</a></p> </div> </div> </div>
修改后的CSS代码
@import url('https://fonts.googleapis.com/css?family=Muli&display=swap'); @import url('https://fonts.googleapis.com/css?family=Open+Sans:400,500&display=swap'); * { box-sizing: border-box; } .main { margin-top: 50px; } body { background-color: plum; font-family: 'Open Sans', sans-serif; display: flex; align-items: center; justify-content: center; margin-right: 25%; } .container { background-color: white; border-radius: 5px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); overflow: hidden; width: 420px; max-width: 100%; } .header { border-bottom: 1px solid white; background-color: whitesmoke; padding: 20px 40px; } .header h2 { margin: 0; } .form { padding: 30px 40px; } .form-control { margin-bottom: 10px; padding-bottom: 20px; position: relative; } .form-control label { display: inline-block; margin-bottom: 5px; } .form-control input { border: 2px solid whitesmoke; border-radius: 4px; display: block; font-family: inherit; font-size: 14px; padding: 10px; width: 100%; } .form-control.success input { border-color: #2ecc71; } .form-control.error input { border-color: #e74c3c; } .form-control i { position: absolute; top: 40px; right: 10px; visibility: hidden; } .form-control.success i.fa-check-circle { color: #2ecc71; visibility: visible; } .form-control.error i.fa-exclamation-circle { color: #e74c3c; visibility: visible; } .form-control small { color: #e74c3c; visibility: hidden; position: absolute; bottom: 0; left: 0; } .form-control.error small { visibility: visible; } .form button { background-color: purple; border: 2px solid purple; border-radius: 4px; color: white; display: block; font-family: inherit; font-size: 16px; padding: 10px; width: 100%; } .footer p { font-size: 14px; } .main a { color: black; } /* 默认隐藏注册表单 */ .signUp { display: none; } /* 让两个表单重叠,切换更自然 */ .signIn, .signUp { position: absolute; }
修改后的JavaScript代码
// 获取表单元素 const signInForm = document.getElementById('signInForm'); const signUpForm = document.getElementById('signUpForm'); // 获取输入框元素 const username = document.getElementById('username'); const signUpEmail = document.getElementById('signUpEmail'); const signUpPassword = document.getElementById('signUpPassword'); const password2 = document.getElementById('password2'); const signInEmail = document.getElementById('signInEmail'); const signInPassword = document.getElementById('signInPassword'); // 获取切换按钮和容器 const showSignUpBtn = document.getElementById('showSignUp'); const showSignInBtn = document.getElementById('showSignIn'); const signInContainer = document.querySelector('.signIn'); const signUpContainer = document.querySelector('.signUp'); // 登录表单提交验证 signInForm.addEventListener('submit', (e) => { e.preventDefault(); checkSignInInputs(); }); // 注册表单提交验证 signUpForm.addEventListener('submit', (e) => { e.preventDefault(); checkSignUpInputs(); }); // 切换到注册表单 showSignUpBtn.addEventListener('click', () => { signInContainer.style.display = 'none'; signUpContainer.style.display = 'block'; }); // 切换到登录表单 showSignInBtn.addEventListener('click', () => { signUpContainer.style.display = 'none'; signInContainer.style.display = 'block'; }); // 登录表单验证逻辑 function checkSignInInputs() { const emailValue = signInEmail.value.trim(); const passwordValue = signInPassword.value.trim(); if (emailValue === '') { setErrorFor(signInEmail, 'Email cannot be blank'); } else if (!isEmail(emailValue)) { setErrorFor(signInEmail, 'Email is not valid'); } else { setSuccessFor(signInEmail); } if (passwordValue === '') { setErrorFor(signInPassword, 'Password cannot be blank'); } else if (!isPassword(passwordValue)) { setErrorFor(signInPassword, 'Password is not valid') } else { setSuccessFor(signInPassword); } } // 注册表单验证逻辑 function checkSignUpInputs() { const usernameValue = username.value.trim(); const emailValue = signUpEmail.value.trim(); const passwordValue = signUpPassword.value.trim(); const password2Value = password2.value.trim(); if (usernameValue === '') { setErrorFor(username, 'Username cannot be blank'); } else { setSuccessFor(username); } if (emailValue === '') { setErrorFor(signUpEmail, 'Email cannot be blank'); } else if (!isEmail(emailValue)) { setErrorFor(signUpEmail, 'Email is not valid'); } else { setSuccessFor(signUpEmail); } if (passwordValue === '') { setErrorFor(signUpPassword, 'Password cannot be blank'); } else if (!isPassword(passwordValue)) { setErrorFor(signUpPassword, 'Password is not valid') } else { setSuccessFor(signUpPassword); } if (password2Value === '') { setErrorFor(password2, 'Password2 cannot be blank'); } else if (!isPassword(password2Value)) { setErrorFor(password2, 'Password is not valid'); } else if (passwordValue !== password2Value) { setErrorFor(password2, 'Passwords does not match'); } else { setSuccessFor(password2); } } function setErrorFor(input, message) { const formControl = input.parentElement; const small = formControl.querySelector('small'); small.innerText = message; formControl.className = 'form-control error'; } function setSuccessFor(input) { const formControl = input.parentElement; formControl.className = 'form-control success'; } function isEmail(email) { return /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/.test(email); } function isPassword(password) { return /^[A-Za-z]\w{7,14}$/.test(password); }
调整说明
- CSS层:通过
display: none默认隐藏注册表单,给两个表单添加position: absolute让它们重叠,切换时视觉更连贯。 - HTML层:修正重复的表单/输入框ID,给切换链接添加唯一标识并修改
href为#,避免点击时页面跳转。 - JS层:拆分原有的验证逻辑,分别处理登录/注册表单的提交验证;绑定切换按钮的点击事件,通过修改
display属性控制表单的显示与隐藏。
内容的提问来源于stack exchange,提问作者Yerosh
相关产品推荐
相关产品推荐

