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

如何在input标签中实现占位圆点逐字符消失、回退恢复的效果

实现方案

你不需要单独维护圆点的增删逻辑,也不需要监听退格事件,直接通过输入值的长度动态生成圆点列表即可,修改成本极低:

1. 核心逻辑调整

删掉原来的dots状态,直接根据输入值长度和总占位位数动态计算要显示的圆点数量,这样无论是输入新增字符还是删除字符,圆点都会自动匹配:

// VerificationInput.tsx
const TOTAL_PLACEHOLDER_COUNT = 4; // 总占位圆点数量,要6位就改成6
const dotElement = <Dot
    width='11'
    height='11'
    viewBox='0 0 20 20'
    color='#e0e0e0'
  />;
  
const [inputValue, setInputValue] = useState("");

const handleDots = (event: ChangeEvent<HTMLInputElement>) => {
  // 只需要存输入值即可,不需要额外操作圆点
  setInputValue(event.target.value);
};

// ... 其他逻辑保留

<div className='card-num__full'>
  <input
    type='tel'
    autoComplete='on'
    maxLength={TOTAL_PLACEHOLDER_COUNT}
    className='card-num__field'
    value={inputValue}
    onChange={handleDots}
    {...args}
  />
  <div className="dot-container">
    {/* 动态生成圆点:总位数减去已输入的字符数,就是要显示的圆点数量 */}
    {Array(TOTAL_PLACEHOLDER_COUNT - inputValue.length)
      .fill(dotElement)
      .map((dot, idx) => <span key={idx}>{dot}</span>)
    }
  </div>
</div>

2. CSS调整

需要补充几个样式,避免输入内容和圆点重叠,同时保证输入框能正常响应点击:

.card-num__full {
  position: relative;
  width: 56px;
  height: 22px;
  display: flex;
  justify-content: flex-start;
  align-items: center;
}

input.card-num__field {
  position: absolute;
  /* 提高层级保证输入框能被点击 */
  z-index: 2;
  top: 1px;
  width: 56px;
  height: 22px;
  /* 如果要显示输入的数字就删掉下面这行,同时调整字符间距和圆点对齐 */
  color: transparent;
  border: none;
  outline: none;
  background: transparent;
}

.dot-container {
  position: absolute;
  z-index: 1;
  display: flex;
  gap: 8px; /* 调整圆点间距和输入字符间距一致 */
}

如果需要显示输入的字符,只需要删掉color: transparent,再给输入框加letter-spacing属性,让每个字符的间距和圆点的gap值一致即可,保证输入的字符刚好占据一个圆点的位置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:24:02