# 移动端与PC端全屏的处理

一、全屏API基础

现代浏览器提供了Fullscreen API来实现全屏功能,主要包括以下方法和属性:

javascript 复制代码
// 请求进入全屏
element.requestFullscreen();

// 退出全屏
document.exitFullscreen();

// 检查全屏状态
document.fullscreenElement; // 返回当前全屏的元素或null

// 全屏变化事件
document.addEventListener('fullscreenchange', handler);
document.addEventListener('fullscreenerror', errorHandler);

二、PC端全屏处理

1. 普通元素全屏

xml 复制代码
<div id="fullscreen-content" style="width: 100%; height: 100%; background: #f0f0f0;">
  <p>这是可以全屏显示的内容</p>
  <button id="fullscreen-btn">全屏显示</button>
</div>

<script>
  const fullscreenBtn = document.getElementById('fullscreen-btn');
  const content = document.getElementById('fullscreen-content');
  
  fullscreenBtn.addEventListener('click', () => {
    if (!document.fullscreenElement) {
      content.requestFullscreen().catch(err => {
        console.error(`全屏错误: ${err.message}`);
      });
    } else {
      document.exitFullscreen();
    }
  });
  
  // 监听全屏状态变化
  document.addEventListener('fullscreenchange', () => {
    if (document.fullscreenElement) {
      console.log('进入全屏模式');
    } else {
      console.log('退出全屏模式');
    }
  });
</script>

2. 视频全屏处理

xml 复制代码
<video id="video" controls width="100%">
  <source src="example.mp4" type="video/mp4">
</video>
<button id="video-fullscreen-btn">视频全屏</button>

<script>
  const video = document.getElementById('video');
  const videoFullscreenBtn = document.getElementById('video-fullscreen-btn');
  
  videoFullscreenBtn.addEventListener('click', () => {
    if (!document.fullscreenElement) {
      video.requestFullscreen().catch(err => {
        console.error(`视频全屏错误: ${err.message}`);
      });
    } else {
      document.exitFullscreen();
    }
  });
  
  // 视频自带的全屏按钮处理
  video.addEventListener('enterpictureinpicture', () => {
    console.log('视频进入画中画模式');
  });
  
  video.addEventListener('leavepictureinpicture', () => {
    console.log('视频退出画中画模式');
  });
</script>

三、移动端全屏处理

移动端全屏需要考虑更多因素,如横竖屏切换、浏览器兼容性等。

1. 普通元素全屏

javascript 复制代码
// 移动端全屏函数
function toggleFullscreen(element) {
  if (!document.fullscreenElement) {
    // 移动端可能需要使用webkit前缀
    const requestMethod = element.requestFullscreen || 
                         element.webkitRequestFullscreen || 
                         element.webkitRequestFullScreen;
    
    if (requestMethod) {
      requestMethod.call(element).catch(err => {
        console.error('全屏请求失败:', err);
      });
    }
  } else {
    const exitMethod = document.exitFullscreen || 
                      document.webkitExitFullscreen;
    
    if (exitMethod) {
      exitMethod.call(document);
    }
  }
}

// 添加点击事件
document.getElementById('mobile-fullscreen-btn').addEventListener('click', () => {
  toggleFullscreen(document.getElementById('mobile-content'));
});

// 处理移动端横竖屏变化
function handleOrientationChange() {
  if (window.matchMedia("(orientation: portrait)").matches) {
    console.log('竖屏模式');
  } else {
    console.log('横屏模式');
  }
}

// 初始检查
handleOrientationChange();

// 监听方向变化
window.addEventListener('orientationchange', handleOrientationChange);

2. 移动端视频全屏

移动端视频全屏通常由浏览器原生控制,但我们可以优化体验:

xml 复制代码
<video id="mobile-video" controls playsinline webkit-playsinline>
  <source src="example.mp4" type="video/mp4">
</video>

<script>
  const mobileVideo = document.getElementById('mobile-video');
  
  // iOS上禁用默认全屏
  mobileVideo.setAttribute('playsinline', '');
  mobileVideo.setAttribute('webkit-playsinline', '');
  
  // 自定义全屏按钮
  document.getElementById('mobile-video-fullscreen').addEventListener('click', () => {
    if (mobileVideo.webkitEnterFullscreen) {
      mobileVideo.webkitEnterFullscreen();
    } else {
      mobileVideo.requestFullscreen();
    }
  });
  
  // 处理视频播放状态
  mobileVideo.addEventListener('play', () => {
    // 在移动端自动横屏
    if (screen.orientation && screen.orientation.lock) {
      screen.orientation.lock('landscape').catch(() => {
        console.log('横屏锁定失败');
      });
    }
  });
  
  mobileVideo.addEventListener('pause', () => {
    // 恢复竖屏
    if (screen.orientation && screen.orientation.unlock) {
      screen.orientation.unlock();
    }
  });
</script>

四、跨浏览器兼容处理

typescript 复制代码
// 全屏API前缀处理
const fullscreenAPI = {
  request: [
    'requestFullscreen',
    'webkitRequestFullscreen',
    'mozRequestFullScreen',
    'msRequestFullscreen'
  ],
  exit: [
    'exitFullscreen',
    'webkitExitFullscreen',
    'mozCancelFullScreen',
    'msExitFullscreen'
  ],
  element: [
    'fullscreenElement',
    'webkitFullscreenElement',
    'mozFullScreenElement',
    'msFullscreenElement'
  ],
  event: [
    'fullscreenchange',
    'webkitfullscreenchange',
    'mozfullscreenchange',
    'MSFullscreenChange'
  ]
};

// 获取兼容的方法
function getFullscreenMethod(type) {
  for (let i = 0; i < fullscreenAPI[type].length; i++) {
    if (document[fullscreenAPI[type][i]] !== undefined) {
      return fullscreenAPI[type][i];
    }
  }
  return null;
}

// 兼容的全屏切换函数
function crossBrowserToggleFullscreen(element) {
  const requestMethod = getFullscreenMethod('request');
  const exitMethod = getFullscreenMethod('exit');
  const fullscreenElementMethod = getFullscreenMethod('element');
  
  if (!document[fullscreenElementMethod]) {
    element‌:ml-search[requestMethod];
  } else {
    document‌:ml-search[exitMethod];
  }
}

// 兼容的事件监听
function addFullscreenChangeListener(handler) {
  fullscreenAPI.event.forEach(event => {
    document.addEventListener(event, handler);
  });
}

五、CSS全屏样式

css 复制代码
/* 全屏时的样式 */
:-webkit-full-screen {
  background-color: white;
}

:-moz-full-screen {
  background-color: white;
}

:-ms-fullscreen {
  background-color: white;
}

:fullscreen {
  background-color: white;
}

/* 全屏按钮样式 */
.fullscreen-btn {
  position: absolute;
  bottom: 20px;
  right: 20px;
  padding: 10px;
  background: rgba(0,0,0,0.5);
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  z-index: 1000;
}

/* 移动端横屏时的特殊样式 */
@media screen and (orientation: landscape) {
  .video-container {
    width: 100vh;
    height: 100vw;
    transform: rotate(90deg);
    transform-origin: 0 0;
    position: absolute;
    top: 100%;
    left: 0;
  }
}

六、实际应用建议

  1. 检测全屏支持‌:
javascript 复制代码
function isFullscreenSupported() {
  return !!(
    document.fullscreenEnabled ||
    document.webkitFullscreenEnabled ||
    document.mozFullScreenEnabled ||
    document.msFullscreenEnabled
  );
}
  1. 全屏状态管理‌:
javascript 复制代码
function isFullscreen() {
  return !!(
    document.fullscreenElement ||
    document.webkitFullscreenElement ||
    document.mozFullScreenElement ||
    document.msFullscreenElement
  );
}
  1. 移动端特殊处理‌:
  • iOS Safari需要playsinline属性
  • Android Chrome可能需要手动处理横屏
  • 考虑添加全屏按钮的触摸反馈
相关推荐
崔庆才丨静觅2 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60613 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了3 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅3 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅3 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅4 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment4 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅4 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊4 小时前
jwt介绍
前端
爱敲代码的小鱼4 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax