法一:VueUse库实现

参考:https://blog.csdn.net/weixin_45711931/article/details/134113836

npm i @vueuse/core
<div ref="fullScreen">
	<div @click="toggle">
      <van-icon :name="!isFullscreen ? 'enlarge' : 'shrink'" color="red" size="40"/>
    </div>
</div>
<script setup>
import { ref } from 'vue';
import { useFullscreen } from '@vueuse/core';
const fullScreen= ref()
const { isFullscreen, toggle } = useFullscreen(fullScreen)
</script>

如果实现的是整个屏幕的全屏,不加参数即可:

const { isFullscreen, toggle } = useFullscreen()

法二:封装全屏函数,使用

/src/utils/fullScreen.ts中

封装:

import { ref, onUnmounted } from "vue";

// 扩展 Document 类型
interface FullscreenDocument extends Document {
  webkitExitFullscreen?: () => Promise<void>;
  msExitFullscreen?: () => Promise<void>;
  webkitFullscreenElement?: Element | null;
  msFullscreenElement?: Element | null;
}

// 扩展 HTMLElement 类型
export interface FullscreenElement extends HTMLElement {
  webkitRequestFullScreen?: () => Promise<void>;
  msRequestFullscreen?: () => Promise<void>;
}

export function useFullscreen() {
  const isFullscreen = ref(false);
  const doc = document as FullscreenDocument;

  // 进入全屏模式
  const requestFullscreen = (element: FullscreenElement) => {
    if (element.requestFullscreen) {
      element.requestFullscreen().catch((err) => {
        console.error("进入全屏失败:", err);
      });
    } else if (element.webkitRequestFullScreen) {
      element.webkitRequestFullScreen();
    } else if (element.msRequestFullscreen) {
      element.msRequestFullscreen();
    } else {
      console.warn("该浏览器不支持全屏API");
    }
  };

  // 退出全屏模式
  const exitFullscreen = () => {
    if (doc.exitFullscreen) {
      doc.exitFullscreen();
    } else if (doc.webkitExitFullscreen) {
      doc.webkitExitFullscreen();
    } else if (doc.msExitFullscreen) {
      doc.msExitFullscreen();
    }
  };

  // 切换全屏模式
  const toggleFullscreen = (element: FullscreenElement) => {
    if (isFullscreen.value) {
      exitFullscreen();
    } else {
      requestFullscreen(element);
    }
  };

  // 处理全屏变化事件
  const handleFullscreenChange = () => {
    isFullscreen.value = !!(
      doc.fullscreenElement ||
      doc.webkitFullscreenElement ||
      doc.msFullscreenElement
    );
  };

  // 添加事件监听
  doc.addEventListener("fullscreenchange", handleFullscreenChange);
  doc.addEventListener("webkitfullscreenchange", handleFullscreenChange);
  doc.addEventListener("msfullscreenchange", handleFullscreenChange);

  // 组件卸载时清理
  onUnmounted(() => {
    doc.removeEventListener("fullscreenchange", handleFullscreenChange);
    doc.removeEventListener("webkitfullscreenchange", handleFullscreenChange);
    doc.removeEventListener("msfullscreenchange", handleFullscreenChange);
  });

  return {
    isFullscreen,
    requestFullscreen,
    exitFullscreen,
    toggleFullscreen,
  };
}

使用

<div>
	<div @click="handleToggleFullscreen"  ref="fullScreen">>
	      <van-icon :name="!isFullscreen ? 'enlarge' : 'shrink'" color="red" size="40"/>
	    </div>
	</div>
</div>


import { useFullscreen, type FullscreenElement } from "@/utils/fullScreen";


// 全屏
const { isFullscreen, toggleFullscreen } = useFullscreen();
const fullScreen = ref<HTMLElement | null>(null);

// 处理全屏切换
const handleToggleFullscreen = () => {
  if (fullScreen.value) {
    // 确保元素存在后再调用
    toggleFullscreen(fullScreen.value as FullscreenElement);
  } else {
    console.warn("全屏元素尚未准备好");
  }
};
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐