根因是ios safari对input行内盒模型渲染异常:line-height计算不一致、padding被压缩、font-family fallback致基线偏移;修复需严格对齐height与line-height、禁用vertical-align、重置padding与字体栈、聚焦时动态修正,并按ios版本条件适配。

uni-app H5端iOS中input内容垂直偏离的根因
这不是样式没写对,是 iOS Safari 对 input 的行内盒模型渲染异常:line-height 计算不一致、padding-top/padding-bottom 被错误压缩、font-family fallback 导致基线偏移。尤其在低版本 iOS(如 14.x)中,placeholder 和真实输入内容常出现「一个居中、一个偏上」的错位现象。
强制 line-height 与 height 严格对齐
这是最直接有效的修复手段。必须确保 input 元素的 height 和 line-height 数值完全相等,且单位统一为 px 或 upx(避免混用 rpx/upx)。
-
height: 70upx时,必须配line-height: 70upx,不能写line-height: 1或line-height: 72upx - 禁用所有 vertical-align 相关设置(如
vertical-align: middle),它在 iOSinput中不可靠 - 检查父容器是否设置了
display: flex且未设align-items: center,flex 容器会干扰 input 内部对齐
清除 padding 干扰与字体继承污染
iOS Safari 会对 input 的上下 padding 做隐式裁剪,哪怕只设 padding: 0 20upx,也可能导致内容上浮。同时,全局 font-family 若含 WebKit 不支持的字体(如某些中文字体别名),会触发 fallback 错位。
- 显式重置:
padding: 0,再用padding-left/padding-right控制左右留白 - 限定字体栈:
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue",去掉可能触发 fallback 的自定义字体名 - 避免从 body 或父级继承
font-size,对input单独设font-size: 28upx(与 line-height/height 比例协调)
聚焦时动态修正(防 runtime 渲染抖动)
部分 iOS 版本在 focus 瞬间会临时重排 input 内容,导致肉眼可见的上跳。需在聚焦回调中加一次强制重绘。
- 在
@focus事件里执行:this.$nextTick(() => { setTimeout(() => el.style.transform = 'translateZ(0)', 0) }) - 或更轻量的触发重排:
el.offsetHeight(读取后立即丢弃) - 慎用
transform: translateZ(0)全局加在 input 上——它可能引发光标错位,仅聚焦时临时加
真正麻烦的不是某一行样式,而是 iOS 不同小版本对 input 内联盒的解析逻辑微调:15.4 修复了 line-height 偏移,却让 placeholder 在 focus 后短暂消失。所以任何 fix 都要加版本判断兜底,比如用 uni.getSystemInfoSync().system 提取 iOS 版本号做条件应用。











