ResizeObserver是什么?

简介: 新来的产品经理,想做一个和qq或者微信聊天一样的,上下拖动动态改变文本内容框和编辑器布局的需求。

image.png其实一开始是一头雾水的,但是通过万能的mdn,以及充满智慧的我,最终还是完成了这个需求。


其中最核心的还是ResizeObserver这个第一次用的类,所以会在这里做一些记录。

  • ResizeObserver初识
  • ResizeObserver实战


ResizeObserver初识


  • ResizeObserver interface可以报告元素content或者border box,或者svg元素box大小的变化
  • ResizeObserver.disconnect() 取消观察某个observer的所有observed目标元素。
  • ResizeObserver.observe() 初始化观察一个指定元素。
  • ResizeObserver.observe() 取消观察一个指定元素。
  • new ResizeObserver(callback) callback的入参包括entries和observer。


entries是一个数组,它由所有的ResizeObserverEntry object组成。通过for (let entry of entries) {}的方式,entry代表一个ResizeObserver object,一个entry由contentRect和target组成。


在resize相关实践中,entry的contentRect对象是最最重要的。


{target: div, contentRect: DOMRectReadOnly}
contentRect: DOMRectReadOnly
bottom: 312.3125
height: 292.3125
left: 20
right: 626
top: 20
width: 606
x: 20
y: 20
__proto__: DOMRectReadOnly
target: div
__proto__: ResizeObserverEntry


ResizeObserver实战


Make element resizable

  • 元素应用resize css属性。
  • 元素ResizeObserver化。


<div class="main" :style="{minHeight: dynamicMainHeight}">
      <chatView></chatView>
</div>


.main {
    resize: vertical;
    overflow: auto;
}


 observeChatView() {
    if (window.ResizeObserver) {
      const viewElem = document.querySelector('.main');
      const resizeObserver = new ResizeObserver((entries) => {
        for (const entry of entries) {
          if (!this.initialHeight) {
            this.initialHeight = entry.contentRect.height;
          }
          if (this.initialHeight) {
            const deltaHeight = this.initialHeight - entry.contentRect.height;
            this.$bus.$emit('rerenderViewAndEditor', deltaHeight);
          }
        }
      });
      resizeObserver.observe(viewElem);
    } else {
      this.$Message.warning('不支持ResizeObserver');
    }
  },
},


动态计算的editor组件

<div
  class="rich-text-editor"
  contenteditable
  data-placeholder="按下Enter发送消息,按下Shift+Enter换行"
  :style="{height: dynamicHeight}"
></div>
computed: {
  dynamicHeight() {
    return `${defaultEditorHeight + this.deltaHeight}px`;
  },
},
this.$bus.$on('rerenderViewAndEditor', (deltaHeight) => {
    this.deltaHeight = deltaHeight;
});


动态计算的view组件


自动跳到最新一条消息的chatView组件需要减去deltaHeight,从而增大scrollHeight的高度。


this.$bus.$on('rerenderViewAndEditor', (deltaHeight) => {
  this.visiableHeight = document.body.clientHeight - deltaHeight;
  this.deltaHeight = deltaHeight;
});
scrollToBottom() {
  this.$nextTick(() => {
    this.scrollTop = this.scrollHeight - this.deltaHeight;
  });
},


最终效果

image.png


参考资料


https://developer.mozilla.org...

https://github.com/mdn/dom-ex...



相关文章
|
7月前
vw、px、vh 和 rem应用场景以及区别
【4月更文挑战第2天】 vw、px、vh 和 rem应用场景以及区别
1002 10
|
7月前
|
存储 移动开发 JavaScript
uni-app页面数据传参方式
uni-app页面数据传参方式
460 4
|
7月前
|
JSON JavaScript 数据安全/隐私保护
npm命令:常用npm命令及其详解!
npm命令:常用npm命令及其详解!
|
2月前
|
JavaScript 前端开发 API
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
862 0
|
6月前
|
API 开发工具
企业微信api接口调用-触发推送企业微信微信好友
企业微信api接口调用-触发推送企业微信微信好友
|
5月前
|
存储 JavaScript 容器
Element UI表格拖拽(vue中) —— 行拖拽、列拖拽
Element UI表格拖拽(vue中) —— 行拖拽、列拖拽
851 0
|
API
window resize和scroll事件性能优化
window resize和scroll事件性能优化
245 0
|
7月前
|
Java
一招轻松解决node内存溢出问题
一招轻松解决node内存溢出问题
|
JavaScript 数据可视化 数据格式
vue实现歌词滚动
最近看了一篇关于音频可视化的博文,然后偶然联想到歌词滚动这个效果,虽然网上介绍歌词滚动 的文章已经很多了,但是并不是每一个人实现的思路都是一致的,所以在这给大家分享一下我自己的一些想法,和具体是如何实现这个功能的 。
202 0
|
弹性计算 并行计算 云栖大会
新品发布|HPC优化实例助力工业制造、生命科学和 EDA 应用加速创新
2023年云栖大会,阿里云弹性计算面向工业仿真、生命科学和芯片设计等行业,阿里云发布了HPC优化实例系列新品,包括内存带宽优化实例hpc8ae、数据和内存优化实例hpc7ip和计算优化实例hpc8y,全面采用物理核,与通用计算实例相比性能提升40%。