当前位置: 首页 > Web前端 > vue.js

vue实现当编辑器键盘抬起时,内容跟随光标从顶部位置向上滚动

时间:2023-03-31 21:50:04 vue.js

最近遇到一个以前没遇到过的问题:编辑输入内容的时候,内容最好保持在可见区域。例如,如果区域超出,则在抬起键盘时向上滚动一定距离。这与聊天和发送消息不同。聊天的话,只要点击输入框,内容就会定位到底部:即dom.scrollTop=dom.scrollHeight,但是这个需要移动一部分距离。经过讨论最好让当前光标位置在抬起键盘时到达可见区域的顶部,那么这个距离就要根据光标到顶部位置的距离来确定,但是我不知道如何获取到光标到顶部的距离,于是我自己摸索了一番,就有了下一个解决方案。原理是利用cursor属性,根据该属性获取当前dom结构,然后在键盘抬起时,通过当前dom距顶部的offsetTop值判断内容本身。让sel=window.getSelection();获取光标的所有属性通过打印它的一些属性,我们可以得到我们需要的东西(当前dom)console.log(sel.getRangeAt(0).commonAncestorContainer.parentElement)你得到的是你当前的dom元素。只需要获取它的offsetTop就可以判断界面向上滚动了多少。但是有时候当前的属性可能是一个行标签,获取不到offsetTop,那么我们可以根据它找到父块标签。我这里的上层是块标签,所以只要执行sel.getRangeAt(0).commonAncestorContainer.parentElement.parentNode.offsetTop得到想要的值然后Throughthis.$nextTick(()=>{dom.scrollTop=ket;});这里声明必须在nextTick中进行操作才能改变成功,否则就是一个没有效果的完整demoletsel=window.getSelection();letket=sel.getRangeAt(0).commonAncestorContainer.parentElement.offsetTop;if(ket==0){//行标签ket=sel.getRangeAt(0).commonAncestorContainer.parentElement.parentNode.offsetTop}this.$nextTick(()=>{dom.scrollTop=ket;});还是通过三元取值让ket=sel.getRangeAt(0).commonAncestorContainer.parentElement.offsetTop==0?反正试试这个我成功了。这里我说键盘有没有抬起不是我的判断。是应用程序调用我的方法来通知我。希望小伙伴们不要走弯路....