本文介绍如何通过 css 变量与滚动控制,修复 telegram web view(ios)中软键盘弹出时覆盖底部 textarea 的经典兼容性问题。
在 Telegram Web View 中,尤其是 iOS 端(如 iOS 16.1.2 + Telegram 9.3.2),当用户聚焦于底部
Telegram Web Apps 运行时会注入两个关键 CSS 自定义属性:
将容器高度绑定至 --tg-viewport-stable-height,可强制其在键盘弹出时保持“视觉稳定”布局,避免内容被挤压或错位:
.container {
overscroll-behavior-x: none;
overscroll-behavior-y: none;
height: var(--tg-viewport-stable-height, 100vh);
min-height: var(--tg-viewport-stable-height);
}⚠️ 注意:
滚动位置启用上述 CSS 后,部分场景下页面可能出现异常滚动偏移(尤其在键盘收起后)。此时需在 focus 或 input 事件中主动重置滚动:
document.querySelector('textarea').addEventListener('focus', () => {
// 强制滚动到顶部,消除因键盘导致的视图偏移
window.scrollTo(0, 0);
});更健壮的做法是监听 keyboardDidShow / keyboardDidHide(需配合 Telegram WebApp SDK):
if (window.Telegram?.WebApp) {
Telegram.WebApp.onEvent('keyboardDidShow', () => {
window.scrollTo(0, 0);
});
Telegram.WebApp.onEvent('keyboardDidHide', () => {
window.scrollTo(0, 0);
});
}建议在项目中封装为可复用的初始化函数,并结合 @supports (height: env(safe-area-inset-bottom)) 做安全降级。只要合理组合 --tg-viewport-stable-height 与 window.scrollTo(0, 0),即可在绝大多数 Telegram iOS 场景下实现输入框始终可见的体验。