必须设min-height: 100vh而非height: 100%,因后者依赖父级显式高度,而html/body默认无高度,导致align-items: center缺乏垂直空间基准;需配合display: flex、justify-content: center、align-items: center。

flex居中必须设min-height: 100vh,不是height: 100%
只写height: 100%几乎一定失败——它依赖父级高度,而html和body默认没显式高度。浏览器会按“内容高度”渲染,导致align-items: center无垂直空间可对齐。
正确做法是给父容器(比如body或外层div.login-wrapper)加min-height: 100vh,确保至少撑满视口。同时配display: flex、justify-content: center、align-items: center。
-
vh单位直接基于视口,不依赖祖先高度,最可靠 - 如果登录框要嵌在已有布局里(比如带header/footer),别动
body,改用包裹它的div并设position: relative - 避免在父容器上同时用
flex和grid,否则align-items可能被忽略
box-sizing: border-box不加,input和button就永远不对齐
常见现象:登录框看着居中了,但里面的input和button左边空隙大、右边挤到边缘——十有八九是box-sizing惹的祸。
默认box-sizing: content-box下,width: 100% + padding: 12px会让实际宽度超出父容器,不同浏览器渲染偏差更明显。
- 统一给所有表单控件加
box-sizing: border-box,让padding和border算进宽高内 -
input和button都设width: 100%时,必须保证它们父容器(比如.input-group)也有box-sizing: border-box - 去掉
outline: none后记得补border,否则focus状态在某些浏览器下视觉塌陷
移动端一打开就偏左?viewport和max-width漏了
PC上好好的,手机一开就贴左或横向溢出——问题不在居中逻辑,而在响应式基础没打牢。
两个硬性条件缺一不可:
-
<meta name="viewport" content="width=device-width, initial-scale=1">必须存在,否则移动端按980px虚拟视口渲染,100vh失效 - 登录框容器不能只写
width: 400px,得配max-width: 100%和width: 90%(或用max-width: 480px) - 如果用了
transform: translate(-50%, -50%)做居中,iOS Safari旧版可能触发渲染bug,优先用flex
modal登录框必须用absolute+transform,别碰负margin
当登录框浮在遮罩层(.overlay)上时,margin: 0 auto和纯flex都会失效——因为它必须脱离文档流。
错误写法:top: 50%; left: 50%; margin-left: -200px;,问题在于宽高固定、难维护,且IE8以下才需要这种兼容。
- 标准解法:
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); - 父遮罩层必须设
position: relative或position: fixed,否则定位参考是html根元素 - 别在transform里混用
scale()或rotate(),会影响焦点框和可访问性
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











