# 移动端与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可能需要手动处理横屏
  • 考虑添加全屏按钮的触摸反馈
相关推荐
会飞的鱼先生12 分钟前
vue3自定义指令来实现 v-copy 功能
前端·javascript·vue.js
陈天伟教授25 分钟前
Web前端开发 - 制作简单的焦点图效果
java·开发语言·前端·前端开发·visual studio
_殊途36 分钟前
前端三件套之html详解
前端·html
不思念一个荒废的名字1 小时前
【黑马JavaWeb+AI知识梳理】后端Web基础03 - MySQL概述
前端·数据库·mysql
谢尔登2 小时前
【React Native】快速入门
javascript·react native·react.js
进取星辰2 小时前
32、跨平台咒语—— React Native初探
javascript·react native·react.js
橙子199110162 小时前
谈谈 Kotlin 中的构造方法,有哪些注意事项?
java·前端·kotlin
*neverGiveUp*3 小时前
本地分支git push 报错 fatal: The current branch XXXX has no upstream branch.
前端·git·gitea
AaronZZH3 小时前
为什么现代CSS应该选择OKLCH:从颜色科学到设计系统革新
前端·css
CaseyWei3 小时前
JS实现直接下载PDF文件
前端·javascript