You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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);
}

调整说明

  1. CSS层:通过display: none默认隐藏注册表单,给两个表单添加position: absolute让它们重叠,切换时视觉更连贯。
  2. HTML层:修正重复的表单/输入框ID,给切换链接添加唯一标识并修改href为#,避免点击时页面跳转。
  3. JS层:拆分原有的验证逻辑,分别处理登录/注册表单的提交验证;绑定切换按钮的点击事件,通过修改display属性控制表单的显示与隐藏。

内容的提问来源于stack exchange,提问作者Yerosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:00:54