diff --git a/demo/componentList.ts b/demo/componentList.ts index 69fe47e..9f80105 100644 --- a/demo/componentList.ts +++ b/demo/componentList.ts @@ -9,4 +9,5 @@ export default [ 'useScroll', 'useInViewport', 'useDraggable', + 'useFullScreen', ]; diff --git a/src/index.ts b/src/index.ts index 6ff6fc6..38a4b14 100644 --- a/src/index.ts +++ b/src/index.ts @@ -8,3 +8,4 @@ export { default as useReactiveRef } from './useReactiveRef'; export { default as useScroll } from './useScroll'; export { default as useInViewport } from './useInViewport'; export { default as useDraggable } from './useDraggable'; +export { default as useFullScreen } from './useFullScreen'; diff --git a/src/useFullScreen/__demo__/index.tsx b/src/useFullScreen/__demo__/index.tsx new file mode 100644 index 0000000..2a817b8 --- /dev/null +++ b/src/useFullScreen/__demo__/index.tsx @@ -0,0 +1,58 @@ +import { Component, ref } from 'vue'; +import useFullScreen from '../index'; + +export default { + setup() { + const divRef = ref(null); + const [isFull, { setFull, exitFull, toggleFull }] = useFullScreen(divRef); + + const imgRef = ref(null); + const [, { toggleFull: toggleImgFullScreen }] = useFullScreen(imgRef); + + const videoRef = ref(null); + const [, { toggleFull: toggleVideoFullScreen }] = useFullScreen(videoRef); + + const onFull = () => { + console.log('进入全屏') + setFull() + } + + return { + isFull, + onFull, + exitFull, + toggleFull, + divRef, + toggleImgFullScreen, + imgRef, + toggleVideoFullScreen, + videoRef + }; + }, + + render(_ctx) { + return ( + <> +

div

+
+

{_ctx.isFull ? '全屏' : '非全屏'}

+ + + +
+ +

img

+
+ + +
+ +

video

+
+
+ + ); + }, +} as Component; diff --git a/src/useFullScreen/__test__/index.spec.tsx b/src/useFullScreen/__test__/index.spec.tsx new file mode 100644 index 0000000..18d4368 --- /dev/null +++ b/src/useFullScreen/__test__/index.spec.tsx @@ -0,0 +1,3 @@ +// import { mount } from '@vue/test-utils'; +// import { ref } from 'vue'; +// import useFullScreen from '../index'; diff --git a/src/useFullScreen/index.ts b/src/useFullScreen/index.ts new file mode 100644 index 0000000..62515a0 --- /dev/null +++ b/src/useFullScreen/index.ts @@ -0,0 +1,93 @@ +import { Ref, ref } from 'vue'; + +interface Options { + setFull?: () => void; + exitFull?: () => void; + toggleFull?: () => void; +} + + +export default function useFullScreen( + target: Ref +): [Ref, Options] { + const isFullScreen = ref(false); + + /** + * document.fullscreenEnabled Standard + * document.webkitfullscreenEnabled Chrome、Safari、Opera + * document.mozfullscreenEnabled Firefox + * document.msfullscreenEnabled IE、Edge + */ + const fullscreenEnabled = (document as any).fullscreenEnabled || + (document as any).webkitfullscreenEnabled || + (document as any).mozfullscreenEnabled || + (document as any).msfullscreenEnabled; + + /** + * document.requestFullscreen Standard + * document.webkitRequestFullScreen Chrome、Safari、Opera + * document.mozRequestFullScreen Firefox + * document.msRequestFullscreen IE、Edge + */ + function setFull() { + if (!fullscreenEnabled) { + alert('浏览器当前不能全屏'); + return + } + + if (isFullScreen.value) { + return + } + + const doc = target.value; + if ((doc as any).requestFullscreen) { + (doc as any).requestFullscreen(); + } else if ((doc as any).webkitRequestFullScreen) { + (doc as any).webkitRequestFullScreen(); + } else if ((doc as any).mozRequestFullScreen) { + (doc as any).mozRequestFullScreen(); + } else if ((doc as any).msRequestFullscreen) { + (doc as any).msRequestFullscreen(); + } + isFullScreen.value = !isFullScreen.value + } + + /** + * document.exitFullscreen Standard + * document.webkitCancelFullScreen Chrome、Safari、Opera + * document.mozCancelFullScreen Firefox + * document.msExitFullscreen IE、Edge + */ + function exitFull() { + if (!isFullScreen.value) { + return + } + + if ((document as any).exitFullscreen) { + (document as any).exitFullscreen(); + } else if ((document as any).webkitCancelFullScreen) { + (document as any).webkitCancelFullScreen(); + } else if ((document as any).mozCancelFullScreen) { + (document as any).mozCancelFullScreen(); + } else if ((document as any).msExitFullscreen) { + (document as any).msExitFullscreen(); + } + + isFullScreen.value = !isFullScreen.value + } + + function toggleFull() { + if (!fullscreenEnabled) { + alert('浏览器当前不能全屏'); + return + } + + if (isFullScreen.value) { + exitFull() + } else { + setFull() + } + } + + return [isFullScreen, { setFull, exitFull, toggleFull }] +}