美文网首页
screenfull(全屏) 原理及方案分析

screenfull(全屏) 原理及方案分析

作者: KevinLee0424 | 来源:发表于2023-08-09 11:18 被阅读0次

    原理

    对于 screenfull 而言,浏览器本身提供了对应的api:

    1. Document.exitFullscreen() :用于请求从全屏模式切换到窗口模式
    2. Element.requestFullscreen() : 用于请求浏览器将特定元素(甚至延伸到它的后代元素)置为全屏模式

    ex: 我们可以通过 document.getElementById('app').requestFullscreen()在获取 id=app的 DOM之后,把该区域置为全屏,但该方法存在一些小的问题,比如 appmin区域背景色改变;

    所以通常我们不会直接使用该 API来实现全屏,而是使用它的包装库 screenfull;

    Api

    request(ele) 全屏
    .exit() 退出全屏
    .toggle() 切换全屏
    .on(event, function) : event为 ‘change’ | ‘error’ 注册事件
    .off(event, function) : 移除前面已经注册的事件
    .element: 返回一个全屏的dom节点,如果没有就为 null
    .isFullscreen : 是否是全屏状态
    .isEnabled : 判断是否支持全屏
    

    使用案例

    1.下载依赖 screenfull

    npm i screenfull --save
    

    2.创建组件 Screenfull.vue
    vue3中使用:

    <template>
      <div>
        <svg-icon :icon="isFullscreen ? 'exit-fullscreen' : 'fullscreen'" @click="onToggle"/>
      </div>
    </template>
    <script setup>
    import { onMounted, onUnmounted, ref } from 'vue'
    import screenfull from 'screenfull'
    // 是否全屏
    const isFullscreen = ref(false)
    
    // 监听变化
    const change = () => {
      isFullscreen.value = screenfull.isFullscreen
    }
    
    // 切换事件
    const onToggle = () => {
      screenfull.toggle()
    }
    
    // 设置监听器
    onMounted(() => {
      screenfull.on('change', change)
    })
    
    // 删除监听器
    onUnmounted(() => {
      screenfull.off('change', change)
    })
    </script>
    

    vue2中使用

    <template>
      <div>
        <svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" @click="onToggle" />
      </div>
    </template>
    
    <script>
    import screenfull from 'screenfull'
    
    export default {
      name: 'Screenfull',
      data() {
        return {
          isFullscreen: false
        }
      },
      mounted() {
        this.init()
      },
      beforeDestroy() {
        this.destroy()
      },
      methods: {
        //点击事件
        onToggle() {
          if (!screenfull.enabled) {
            this.$message({
              message: '你的浏览器不支持',
              type: 'warning'
            })
            return false
          }
          screenfull.toggle()
        },
        change() {
          this.isFullscreen = screenfull.isFullscreen
        },
        init() {
          if (screenfull.enabled) {
            screenfull.on('change', this.change)
          }
        },
        //销毁
        destroy() {
          if (screenfull.enabled) {
            screenfull.off('change', this.change)
          }
        }
      }
    }
    </script>
    
    <style scoped>
    .screenfull-svg {
      display: inline-block;
      cursor: pointer;
      fill: #5a5e66;;
      width: 20px;
      height: 20px;
      vertical-align: 10px;
    }
    </style>
    

    相关文章

      网友评论

          本文标题:screenfull(全屏) 原理及方案分析

          本文链接:https://www.haomeiwen.com/subject/izxykktx.html