vue element-ui 导航做全屏/取消全屏功能

先上效果图

html部分代码:

      <!-- 全屏 -->
      <span class="user" @click="toggleFullScreen">
        <el-tooltip class="item" effect="dark" :content="isFullScreen ? '退出全屏':'全屏'" placement="bottom">
          <i :class="isFullScreen ? 'el-icon-aim':'el-icon-full-screen'" 
          style="width: 1.6rem;height: 1.6rem;vertical-align:middle;margin-right: .6rem;margin-bottom: .5rem;font-size:2rem"></i>
        </el-tooltip>
      </span>

data()定义部分:

  return{
      isFullScreen: false, //全屏开关
  }

js方法:

//全屏设置
      toggleFullScreen () {
        if (this.canFullScreen) {
          if (this.isFullScreen) {
            // 关闭全屏
            this.exitFullScreen()
            this.isFullScreen = false
          } else {
            // 打开全屏
            this.requestFullScreen(document.body)
            this.isFullScreen = true
          }
        } else {
          this.$message.warning({
            content: '当前浏览器暂不支持全屏模式,请切换浏览器后重新尝试!',
            duration: 3
          })
        }
      },
      requestFullScreen (element) {
        // 判断各种浏览器,找到正确的方法
        const requestMethod = element.requestFullScreen || // W3C
          element.webkitRequestFullScreen || // Chrome, safari
          element.mozRequestFullScreen || // FireFox
          element.msRequestFullscreen // IE11
        if (requestMethod) {
          requestMethod.call(element)
        }
      },
      exitFullScreen () {
        var exitMethod = document.exitFullscreen || // W3C
          document.mozCancelFullScreen || // FireFox
          document.webkitExitFullscreen || // Chrome等
          document.msExitFullscreen // IE11
        if (exitMethod) {
          exitMethod.call(document)
        }
      },
      addFullScreenListener () {
        const self = this
        document.onkeydown = function (e) {
          if (e && e.keyCode === 122) { // 捕捉F11键盘动作
            e.preventDefault() // 阻止F11默认动作
            self.toggleFullScreen()
          }
        }
        // 监听不同浏览器的全屏事件,并件执行相应的代码
        switch (self.browserKernel) {
          case 'webkit':
            document.onwebkitfullscreenchange = function () {
              if (document.webkitIsFullScreen) {
                self.isFullScreen = true
              } else {
                self.isFullScreen = false
              }
            }
            break
          case 'gecko':
            document.onmozfullscreenchange = function () {
              if (document.mozFullScreen) {
                self.isFullScreen = true
              } else {
                self.isFullScreen = false
              }
            }
            break
          case 'trident':
            document.onmsfullscreenchange = function () {
              if (document.msFullscreenElement) {
                self.isFullScreen = true
              } else {
                self.isFullScreen = false
              }
            }
            break
          case 'others':
            document.onfullscreenchange = function () {
              if (document.fullscreen) {
                self.isFullScreen = true
              } else {
                self.isFullScreen = false
              }
            }
            break
          default:
            break
        }
      },

优化方案:

在页面初始化时判断浏览器是否支持全屏操作

// 检查浏览器是否支持全屏
      this.canFullScreen = document.fullscreenEnabled ||
        document.webkitFullscreenEnabled ||
        document.mozFullScreenEnabled ||
        document.msFullscreenEnabled
      if (document.webkitFullscreenEnabled) {
        this.browserKernel = 'webkit'
      } else if (document.mozFullScreenEnabled) {
        this.browserKernel = 'gecko'
      } else if (document.msFullscreenEnabled) {
        this.browserKernel = 'trident'
      } else if (document.fullscreenEnabled) {
        this.browserKernel = 'others'
      }
      if (this.canFullScreen) {
        this.addFullScreenListener()
      }

最后在销毁页面时移除监听:

destroyed(){
      document.onkeydown = null
      switch (this.browserKernel) {
        case 'webkit':
          document.onwebkitfullscreenchange = null
          break
        case 'gecko':
          document.onmozfullscreenchange = null
          break
        case 'trident':
          document.onmsfullscreenchange = null
          break
        case 'others':
          document.onfullscreenchange = null
          break
        default:
          break
      }
    }

如果想换图标可以自动定义 :也可以用svg 图标引进来:<i :class="isFullScreen ? 'el-icon-aim':'el-icon-full-screen'" ><i/>

最后为了方便大家的沟通与交流请加QQ群: 625787746

请进QQ群交流:【IT博客技术分享群①】:https://jq.qq.com/?_wv=1027&k=DceI0140

### 如何在 Vue 中使用 Element-UI 实现图片预览功能 为了实现在 Vue 项目中通过点击缩略图来查看大图的功能,可以利用 `el-image` 组件中的 `preview-src-list` 属性[^1]。此属性允许指定一组用于预览的大图链接列表。 下面是一个完整的例子展示如何设置并使用该特性: #### 安装依赖 确保已经按照说明完成了 Element-UI 的安装,并将其正确引入到项目当中[^2]。 #### 创建图片预览组件 创建一个新的 Vue 单文件组件 (`.vue`) 或者直接在一个现有的页面里加入如下代码片段: ```html <template> <div class="image-preview"> <!-- 缩略图区域 --> <el-row :gutter="10"> <el-col v-for="(imgUrl, index) in images" :key="index" :span="8"> <el-image style="width: 100px; height: 100px" :src="imgUrl" @click.native.prevent="handlePreview(index)" fit="cover"></el-image> </el-col> </el-row> <!-- 图片预览对话框 --> <el-dialog :visible.sync="dialogVisible" width="70%"> <el-carousel indicator-position="outside" arrow="always" ref="carouselRef"> <el-carousel-item v-for="(item,index) in previewImages" :key="index"> <el-image :src="item" style="height: 100%;"></el-image> </el-carousel-item> </el-carousel> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false, currentIndex: null, images: [ 'https://example.com/image1.jpg', 'https://example.com/image2.png', // 更多图片URL... ], previewImages: [] }; }, methods: { handlePreview(index) { this.currentIndex = index; this.previewImages = [...this.images]; this.dialogVisible = true; // 设置轮播初始位置 setTimeout(() => { this.$refs.carouselRef.setActiveItem(this.currentIndex); }, 50); } } }; </script> <style scoped> .image-preview .el-col { margin-bottom: 10px; } </style> ``` 这段代码实现了当用户单击某个缩略图时会弹出一个全屏的模态窗口显示对应的大尺寸图像,并且支持左右切换浏览其他已上传的照片。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT博客技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值