【组件】悬浮框

在这里插入图片描述

<template>
	<div class="floating-panel" ref="floatAD" @mouseover="clearFdAd" @mouseout="startFdAd" style="position: absolute; z-index: 111; left: 0; top: 0" v-show="application.showFloat" >
        <el-icon @click="closeFloat" style="font-size:'14px';color:#fff;position:absolute;right:5px;top:5px;z-index: 120;"><Close /></el-icon>  
        <div style="width:100%;height:100%;position:relative;cursor:pointer"> 
            <slot></slot>
        </div>
	</div>
</template>

<script setup>
import { onMounted, ref,  h ,computed, inject, reactive, watch ,nextTick,provide} from 'vue' ;
import dayjs from "dayjs";
const props = defineProps({
  ftime: { type: Number,default:0 }, //毫秒级
}); 
watch(
	() => props.ftime,
	val => {
		ftime.value = val
	}
)
const startTime =dayjs().valueOf(); 
watch(
	() => startTime,
	val => {
		startTime.value = val
	}
)
// 悬浮窗
const { application, clearFdAd, startFdAd, changePos, floatAD, closeFloat} = initFloat()
function initFloat(){ 
	const application = reactive({
		showFloat: true,
		modal:{
			visible:false,
			title:'系统使用情况统计',
			src:''
		}
	})
	let xPos=0
    let yPos=0
    let step= 1
    let delay= 18
    let Hoffset= 0
    let Woffset= 0
    let yon= 0
    let xon= 0
	const timer = ref(null);
	const floatAD = ref(null)
  	const changePos =() => { 
        if(props.ftime && startTime+props.ftime <= dayjs().valueOf()){
            closeFloat();
            return;
        };
        
        console.log(timer.value);
        let width = document.documentElement.clientWidth;
        let height = document.documentElement.clientHeight;
		// let width = 1920
		// let height = 1080
        Hoffset = floatAD.value && floatAD.value.offsetHeight || 0; //获取元素高度
        Woffset = floatAD.value && floatAD.value.offsetWidth || 0;
        // 滚动部分跟随屏幕滚动
        // this.$refs.thediv.style.left = (this.xPos + document.body.scrollLeft + document.documentElement.scrollLeft) + "px";
        // this.$refs.thediv.style.top = (this.yPos + document.body.scrollTop + document.documentElement.scrollTop) + "px";
 
        // 滚动部分不随屏幕滚动
		if(floatAD.value){
        	floatAD.value.style.left = xPos + document.body.scrollLeft + "px";
        	floatAD.value.style.top = yPos + document.body.scrollTop + "px";
		}
 
        if (yon) {
            yPos = yPos + step;
        } else {
            yPos = yPos - step;
        }
        if (yPos < 0) {
            yon = 1;
            yPos = 0;
        }
        if (yPos >= height - Hoffset) {
            yon = 0;
            yPos = height - Hoffset;
        }
 
        if (xon) {
            xPos = xPos + step;
        } else {
            xPos = xPos - step;
        }
        if (xPos < 0) {
            xon = 1;
            xPos = 0;
        }
        if (xPos >= width - Woffset) {
            xon = 0;
            xPos = width - Woffset;
        }
	}
        
    const clearFdAd =() => {
        clearInterval(timer.value);
    }
    const startFdAd =() => {
        timer.value = setInterval(changePos, delay);
    }
	const closeFloat =() => {
		application.showFloat = false
		clearFdAd()
	} 
	onMounted(() => {
		nextTick(() => {
			setTimeout(() => {
				timer.value = setInterval(changePos, delay);
               
			},500)
		})
	})
	return { application, clearFdAd, startFdAd, changePos,floatAD , closeFloat }
}


</script>

<style lang="scss" scoped>
@import 'styles/var.scss';
 .floating-panel{ 
    background-color:rgba(black, 0.5);
    padding:vm(8) vm(8) 0 vm(8)
 } 
</style>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

*阿漓*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值