You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

带动画效果的必填输入框:如何隐藏浏览器默认提示窗口?

实现自定义必填输入框动画+隐藏浏览器默认提示

当然可以搞定这个需求!很多做现代表单的开发者都会遇到类似情况——既要靠required属性来驱动自定义动画,又不想让浏览器自带的生硬提示破坏界面风格。下面给你几种实用的实现方法,选适合你场景的就行:

方案一:拦截表单提交事件,完全自定义验证逻辑

这是最灵活的方案,你可以完全掌控验证流程、动画触发和提示样式,同时保留required属性供动画使用。

示例代码

HTML结构

<form id="modernForm">
  <div class="form-group">
    <label for="username">用户名</label>
    <input type="text" id="username" required class="animated-input">
  </div>
  <button type="submit">提交表单</button>
</form>

CSS动画样式

.animated-input {
  width: 100%;
  padding: 8px 12px;
  border: 2px solid #e0e0e0;
  border-radius: 4px;
  transition: all 0.3s ease;
}

/* 利用required属性触发的:invalid伪类给输入框加样式 */
.animated-input:invalid {
  border-color: #ef5350;
}

/* 自定义抖动动画 */
.shake {
  animation: shake 0.5s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
}

@keyframes shake {
  10%, 90% { transform: translateX(-1px); }
  20%, 80% { transform: translateX(2px); }
  30%, 50%, 70% { transform: translateX(-4px); }
  40%, 60% { transform: translateX(4px); }
}

.error-tip {
  color: #ef5350;
  font-size: 0.85rem;
  margin-top: 4px;
  display: none;
}

JavaScript逻辑

const form = document.getElementById('modernForm');
const usernameInput = document.getElementById('username');
const errorTip = document.createElement('span');
errorTip.className = 'error-tip';
errorTip.textContent = '请填写用户名';
usernameInput.parentNode.appendChild(errorTip);

// 拦截表单提交事件
form.addEventListener('submit', (e) => {
  // 检查输入是否有效(required属性会让validity.valid自动判断)
  if (!usernameInput.validity.valid) {
    e.preventDefault(); // 阻止默认提交和浏览器提示
    
    // 触发抖动动画
    usernameInput.classList.add('shake');
    setTimeout(() => {
      usernameInput.classList.remove('shake');
    }, 500);
    
    // 显示自定义错误提示
    errorTip.style.display = 'block';
    setTimeout(() => {
      errorTip.style.display = 'none';
    }, 2000);
  }
});

// 输入时重置状态
usernameInput.addEventListener('input', () => {
  errorTip.style.display = 'none';
});

方案二:隐藏浏览器默认提示框,保留原生验证状态

如果你想保留部分原生验证逻辑,但只想去掉默认提示框,可以用CSS隐藏浏览器的验证气泡,再配合自定义提示。

关键CSS代码

/* 隐藏Chrome/Safari的验证气泡 */
input::-webkit-validation-bubble {
  display: none !important;
}

/* 隐藏Firefox的验证提示框 */
input::-moz-validation-tooltip {
  display: none !important;
}

注意:这种方法只是隐藏了提示框,但浏览器仍然会阻止表单提交。所以你还是需要像方案一那样监听表单提交事件,自己处理验证失败后的动画和提示。

方案三:使用setCustomValidity()自定义验证消息

通过HTML5的setCustomValidity()方法,你可以控制原生验证的消息内容,甚至让浏览器不显示任何提示,同时保留required属性的状态。

示例代码

const usernameInput = document.getElementById('username');

// 输入时重置验证消息,避免一直提示
usernameInput.addEventListener('input', () => {
  usernameInput.setCustomValidity('');
});

form.addEventListener('submit', (e) => {
  if (!usernameInput.value.trim()) {
    // 如果不想显示任何原生提示,直接阻止提交并触发动画
    e.preventDefault();
    usernameInput.classList.add('shake');
    setTimeout(() => {
      usernameInput.classList.remove('shake');
    }, 500);
    
    // 这里添加你的自定义提示逻辑
    showCustomErrorTip('请填写用户名');
  }
});

总结

推荐优先使用方案一,因为它完全由你控制验证流程和UI表现,能更好地和你的现代化表单动画结合,不会受到浏览器原生行为的限制。

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

火山引擎 最新活动