使用Teleport实现视频小窗口播放

效果

 实现步骤

小视频窗口

<!-- 小视频窗口 -->
  <div
    id="fixbox"
    style="
      width: 300px;
      height: 300px;
      position: fixed;
      right: 20px;
      bottom: 20px;
    "
  ></div>

占位元素

<!-- 被监听出入视口的占位元素 -->
  <div id="box" style="width: 600px;height: 420px;position: absolute;left: 0;top: 0;"></div>

大视频窗口

<div class="bigbox" style="width: 600px;height: 420px;">
    <Teleport :disabled="disabled" to="#fixbox" >
      <div id="mse" style="width: 500px;height: 500px ;"></div>
    </Teleport>
  </div>

useIntersectionObserver

@vueuse/core 提供的一个钩子,用于检测元素的可视区域(视口)变化。它监听 #box 元素是否在视口内,更新 disabled 状态。isIntersecting 是布尔值,表示 #box 是否在视口内

完整代码

<template>
  <!-- 小视频窗口 -->
  <div
    id="fixbox"
    style="
      width: 300px;
      height: 300px;
      position: fixed;
      right: 20px;
      bottom: 20px;
    "
  ></div>
  <!-- 被监听出入视口的占位元素 -->
  <div id="box" style="width: 600px;height: 420px;position: absolute;left: 0;top: 0;"></div>
  <!-- 初始播放的大视频窗口 -->
  <div class="bigbox" style="width: 600px;height: 420px;">
    <Teleport :disabled="disabled" to="#fixbox" >
      <div id="mse" style="width: 500px;height: 500px ;"></div>
    </Teleport>
  </div>
  <div style="height: 2000px"></div>
</template>

<script lang="ts" setup>
import { onMounted, ref } from "vue";
import { useIntersectionObserver } from "@vueuse/core";
import Player from "xgplayer";
import "xgplayer/dist/index.min.css";
const disabled = ref(true);
onMounted( () => {
    new Player({
      id: "mse", // 使用字符串 id
      lang: "zh", // 设置中文
      screenShot: true, // 截图
      width: "100%",
      height: "100%",
      // 视频源
      url: "http://vjs.zencdn.net/v/oceans.mp4",
      // 封面
      poster:
        "https://th.bing.com/th/id/R.987f582c510be58755c4933cda68d525?rik=C0D21hJDYvXosw&riu=http%3a%2f%2fimg.pconline.com.cn%2fimages%2fupload%2fupc%2ftx%2fwallpaper%2f1305%2f16%2fc4%2f20990657_1368686545122.jpg&ehk=netN2qzcCVS4ALUQfDOwxAwFcy41oxC%2b0xTFvOYy5ds%3d&risl=&pid=ImgRaw&r=0",
      // 画中画
      pip: true,
    });

  useIntersectionObserver(
    document.getElementById("box"),
    ([{ isIntersecting }]) => {
      //返回布尔值
      disabled.value = isIntersecting;
      console.log(isIntersecting);
    }
  );
});
</script>

<style scoped></style>

 

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值