全屏功能的意义
为什么需要全屏功能?
- 沉浸式体验
- 减少干扰
- 提升专注度
- 增强内容可读性
- 界面美观
- 隐藏多余元素
- 突出核心内容
- 提升视觉效果
技术实现方案
1. 全屏 API 简介
// 浏览器全屏 API
interface FullscreenDocument extends Document {
fullscreenElement: Element | null;
exitFullscreen(): Promise<void>;
}
interface FullscreenElement extends HTMLElement {
requestFullscreen(): Promise<void>;
}
2. Vue3 + ElementPlus 实现
组件结构
<template>
<el-container>
<!-- 头部 -->
<el-header v-if="!isFullscreen">
<!-- 头部内容 -->
</el-header>
<el-container>
<!-- 侧边栏 -->
<el-aside v-if="!isFullscreen" width="200px">
<!-- 侧边栏菜单 -->
</el-aside>
<!-- 主内容区 -->
<el-main>
<el-button @click="toggleFullScreen">
</el-button>
<!-- 页面主要内容 -->
</el-main>
</el-container>
</el-container>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
// 全屏状态
const isFullscreen = ref(false)
// 全屏切换方法
const toggleFullScreen = () => {
if (!isFullscreen.value) {
enterFullscreen()
} else {
exitFullscreen()
}
}
// 进入全屏
const enterFullscreen = () => {
const element = document.documentElement
if (element.requestFullscreen) {
element.requestFullscreen()
}
isFullscreen.value = true
}
// 退出全屏
const exitFullscreen = () => {
if (document.exitFullscreen) {
document.exitFullscreen()
}
isFullscreen.value = false
}
// 监听全屏状态变化
const handleFullscreenChange = () => {
isFullscreen.value = !!document.fullscreenElement
}
onMounted(() => {
document.addEventListener('fullscreenchange', handleFullscreenChange)
})
onUnmounted(() => {
document.removeEventListener('fullscreenchange', handleFullscreenChange)
})
</script>
<style scoped>
.fullscreen-container {
width: 100%;
height: 100vh;
}
</style>
3. 兼容性处理
// 跨浏览器全屏 API 兼容
function requestFullScreen(element) {
const methods = [
'requestFullscreen',
'webkitRequestFullScreen',
'mozRequestFullScreen',
'msRequestFullscreen'
]
for (let method of methods) {
if (element[method]) {
element[method]()
return true
}
}
return false
}
高级功能
1. 快捷键支持
const handleKeydown = (event) => {
// F11 快捷键
if (event.key === 'F11') {
event.preventDefault()
toggleFullScreen()
}
}
onMounted(() => {
window.addEventListener('keydown', handleKeydown)
})
onUnmounted(() => {
window.removeEventListener('keydown', handleKeydown)
})
2. 全屏状态样式
<style>
.fullscreen-mode {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
background: white;
}
</style>
性能优化
1. 防抖处理
import { debounce } from 'lodash-es'
const optimizedToggleFullScreen = debounce(toggleFullScreen, 300)
2. 状态管理
// Pinia 状态管理
const useFullscreenStore = defineStore('fullscreen', {
state: () => ({
isFullscreen: false
}),
actions: {
toggle() {
this.isFullscreen = !this.isFullscreen
}
}
})
最佳实践
- 用户体验
- 提供明确的全屏切换按钮
- 支持键盘快捷键
- 保持界面一致性
- 性能考虑
- 避免频繁切换
- 使用防抖
- 优化重绘
- 兼容性
- 检测浏览器支持
- 提供降级方案
常见问题
1. 移动设备兼容
// 检测移动设备
const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
if (isMobile) {
// 移动设备可能需要特殊处理
}
2. 权限问题
// 检查全屏权限
if (document.fullscreenEnabled) {
// 支持全屏
} else {
// 不支持全屏
ElMessage.warning('当前浏览器不支持全屏')
}
总结
全屏功能不仅仅是一个技术实现,更是提升用户体验的重要手段。通过 Vue3 和 ElementPlus,我们可以轻松构建出既美观又实用的全屏交互。
关键点:
- 使用浏览器全屏 API
- 响应式处理界面元素
- 提供良好的用户交互
扩展阅读
- MDN 全屏 API 文档
- Vue3 最佳实践
- 用户交互设计指南