VUE监听(动态/实时)获取元素的宽度变化

2023-12-18 11:43:31
需求

1920*1080的云图效果能自适应显示,所以得实时获取屏幕的宽度,然后用屏幕的宽度和1920的宽度进行对比,计算出占比,然后用CSS3的transform scale来实现自适应

vue2
<div ref="appContainer" ></div>
mounted(){

? ? ?let that = this;

?????that.$erd.listenTo(that.$refs.appContainer, element => {

? ? ? ? that.$nextTick(() => {

? ? ? ? ? that.contentWdith = that.$refs.appContainer.offsetWidth;

? ? ? ? ? that.contentHieght = that.$refs.appContainer.offsetHeight;

? ? ? ? })

? ? ? })

}
vue3

因为是监听某一元素的宽高变化,所以这里用的是ResizeObserver.

ResizeObserver是可以监听到DOM元素,宽高的变化,需要注意的一点就是监听出变化结果是contentBox的宽度和高度。

第一步:封装自定义指令

在utils文件下创建directive,然后directive文件夹下创建一个resizeObserver.js文件
内容如下

// 监听元素大小变化的指令
const map = new WeakMap()
const ob = new ResizeObserver((entries) => {
    for (const entry of entries) {
        // 获取dom元素的回调
        const handler = map.get(entry.target)
        //存在回调函数
        if (handler) {
            // 将监听的值给回调函数
            handler({
                width: entry.borderBoxSize[0].inlineSize,
                height: entry.borderBoxSize[0].blockSize
            })
        }
    }
})


export const Resize = {

    mounted(el, binding) {
        //将dom与回调的关系塞入map
        map.set(el, binding.value)
        //监听el元素的变化
        ob.observe(el)
    },
    unmounted(el) {
        //取消监听
        ob.unobserve(el)
    }
}

export default Resize


第二步:在directive文件夹再创建一个index.js文件,目的是为了集中注册自定义指令

import { Resize } from "./resizeObserver"


// 自定义指令集合
const directives = {
    Resize,
}

export default {
    install(app) {
        Object.keys(directives).forEach((key) => {
            app.directive(key, directives[key])
        })
    }
}


第三步:在main.js文件进行全局注册

import directives from "@/util/directive/index"
app.use(directives)

第四步:使用方法

<template>
<div style="height: 100%; width: 100%" v-resize="onResize"></div>
</template>
<script setup>
// 当元素宽高发生变化时,触发下面的方法
const onResize = (dom) => {
    console.log(dom) // dom为元素变化后的宽高
}
</script>



文章来源:https://blog.csdn.net/chendawen250/article/details/135056028
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。