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也谈内存优化
Jun 06 Javascript
jquery动态分页效果堪比时光网
Sep 25 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
jQuery中使用animate自定义动画的方法
May 29 Javascript
JQuery和HTML5 Canvas实现弹幕效果
Jan 04 Javascript
微信小程序 图片边框解决方法
Jan 16 Javascript
js获取当前页的URL与window.location.href简单方法
Feb 13 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
Apr 18 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
Aug 01 Javascript
使用Angular Cli如何创建Angular私有库详解
Jan 30 Javascript
javascript实现日历效果
Jun 17 Javascript
vue实现路由懒加载的3种方法示例
Sep 01 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 图像尺寸调整代码
2010/05/26 PHP
php实现递归的三种基本方式
2020/07/04 PHP
[原创]php实现 data url的图片生成与保存
2016/12/04 PHP
自动检查并替换文本框内的字符
2006/06/30 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
ES6 javascript中Class类继承用法实例详解
2017/10/30 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
JS画布动态实现黑客帝国背景效果
2020/11/08 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
python保存数据到本地文件的方法
2018/06/23 Python
python中将zip压缩包转为gz.tar的方法
2018/10/18 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
Python实现分数序列求和
2020/02/25 Python
关于Python解包知识点总结
2020/05/05 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
python wsgiref源码解析
2021/02/06 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
汽车专业学生自我评价
2014/01/19 职场文书
小学教师培训感言
2014/02/11 职场文书
施工质量承诺书范文
2014/05/30 职场文书
优秀会计求职信
2014/07/04 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
文明单位创建材料
2014/12/24 职场文书
房地产置业顾问岗位职责
2015/04/11 职场文书
通知的写法
2015/04/23 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
食品安全主题班会
2015/08/13 职场文书