当前位置: 首页 > news >正文

重庆网站建设cqsday企业网站系统详细设计

重庆网站建设cqsday,企业网站系统详细设计,wordpress 预约主题,wordpress 仿小米主题在 Vue3 中监听一个 div 元素的动态高度变化并同步设置另一个元素的高度,最佳实践是使用 ResizeObserver API。 在开发中,常有上中下分布列表页,如下: 需求现象 :列表滚动区域需要具体高度来滚动,但是搜索区…

在 Vue3 中监听一个 div 元素的动态高度变化并同步设置另一个元素的高度,最佳实践是使用 ResizeObserver API。

在开发中,常有上中下分布列表页,如下:
需求现象 :列表滚动区域需要具体高度来滚动,但是搜索区域会随页面拉伸等变化高度。
在这里插入图片描述

处理方法一:最佳方案:使用 ResizeObserver

  • ResizeObserver API​​:
    现代浏览器原生支持,高效监听元素尺寸变化
    比轮询或MutationObserver性能更好
  • ​​生命周期管理​​:
    onMounted中初始化观察器
    onBeforeUnmount中清理观察器,避免内存泄漏
  • ​​初始高度设置​​:
    在开始观察前先同步一次初始高度
  • ​​平滑过渡​​:
    通过CSS transition实现高度变化的动画效果
	<template><div class="container"><!-- 高度会动态变化的源元素 --><div ref="sourceRef" class="source-element">内容可能动态变化导致高度改变...</div><!-- 需要同步高度的目标元素 --><div ref="targetRef" class="target-element">我的高度会跟随上方元素</div></div></template><script setup>import { ref, onMounted, onBeforeUnmount } from 'vue'const sourceRef = ref(null)const targetRef = ref(null)let resizeObserver = null// 处理高度变化的回调函数const handleResize = (entries) => {if (!targetRef.value) returnfor (let entry of entries) {const { height } = entry.contentRecttargetRef.value.style.height = `${height}px`// 也可以使用CSS变量:// targetRef.value.style.setProperty('--dynamic-height', `${height}px`)}}onMounted(() => {// 初始化观察器resizeObserver = new ResizeObserver(handleResize)if (sourceRef.value) {// 开始观察源元素resizeObserver.observe(sourceRef.value)// 初始设置一次高度const initHeight = sourceRef.value.getBoundingClientRect().heighttargetRef.value.style.height = `${initHeight}px`}})onBeforeUnmount(() => {// 组件卸载时停止观察if (resizeObserver) {resizeObserver.disconnect()}// 或// resizeObserver?.disconnect()})</script><style>.source-element {border: 1px solid #ccc;padding: 20px;/* 高度由内容决定 */}.target-element {border: 1px solid #f0f;margin-top: 10px;overflow: hidden;transition: height 0.3s ease; /* 添加平滑过渡效果 */}</style>

优化—响应式地存储高度值

这种方法将高度值存储在响应式变量中,便于在其他地方使用。

	<script setup>import { ref, onMounted, onBeforeUnmount } from 'vue'const sourceRef = ref(null)const targetRef = ref(null)const dynamicHeight = ref(0)let resizeObserver = nullonMounted(() => {resizeObserver = new ResizeObserver((entries) => {entries.forEach(entry => {dynamicHeight.value = entry.contentRect.height})})if (sourceRef.value) {resizeObserver.observe(sourceRef.value)}})// 使用watch监听高度变化watch(dynamicHeight, (newHeight) => {if (targetRef.value) {targetRef.value.style.height = `${newHeight}px`}})onBeforeUnmount(() => {resizeObserver?.disconnect()})</script>

使用 @resize 事件(需配合自定义指令)

如果项目中频繁需要监听尺寸变化,可以封装一个自定义指令:

// directives/resize.js
export default {mounted(el, binding) {const callback = binding.value;const observer = new ResizeObserver((entries) => {callback(entries[0].contentRect);});observer.observe(el);el._resizeObserver = observer;},unmounted(el) {if (el._resizeObserver) {el._resizeObserver.disconnect();}},
};
<template><div v-resize="onSourceResize">源元素</div><div :style="{ height: targetHeight + 'px' }">目标元素</div>
</template><script setup>
import { ref } from 'vue';
import resizeDirective from './directives/resize';const targetHeight = ref(0);const onSourceResize = (rect) => {targetHeight.value = rect.height;
};
</script>

注意事项
性能:ResizeObserver 是异步触发的,避免在回调中执行高耗能操作。
兼容性:如果需要支持旧浏览器,需引入 resize-observer-polyfill。
初始高度:在 onMounted 中可能需要手动设置一次初始高度。

完整示例(基于 ResizeObserver)

<template><div ref="source" class="source"><p>源元素内容(高度可能变化)</p><button @click="addContent">增加内容</button></div><div ref="target" class="target" :style="{ height: targetHeight + 'px' }">目标元素(高度同步源元素)</div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';const source = ref(null);
const target = ref(null);
const targetHeight = ref(0);
let observer = null;const updateHeight = () => {if (source.value) {targetHeight.value = source.value.offsetHeight;}
};onMounted(() => {observer = new ResizeObserver(updateHeight);if (source.value) {observer.observe(source.value);updateHeight(); // 初始化高度}
});onBeforeUnmount(() => {if (observer) observer.disconnect();
});const addContent = () => {const p = document.createElement('p');p.textContent = '新增内容 ' + Math.random();source.value.appendChild(p);
};
</script><style>
.source {border: 1px solid blue;padding: 10px;margin-bottom: 10px;
}
.target {border: 1px solid red;padding: 10px;background: #eee;
}
</style>

代替方案比较:

在这里插入图片描述

http://www.dtcms.com/a/504825.html

相关文章:

  • 怎么备案网站学校网站进不去怎么办
  • ST_MCSDK生成工程—无感
  • 6731官方网站下载设计公司logo免费设计生成器
  • 国航网站建设近期国内重大新闻
  • aps网站服务建设手机网站html模板下载
  • 新网站百度有审核期wordpress喜欢功能
  • 做网站可以用哪些语言网站建设价格正规
  • PS基本教学(五)——图层
  • ftp 企业网站微信小程序开发介绍
  • dw做网站首页代码社区网站源码
  • 企业学习型文化的力量
  • 新闻类网站模板东莞销售网站建设
  • 安阳百度网站制作多少钱找个网页公司做网站
  • 做趣味图形的网站常用个人网站
  • 百度seo网站优化 网络服务windows 网站模板
  • 企业的网站建设费用网站开发前端设计
  • 品牌商城网站项目跨站攻击 wordpress
  • 营销型网站建设方案演讲ppt建个站的免费网站能上百度吗
  • Java中Map相关操作
  • 公司建一个网站多少费用asp网站开发后如何交付
  • 新手建设网站的步骤品牌网站建设咨询
  • 京津冀网站建设公司邯郸房产信息网查询系统
  • 北京附近做网站的公司有哪些云服务器网站建站
  • wap 网站源码个人视频网站源码
  • 04-优先级与延时链表
  • 开个做网站的公司网页版微信怎么加好友
  • 企业怎样选择域名做网站网站建设与维护论文
  • 做网站公司关键词阿里巴巴国际站入驻
  • 小规模企业做网站wordpress批量 添加别名
  • 天津网站建设揭秘创建网页教程