赞
踩
最近做一个项目,涉及到echart图,要去根据父元素去自适应宽高,所以需要监听到元素的宽高变化、
因为是监听某一元素的宽高变化,所以这里用的是ResizeObserver.
ResizeObserver是可以监听到DOM元素,宽高的变化,需要注意的一点就是监听出变化结果是contentBox的宽度和高度。
以下为浏览器兼容性
第一步:封装自定义指令
在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>
以上,希望大家一键三连哇~~ 感谢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。