VUE监听(动态/实时)获取元素的宽度变化
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
需求
1920*1080的云图效果能自适应显示,所以得实时获取屏幕的宽度,然后用屏幕的宽度和1920的宽度进行对比,计算出占比,然后用CSS3的transform scale来实现自适应
vue2
使用element-resize-detector方式监听宽度变化
1.安装:
npm install element-resize-detector --save
2.main.js全局引入
import ElementResizeDetectorMaker from "element-resize-detector"
Vue.prototype.$erd = ElementResizeDetectorMaker()
3.页面上使用
<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>
GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891
Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
更多推荐
已为社区贡献2条内容
所有评论(0)