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 相关文章推荐
关于使用 jBox 对话框的提交不能弹出问题解决方法
Nov 07 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
May 08 Javascript
js获取IP地址的方法小结
Jul 01 Javascript
jQuery中html()方法用法实例
Dec 25 Javascript
浅谈js中变量初始化
Feb 03 Javascript
jQuery实现的网页竖向菜单效果代码
Aug 26 Javascript
angularjs学习笔记之双向数据绑定
Sep 26 Javascript
解决JavaScript数字精度丢失问题的方法
Dec 03 Javascript
JavaScript中的this机制
Jan 30 Javascript
CentOS环境中MySQL修改root密码方法
Jan 07 Javascript
Vue.js 踩坑记之双向绑定
May 03 Javascript
如何使用webpack打包一个库library的方法步骤
Dec 18 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整数取余返回负数的相关解决方法
2014/05/15 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
JAVASCRIPT style 中visibility和display之间的区别
2010/01/22 Javascript
20个最新的jQuery插件
2012/01/13 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
JavaScrip数组去重操作实例小结
2019/06/20 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
ant design的table组件实现全选功能以及自定义分页
2020/11/17 Javascript
在Python的Django框架中包装视图函数
2015/07/20 Python
python杀死一个线程的方法
2015/09/06 Python
python 生成器协程运算实例
2017/09/04 Python
TensorFlow搭建神经网络最佳实践
2018/03/09 Python
在python中bool函数的取值方法
2018/11/01 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
keras .h5转移动端的.tflite文件实现方式
2020/05/25 Python
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
经济实惠的豪华背包和行李袋:Packs Project
2018/10/17 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
会计电算化个人自我评价
2013/11/17 职场文书
失业者真诚求职信范文
2013/12/25 职场文书
2014年创卫实施方案
2014/02/18 职场文书
初中生操行评语大全
2014/04/24 职场文书
2014四风问题对照检查材料范文
2014/09/15 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书