网站首页 > 技术文章 正文
新来的产品经理,想做一个和qq或者微信聊天一样的,上下拖动动态改变文本内容框和编辑器布局的需求。 其实一开始是一头雾水的,但是通过万能的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;
});
},
最终效果
参考资料
https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/ResizeObserver https://github.com/mdn/dom-examples/blob/master/resize-observer/resize-observer-text.html
努力成为优秀的前端工程师!
期待和大家交流,共同进步
微信公众号: 大大大前端 / excellent_developers
努力成为优秀前端工程师!
- 上一篇: 引起浏览器重排与重绘? 浏览器显示重叠
- 下一篇: 2.1 窗口和控件 窗口位置与控件名称
猜你喜欢
- 2024-11-12 pyqtgraph系列文章:直方图(Histogram)
- 2024-11-12 Window对象的常见事件 window对象常用的方法有哪些?
- 2024-11-12 JavaScript Window - 浏览器对象模型
- 2024-11-12 Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)
- 2024-11-12 前端移动端常见问题 前端移动端适配方案
- 2024-11-12 WindowsServer2022:如何扩展磁盘空间?
- 2024-11-12 第36节 window对象的窗口-JavaScript
- 2024-11-12 JavaScript Screen对象 screen对象包含的属性可以修改
- 2024-11-12 「Pygame经典合集」??????终极白嫖大招:让你玩儿到爽
- 2024-11-12 Qt 教程| QScatterSeries 散点图 qt三维散点图
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-