You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端requestFullscreen后首次触摸元素高度异常缩小问题求助

解决Android 13/One UI 5.1下全屏Canvas首次触摸高度偏移问题

针对你遇到的Canvas全屏后首次触摸高度骤缩(与虚拟导航栏相关)导致元素偏移的问题,以下是几个实用的解决方案:

1. 请求全屏时强制隐藏导航栏

使用全屏API的navigationUI参数,在进入全屏阶段直接隐藏系统导航栏,避免触摸触发后续尺寸变化:

const canvas = document.querySelector('canvas');
canvas.requestFullscreen({
  navigationUI: 'hide'
}).then(() => {
  // 同步更新Three.js渲染器尺寸
  renderer.setSize(window.innerWidth, window.innerHeight);
});

这个参数会让系统在全屏启动时就隐藏导航栏,而非等待用户触摸触发,从根源上消除尺寸突变的触发条件。

2. 监听首次触摸事件主动调整尺寸

既然只有首次触摸才会触发偏移,我们可以监听第一次触摸动作,主动更新Canvas和渲染器尺寸,提前抵消偏移:

const canvas = document.querySelector('canvas');
let isFirstTouch = true;

// 全屏状态变化时先初始化尺寸
document.addEventListener('fullscreenchange', () => {
  if (document.fullscreenElement === canvas) {
    renderer.setSize(window.innerWidth, window.innerHeight);
  }
});

// 监听首次触摸,强制同步尺寸
canvas.addEventListener('touchstart', () => {
  if (isFirstTouch) {
    isFirstTouch = false;
    const updatedHeight = window.innerHeight;
    canvas.style.height = `${updatedHeight}px`;
    renderer.setSize(window.innerWidth, updatedHeight);
    // 手动触发resize事件,确保Three.js场景适配
    window.dispatchEvent(new Event('resize'));
  }
}, { once: true }); // 只执行一次

3. 预计算全屏尺寸并强制设置

利用screen.availHeight获取屏幕可用高度(已扣除状态栏),在进入全屏时直接设置Canvas尺寸,提前匹配导航栏隐藏后的状态:

const canvas = document.querySelector('canvas');
canvas.requestFullscreen().then(() => {
  const targetHeight = screen.availHeight;
  canvas.style.height = `${targetHeight}px`;
  renderer.setSize(window.innerWidth, targetHeight);
});

这种方式跳过了系统自动调整的过程,让Canvas从一开始就处于最终的全屏尺寸。

4. 阻止首次触摸的默认行为(谨慎使用)

如果上述方法无效,可以尝试阻止首次触摸的默认动作,避免系统触发导航栏隐藏逻辑,同时手动设置目标尺寸:

const canvas = document.querySelector('canvas');
let isFirstTouch = true;

canvas.addEventListener('touchstart', (e) => {
  if (isFirstTouch && document.fullscreenElement) {
    e.preventDefault();
    isFirstTouch = false;
    const fullHeight = window.screen.height - window.screen.availTop;
    canvas.style.height = `${fullHeight}px`;
    renderer.setSize(window.innerWidth, fullHeight);
  }
}, { once: true });

注意:这个方法可能会影响其他触摸交互(比如Three.js的触摸控制),需要根据场景测试后使用。

内容的提问来源于stack exchange,提问作者Roman Diviš

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 03:07:40