问题出现得很突然,日志倒是留得挺全。移动端底部购买按钮用 fixed 定位,iPhone 15 上被 Home 指示条盖住一半,viewport 里已经写了 viewport-fit=cover,但没加安全区内边距。
刚开始盯着「按钮高度写死,没有把安全区算进去」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。viewport-fit=cover 之后页面延伸到安全区。另一种情况是底部按钮没加 env(safe-area-inset-bottom)。
另外,安卓和 iOS 的安全区取值不同。
先确认 viewport 的实际设置
curl -s https://www.example.com/product/1/ | Select-String viewport
给底部栏补安全区内边距
echo 'padding-bottom:calc(12px + env(safe-area-inset-bottom))';
然后用 iPhone UA 访问确认页面正常
curl -s -A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)" https://www.example.com/product/1/ -o /dev/null -w "%{http_code}"
复核点击区域是否被遮挡
npx lighthouse https://www.example.com/product/1/ --only-audits=tap-targets --chrome-flags="--headless"
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
改完先别撤,确认这几项。底部按钮完整露出,安全区没有遮挡,点击区域不再被系统手势侵占。
viewport-fit=cover 只是前提,真正的留白要交给 env() 计算。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
