vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果


Posted in Javascript onMay 28, 2020

最近遇到了之前没有碰到过的一个问题:编辑器输入内容时,最好让内容一直保持在可视区域,比如如果区域超出的话,就在键盘抬起时向上滚动一定距离。

这个和聊天发消息还有一定的区别,聊天的话是只要点开输入框,就将内容定位到最下面: 即 dom.scrollTop = dom.scrollHeight即可,但是这个需要移动的是一部分距离,经过讨论最好是让当前光标的位置在键盘抬起时达到可视区域的最上面

那么这个距离肯定是根据光标的距离顶部位置决定的,但是光标距离顶部的距离我并没有度到如何获取,于是就自己瞎摸索,就有了接下来的解决办法

原理是利用的是光标属性可以拿到当前基于该属性的dom结构,就可以通过当前dom距离顶部的offsetTop值判断内容本身在键盘抬起时到底向上滚多少

废话不多说,上代码

let sel = window.getSelection();获取光标的所有属性

通过打印它的一些属性我们可以拿到一些我们所需要的东西(当前dom)

console.log(sel.getRangeAt(0).commonAncestorContainer.parentElement)

这个拿到的就是你当前的dom元素,只需要拿到它的offsetTop即可判断界面到底向上滚动多少

但是有的时候可能当前的属性是个行标签,拿不到offsetTop,那么我们可以找到基于它的父级块标签,我这里的上一级就是块标签,所以只需执行

sel.getRangeAt(0).commonAncestorContainer.parentElement.parentNode.offsetTop

就可以拿到想要的值

再通过

this.$nextTick(() => {
 dom.scrollTop = ket;
 });

这里声明必须在nextTick里进行操作才能更改成功,否则是没有效果的

完整demo

let sel = window.getSelection();
let ket = sel.getRangeAt(0).commonAncestorContainer.parentElement.offsetTop;
if(ket==0){//行标签
 ket = sel.getRangeAt(0).commonAncestorContainer.parentElement.parentNode.offsetTop
}
 this.$nextTick(() => {
 dom.scrollTop = ket;
});

或者通过三元拿值

let ket = sel.getRangeAt(0).commonAncestorContainer.parentElement.offsetTop==0?sel.getRangeAt(0).commonAncestorContainer.parentElement.parentNode.offsetTop:sel.getRangeAt(0).commonAncestorContainer.parentElement.offsetTop;

 this.$nextTick(() => {
 dom.scrollTop = ket;
});

这样试反正我是成功了,这里说一下键盘抬起不抬起不是我判断是,是由app端调用我的方法告知我的,希望小伙伴们不要走弯路....

总结

到此这篇关于vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果的文章就介绍到这了,更多相关vue编辑器键盘抬起内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Javascript Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
jquery获取当前日期的方法
Jan 14 Javascript
搞定immutable.js详细说明
May 02 Javascript
jQuery实现可移动选项的左右下拉列表示例
Dec 26 Javascript
JS实现一个简单的日历
Feb 22 Javascript
JavaScript实现动态增删表格的方法
Mar 09 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
May 10 Javascript
Vue源码解读之Component组件注册的实现
Aug 24 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
Sep 12 Javascript
Vue 3.0双向绑定原理的实现方法
Oct 23 Javascript
node+vue实现文件上传功能
May 28 #Javascript
vue中实现图片压缩 file文件的方法
May 28 #Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
May 28 #Javascript
Vue实现附件上传功能
May 28 #Javascript
如何使用Javascript中的this关键字
May 28 #Javascript
简单了解JavaScript arguement原理及作用
May 28 #Javascript
如何使用JavaScript检测空闲的浏览器选项卡
May 28 #Javascript
You might like
php 购物车实例(申精)
2009/05/11 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
Dom在ajax技术中的作用说明
2010/10/25 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
js调用webservice中的方法实现思路及代码
2013/02/25 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
详解JS中遍历语法的比较
2017/04/07 Javascript
JS判断两个对象内容是否相等的方法示例
2017/04/10 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
Python变量作用范围实例分析
2015/07/07 Python
Python实现截屏的函数
2015/07/25 Python
python 类详解及简单实例
2017/03/24 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python实现井字棋小游戏
2020/03/04 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
EJB的激活机制
2013/10/25 面试题
报到证丢失证明
2014/01/11 职场文书
新学期校长寄语
2014/01/18 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
拔河比赛口号
2014/06/10 职场文书
树转促学习心得体会
2014/09/10 职场文书
创业计划书之宠物店
2019/09/19 职场文书
Redis实现一个账号只能登录一个设备
2022/04/19 Redis