一、确定需要全屏的element
首先真实dom小于虚拟dom的查找速度 , 所以我们选用了useRef来实现 其次如果将useRef写在外面的话 , 我们每次使用的时候都需要加一个ref对象
二、确定当前的fullscreen状态
export default function useFullScreen() {
const requestElementRef = useRef()
useEffect(() => {
const handleFullscreenChange = () => {
setIsFullscreen(!!document.fullscreenElement);
};
document.addEventListener('fullscreenchange', handleFullscreenChange);
return () => {
document.removeEventListener('fullscreenchange', handleFullscreenChange);
};
}, []);
return {requestElementRef}
进入全屏喝退出全屏的函数
const enterFullscreen = () => {
if (fullscreenElementRef.current) {
const element = fullscreenElementRef.current;
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.webkitRequestFullscreen) {
// Chrome, Safari & Opera
element.webkitRequestFullscreen();
} else if (element.mozRequestFullScreen) {
// Firefox
element.mozRequestFullScreen();
} else if (element.msRequestFullscreen) {
// IE/Edge
element.msRequestFullscreen();
}
}
};
const exitFullscreen = () => {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
// Chrome, Safari & Opera
document.webkitExitFullscreen();
} else if (document.mozCancelFullScreen) {
// Firefox
document.mozCancelFullScreen();
} else if (document.msExitFullscreen) {
// IE/Edge
document.msExitFullscreen();
}
};
最后是切换的函数
const toggleFullscreen = () => {
if (!document.fullscreenElement) {
enterFullscreen();
} else {
exitFullscreen();
}
};
上代码
\import { useState, useEffect, useRef } from 'react';
export default function useFullscreen() {
const [isFullscreen, setIsFullscreen] = useState(false);
const fullscreenElementRef = useRef(null);
const enterFullscreen = () => {
if (fullscreenElementRef.current) {
const element = fullscreenElementRef.current;
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.webkitRequestFullscreen) {
// Chrome, Safari & Opera
element.webkitRequestFullscreen();
} else if (element.mozRequestFullScreen) {
// Firefox
element.mozRequestFullScreen();
} else if (element.msRequestFullscreen) {
// IE/Edge
element.msRequestFullscreen();
}
}
};
const exitFullscreen = () => {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
// Chrome, Safari & Opera
document.webkitExitFullscreen();
} else if (document.mozCancelFullScreen) {
// Firefox
document.mozCancelFullScreen();
} else if (document.msExitFullscreen) {
// IE/Edge
document.msExitFullscreen();
}
};
const toggleFullscreen = () => {
if (!document.fullscreenElement) {
enterFullscreen();
} else {
exitFullscreen();
}
};
useEffect(() => {
const handleFullscreenChange = () => {
setIsFullscreen(!!document.fullscreenElement);
};
document.addEventListener('fullscreenchange', handleFullscreenChange);
return () => {
document.removeEventListener('fullscreenchange', handleFullscreenChange);
};
}, []);
return {
isFullscreen,
fullscreenElementRef,
enterFullscreen,
exitFullscreen,
toggleFullscreen,
};
}