web登录页面代码
登录框的录页代码写起来比想象中麻烦。不是面代码指HTML结构,那几行input和button五分钟就能敲完。录页真正磨人的面代码是状态处理——用户输错密码怎么办?网络超时怎么提示?记住我勾选了但cookie被浏览器拦截呢?
我见过最粗暴的写法,整个登录逻辑塞在三十行JavaScript里。录页submit事件绑上,面代码ajax发出去,录页成功就跳转,面代码失败弹个alert。录页这种代码在演示环境跑得欢快,面代码一上生产就露馅。录页用户把密码存在浏览器里,面代码自动填充的录页黄色背景把输入框衬得刺眼,CSS里写的面代码`background: white`根本不生效。你得加`input:-webkit-autofill`的录页样式覆盖,还得用`transition`延迟背景色替换——这都是踩过坑才知道的细节。
更隐蔽的问题是表单提交方式。有人图省事用`
密码框的显示切换也常被做坏。小眼睛图标点一下明文,再点一下变回密文,逻辑简单吧?但有人用`type="text"`和`type="password"`来回切换,光标位置会跳到末尾。要保住光标,得先记下`selectionStart`,改完type再设回去。这种代码不写注释,三个月后自己都看不懂。
function togglePwdVisibility(input) { const pos = input.selectionStart; input.type = input.type === 'password' ? 'text' : 'password'; input.setSelectionRange(pos, pos); } 验证码那部分更是重灾区。图形验证码的接口返回base64图片,前端拿到就渲染,但没处理过期时间——用户盯着图看了十秒才输入,验证码早失效了。提交时后端报“验证码错误”,用户一脸懵。好的做法是前端也设个倒计时,两分钟自动刷新验证码,并在图片下方用小字提示“点击刷新”。这行代码不复杂,但能省掉大量客服沟通成本。
还有那个“记住我”的复选框。很多人直接存localStorage,这等于把账号密码写在浏览器里。稍微讲究点的做法是存一个加密后的token,让后端签发。但很多人没意识到,勾选记住我之后,登录接口返回的token过期时间要拉长,而不是简单在前端存个状态。否则用户第二天回来,localStorage里的标记还在,但token早失效了,照样得重新登录——那这个复选框就是摆设。
最后说下样式。登录页的CSS陷阱比功能代码还多。按钮的`hover`效果别用`box-shadow`的扩散,低端手机上会卡。背景渐变如果用了`fixed`定位,iOS Safari地址栏收起时会有白边。输入框的`font-size`小于16px,iOS会自动放大页面,用户点一下就得缩放——这问题从iOS 5存在到现在,依然有人踩。
写登录页最要紧的不是炫技,是把每个边界情况摸清楚。空值校验、重复提交防抖、加载状态禁用按钮、错误提示自动消失,这些琐碎的东西堆起来,才是能上线的页面。代码量不大,但每行都得对用户的行为有预判。毕竟登录是用户接触产品的第一道门,门都推不开,后面再好的功能也白搭。