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>



  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,在 vue3 中使用过渡动画需要在组件中使用 `<transition>` 标签包裹住你想要添加过渡动画的元素。然后可以在 `<transition>` 标签上添加 `name` 属性来设置过渡动画的名称,这样就可以在组件的样式中通过过渡动画的名称来设置过渡动画的样式。 要自动获取宽度和高度的变化并实现过渡动画,你可以使用 vue3 中的 `watch` 选项来监听组件的宽度和高度的变化,并在变化时触发过渡动画。 下面是一个示例代码: ```html <template> <div> <button @click="toggle">Toggle</button> <transition name="fade"> <div v-if="show" ref="box" class="box"> Box </div> </transition> </div> </template> <script> export default { data() { return { show: true, } }, watch: { show(newVal) { if (newVal) { // 获取元素宽度和高度 const width = this.$refs.box.offsetWidth const height = this.$refs.box.offsetHeight // 设置过渡动画的初始状态 this.$refs.box.style.transform = `scale(0)` this.$refs.box.style.width = `${width}px` this.$refs.box.style.height = `${height}px` // 延迟一段时间后触发过渡动画 setTimeout(() => { this.$refs.box.style.transform = `scale(1)` }, 50) } else { // 获取元素宽度和高度 const width = this.$refs.box.offsetWidth const height = this.$refs.box.offsetHeight // 设置 ### 回答2: 使用Vue3可以使用transition过渡组件以及refs来实现一个自动获取宽度高度变化的过渡动画。 首先,在Vue组件中,我们需要使用refs来获取到需要进行动画的元素。通过ref指令,我们可以将元素绑定到Vue实例的一个属性上。 接下来,在模板中使用transition包裹需要进行过渡动画的元素,并设置name属性为我们所定义的过渡效果的名称。 然后,在transition组件内部,使用v-bind:class来动态绑定一个CSS类。这个CSS类将会在元素的进入和离开过渡过程中,根据元素宽度和高度变化自动添加和移除。 最后,在组件的样式中,我们可以定义两个过渡效果,比如定义一个名为"fade"的过渡效果。在这个效果中,我们可以使用transition属性来设置过渡效果的持续时间、动画曲线等。 在Vue实例中,我们可以使用watch方法来监听元素宽度和高度的变化。当元素宽度和高度发生变化时,我们可以手动设置一个动画类来触发过渡效果。 总结一下,使用Vue3可以通过refs获取DOM元素,利用transition组件和过渡效果进行宽度和高度的变化过渡动画,并通过watch监听元素宽度和高度变化。这样,就可以实现一个自动获取宽度高度变化的过渡动画。 ### 回答3: 在Vue 3中,可以利用`<transition>`组件来实现自动获取宽度和高度变化的过渡动画。 首先,为了能够动态获取元素宽度和高度,我们需要使用Vue的`ref`属性来引用元素。在组件的模板中,给需要过渡动画的元素添加一个`ref`属性,例如: ```html <template> <div> <transition> <div ref="myElement"></div> </transition> </div> </template> ``` 接下来,在组件的`setup`函数中,使用`ref`方法创建一个响应式的引用,用于获取元素宽度和高度。然后,我们可以使用`watchEffect`函数来监听元素变化,并在变化时触发过渡动画。 ```javascript <script> import { ref, watchEffect } from 'vue'; export default { setup() { const myElement = ref(null); // 创建一个响应式的引用 watchEffect(() => { // 在引用的元素变化时触发过渡动画 if (myElement.value) { myElement.value.style.width = myElement.value.offsetWidth + 'px'; // 获取元素宽度 myElement.value.style.height = myElement.value.offsetHeight + 'px'; // 获取元素的高度 } }); return { myElement }; } }; </script> ``` 在以上代码中,我们使用`watchEffect`函数监听元素变化,一旦元素发生变化,就会重新计算元素宽度和高度,并将新的宽度和高度应用到元素上,从而触发过渡动画。 最后,我们可以在CSS中定义过渡动画的效果,例如: ```css <style scoped> .my-element-enter-active, .my-element-leave-active { transition: all 0.3s; } .my-element-enter, .my-element-leave-to { opacity: 0; } </style> ``` 以上代码中,我们使用了Vue的过渡类名(`.enter-active`和`.leave-active`)以及自定义的类名(`.my-element`)。通过定义这些类名,我们可以实现元素在出现和消失时的渐变效果。 综上所述,通过使用Vue 3的`<transition>`组件、`ref`属性以及`watchEffect`函数,我们可以实现一个自动获取宽度和高度变化的过渡动画。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值