解决elementplus carousel固定高度问题/ResizeObserverAPI介绍

  • "element-plus": "^2.2.26",
  • "@vueuse/components": "^9.7.0",
引入 vElementSize 返回响应性的监听值。

原理:ResizeObserver 接口监视 Element 内容盒或边框盒或者 SVGElement 边界尺寸的变化。!!!很棒的API。

例子是指令式的,完整项目

<template>
    <div>
        <el-carousel :interval="3000" type="card" :height="bannerHeight + 'px'">
            <el-carousel-item v-for="(item, index) in banners" :key="index" class="rounded-lg">
                <img v-element-size="onResize" :src="item.imageUrl" alt="" />
            </el-carousel-item>
        </el-carousel>
    </div>
</template>

<script setup lang="ts">
import { useCommonStore } from '@/stores/common'
import { storeToRefs } from 'pinia';
import { vElementSize } from '@vueuse/components'

const commonStore = useCommonStore();
const { banners } = storeToRefs(commonStore)
const { getBanners } = commonStore
const bannerHeight = ref(200)

onMounted(async () => {
    await getBanners();
})
function onResize({ width, height }: { width: number; height: number }) {
    bannerHeight.value = height
}
</script></style>

 vElementSize的原理是ResizeObserverAPI,可以监视元素的大小更改,并且每次大小更改时都会向观察者传递通知。

以下是一个简单的例子:

    <style>
        * {
            box-sizing: border-box;
            padding: 0;
            margin: 0;
        }

        div {
            height: 100px;
            width: 100%;
            background-color: yellowgreen;
        }
    </style>

<body>
    <div></div>
    <script lang="ts">
        let value = {
            width: 0
        }

        function elementSizeObserver(target) {
            const resizeObserver = new ResizeObserver(entries => {
                for (const entry of entries) {
                    value = entry.contentRect
                }
            })
            const element = document.querySelector(target)
            resizeObserver.observe(element)
        }
        elementSizeObserver('div')
    </script>
</body>

这个API的优点:

  • 响应特定元素的尺寸改变
  • 相较于传统解决方案window.resize(()=>{ Element.getBoundingClientRect... }),不依赖视口改变,不需要多次重新获取元素以得到尺寸信息

用法:(原文)

用法很简单,并且与其他观察者(例如 Performance Observer 或者 Intersection Observer)几乎相同——你可以使用 ResizeObserver() 构造函数创建一个新的 ResizeObserver,然后使用 ResizeObserver.observe() 使其寻找特定元素大小的更改。每次更改大小时,构造函数中设置的回调函数便会运行,从而提供对新尺寸的访问,并允许你根据需要执行任何操作。

 

posted @ 2022-12-17 21:55  Merrys  阅读(522)  评论(0编辑  收藏  举报