63 lines
1.4 KiB
Vue
Raw Normal View History

<script lang="ts" setup>
import { ref, watchEffect } from "vue"
import { ElMessage } from "element-plus"
import screenfull from "screenfull"
const props = defineProps({
/** 全屏的元素,默认是 html */
element: {
type: String,
default: "html"
},
/** 打开全屏提示语 */
openTips: {
type: String,
default: "全屏"
},
/** 关闭全屏提示语 */
exitTips: {
type: String,
default: "退出全屏"
}
})
const tips = ref<string>(props.openTips)
const isFullscreen = ref<boolean>(false)
2022-08-22 15:29:29 +08:00
const handleClick = () => {
const dom = document.querySelector(props.element) || undefined
screenfull.isEnabled ? screenfull.toggle(dom) : ElMessage.warning("您的浏览器无法工作")
}
2022-08-22 15:29:29 +08:00
const handleChange = () => {
2022-08-22 15:29:29 +08:00
isFullscreen.value = screenfull.isFullscreen
tips.value = screenfull.isFullscreen ? props.exitTips : props.openTips
2022-08-22 15:29:29 +08:00
}
watchEffect((onCleanup) => {
// 挂载组件时自动执行
screenfull.on("change", handleChange)
// 卸载组件时自动执行
onCleanup(() => {
screenfull.isEnabled && screenfull.off("change", handleChange)
})
2022-08-22 15:29:29 +08:00
})
</script>
<template>
<div @click="handleClick">
<el-tooltip effect="dark" :content="tips" placement="bottom">
2022-08-22 15:29:29 +08:00
<svg-icon :name="isFullscreen ? 'fullscreen-exit' : 'fullscreen'" />
</el-tooltip>
</div>
</template>
2022-08-22 15:29:29 +08:00
<style lang="scss" scoped>
.svg-icon {
font-size: 20px;
&:focus {
outline: none;
}
}
</style>