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

表单Input标签点击上移动画失效,请求技术排查

问题:点击Input后Label上移动画未生效

我尝试实现点击Input时,对应的Label向上移动的动画,逻辑是点击Input时给Label添加包含动画的类,但功能完全没反应。我觉得动画代码和函数逻辑都没问题,找不到问题出在哪。


故障原因与修复方案

1. 类名操作错误(核心问题)

在JS中调用classList.add/remove时,你给类名加了.前缀,比如.username-focus-label-animation,但这个方法只需要传入纯类名字符串,不需要带.。错误的类名导致动画类无法被正确添加到Label元素上,这是动画不生效的直接原因。

2. 动画函数名拼写错误

CSS中动画名usenramefocusLabelAnimation和usenrameBlurLabelAnimation都少了一个字母r,正确应该是usernamefocusLabelAnimation和usernameBlurLabelAnimation,否则即使类名正确,动画也无法触发。

3. 事件监听场景不全

仅监听click事件会漏掉用户通过Tab键聚焦输入框的情况,改用focus和blur事件能覆盖所有输入框聚焦/失焦的场景,体验更完善。


修复后的完整代码

JavaScript

let $ = document
let usernameInputLabel = $.querySelector(".username-input-label")
let usernameInput = $.querySelector(".username-input")

// 聚焦时添加动画类
function focusHandler() {
  usernameInputLabel.classList.add("username-focus-label-animation")
  usernameInputLabel.classList.remove("username-blur-label-animation")
}

// 失焦时移除动画类(如果输入框为空)
function blurHandler() {
  if (!usernameInput.value.trim()) {
    usernameInputLabel.classList.add("username-blur-label-animation")
    usernameInputLabel.classList.remove("username-focus-label-animation")
  }
}

// 绑定事件
usernameInput.addEventListener("focus", focusHandler)
usernameInput.addEventListener("blur", blurHandler)

CSS

* {
  margin: 0;
  padding: 0;
  font-family: urbanist;
}

body {
  height: 100vh;
  background-color: #496d8d;
  display: flex;
  justify-content: center;
  align-items: center;
}

form {
  width: 130%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  gap: 1rem;
}

input {
  border: none;
  border-bottom: 1px solid #082c4c;
  width: 100%;
  background-color: #224f3900;
  padding: 0.2rem 0 0.2rem 0;
  z-index: 99999;
  position: relative;
  color: #ddd;
  font-size: 1.5rem;
  font-weight: 100;
}

input:focus {
  outline: none;
}

.group {
  width: 60%;
}

label {
  display: inline-block;
  transform: translate(0, 2.1rem);
  user-select: none;
  color: #ddd;
}

.username-focus-label-animation {
  animation: usernamefocusLabelAnimation 700ms forwards;
}

@keyframes usernamefocusLabelAnimation {
  from {
    transform: translate(0, 2.1rem);
  }
  to {
    transform: translate(0, 0.1rem);
  }
}

.username-blur-label-animation {
  animation: usernameBlurLabelAnimation 700ms forwards;
}

@keyframes usernameBlurLabelAnimation {
  from {
    transform: translate(0, 0.1rem);
  }
  to {
    transform: translate(0, 2.1rem);
  }
}

button:not(.show-password) {
  background-color: #082c4c;
  scale: 1.8;
  padding: 0.3rem;
  border: none;
  border-radius: 10%;
  cursor: pointer;
  color: #ddd;
  box-shadow: 0 5px 5px 2px #082c4c70, 0 2px 10px -1px #0f497b inset;
  transition: 500ms;
}

button:not(.show-password):hover {
  box-shadow: 0 0px 0px 0px #082c4c70, 0 2px 10px -1px #0f497b inset;
  background-color: #07345b;
}

.heading {
  font-size: 4rem;
  color: #ddd;
  font-weight: 200;
  text-align: center;
  text-shadow: 0 5px 10px #082c4c90, 0 15px 10px #082c4c90, 0 25px 10px #082c4c90;
}

.login-container {
  width: 30%;
  height: 90vh;
  padding: 0.5rem;
  backdrop-filter: blur(20px);
  background-color: #1d5582;
  border-radius: 10%;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  align-items: center;
  gap: 3rem;
  box-shadow: 0 10px 50px 1px #082c4c inset
}

HTML

<div class="login-container">
  <p class="heading">sign in to your account</p>
  <form>
    <div class="username-group group">
      <label class="username-input-label " for="username-input">User name</label>
      <input class="username-input" type="text">
    </div>
    <div class="password-group group">
      <label class="password-input-label" for="password-input">password</label>
      <input class="password-input" type="text">
      <!-- <button class="show-password">show password</button>    -->
    </div>
    <div class="confirm-password-group group">
      <label class="confirm-password-input-label" for="confirm-password-input">confirm password</label>
      <input class="confirm-password-input"></input>
    </div>
    <div class="email-group group">
      <label class="email-input-label" for="email-input">email adress</label>
      <input class="email-input"></input>
    </div>
  </form>
  <button class="sign-up">sign up</button>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:44:52