靠谱的密码强度校验应拆解为可量化维度(长度、大小写、数字、符号、重复、弱词等)分别计分,而非仅用正则硬匹配;推荐轻量函数实现,配合防抖、ARIA语义化和Tailwind三档色阶进度条。

密码强度校验逻辑怎么写才靠谱
直接用正则硬匹配“必须含大小写字母+数字+符号”是常见误区——用户输个 aA1! 看似满足,但长度只有4位,实际极弱。真正可用的强度判断得拆成可量化维度:长度、小写字母、大写字母、数字、特殊字符、重复字符、常见弱密码词。每个维度给分,总分决定进度条颜色和文案。
推荐用轻量函数而非第三方库,避免引入额外依赖。示例逻辑:
function getPasswordScore(password) {
let score = 0;
if (password.length >= 8) score += 25;
if (/[a-z]/.test(password)) score += 15;
if (/[A-Z]/.test(password)) score += 15;
if (/\d/.test(password)) score += 15;
if (/[^a-zA-Z0-9]/.test(password)) score += 15;
if (!/(.)\1{2,}/.test(password)) score += 15; // 无连续3次重复
if (!['123', 'abc', 'password'].some(w => password.toLowerCase().includes(w))) score += 10;
return Math.min(100, score);
}
Tailwind 进度条如何绑定动态 class
Tailwind 的 utility class 是静态生成的,不能直接写 bg-[#f00] 或拼接字符串。得靠预定义的色阶配合条件判断。核心思路:用 bg-green-500/bg-yellow-500/bg-red-500 分三档,再加 transition-all duration-300 实现平滑过渡。
关键点:
立即学习“前端免费学习笔记(深入)”;
- 进度条容器必须设固定高度(如
h-2),否则动画会跳动 - 进度条本身用
h-full w-0起始,通过w-[0%]→w-[60%]控制宽度 - 不要用
animate-pulse类——它干扰宽度过渡,导致闪烁 - 移动端需加
max-w-xs防止溢出
React/Vue 中怎么实时响应输入并防抖
每次 input 事件都触发校验会太频繁,尤其用户快速打字时。必须加防抖,但别用 Lodash——简单场景自己写 300ms 定时器更轻量。
React 示例(useEffect + useRef):
const [score, setScore] = useState(0);
const timerRef = useRef();
useEffect(() => {
if (!password) {
setScore(0);
return;
}
clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => {
setScore(getPasswordScore(password));
}, 300);
}, [password]);
Vue 3 Composition API 同理,用 watch + clearTimeout 即可。注意:别在 computed 里调用耗时函数,会阻塞渲染。
为什么用 aria-valuenow 和 role="progressbar"
屏幕阅读器无法感知纯视觉进度条。不加 ARIA 属性,视障用户只听到“一个空 div”,完全不知道当前强度。必须补全语义化标记,否则不符合 WCAG 2.1 AA 标准。
最小必要属性:
-
role="progressbar"告诉辅助技术这是进度组件 -
aria-valuenow="{score}"实时同步当前分数 -
aria-valuemin="0"和aria-valuemax="100"明确范围 - 外层加
aria-label="密码强度"或关联<label>
漏掉 aria-valuenow 更新,等于进度条对无障碍用户“失效”。这点比动画效果重要得多。



















