需求分析
1.初始化一个视频播放
2.打视频播放区域有如果在视口外 小窗口出现
3.大视频和小视频在切换的时候保持视频状态不变
思路分析:
1.video 西瓜视频播放器 成熟的视频插件
2.监控大视频播放区域是否在视口内 vueUse 的三方插件
3.Teleport 保持dom状态的前提下完成传送
<script setup>
// 1.初始化大视频播放区域 西瓜视频播放器 yarn add xgplayer
// 2.监听大视频是否在视口区域内 vueUse yarn add @vueuse/core
//
import Player from 'xgplayer'
import { onMounted,ref } from 'vue';
import { useIntersectionObserver } from '@vueuse/core'
const disabled = ref(true)
onMounted(()=>{
let player =new Player({
id: 'mse',
url: 'https://media.w3.org/2010/05/sintel/trailer.mp4',
width:'100%',
height:'100%',
// poster:poster
});
const { stop } = useIntersectionObserver(
document.getElementById('videoContainer'),
([{ isIntersecting }], ) => {
//isIntersecting 布尔值 如果在视口区域内 true 否则就是false
console.log(isIntersecting)
// 根据是否在视口区域决定小窗口是否播放
// isIntersecting 作为判断条件
disabled.value = isIntersecting
},
)
})
</script>
<template>
<!-- 要传送到的小视频播放器 -->
<div id="small"></div>
<!-- 被监听出入视口的占位元素 -->
<div class="observeContainer" id="videoContainer"></div>
<!-- 初始播放的大视频窗口 -->
<div class="bigBox">
<!-- 保持dom状态不变下,自由的穿梭功能 -->
<Teleport to="#small" :disabled="disabled">
<div id="mse"></div>
</Teleport>
</div>
<!-- 模拟滚动 -->
<div style="height:1000px;"></div>
</template>
<style>
.bigBox{
position: absolute;
top: 20px;
left: 20px;
width: 400px;
height: 200px;
/* border: 1px solid black; */
}
#mse{
/* object-fit 属性指定元素的内容应该如何去适应指定容器的高度与宽度。 */
/* object-fit: cover; */
/* 好像不起效果 */
}
#small{
position: fixed;
bottom: 20px;
right: 20px;
width: 200px;
height: 100px;
}
</style>