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 相关文章推荐
jQuery 技巧小结
Apr 02 Javascript
javascript showModalDialog 内跳转页面的问题
Nov 25 Javascript
Extjs表单常见验证小结
Mar 07 Javascript
CSS3,HTML5和jQuery搜索框集锦
Dec 02 Javascript
利用angularjs1.4制作的简易滑动门效果
Feb 28 Javascript
Vue插件打包与发布的方法示例
Aug 20 Javascript
jQuery-ui插件sortable实现自由拖动排序
Dec 01 jQuery
vue生命周期的探索
Apr 03 Javascript
微信用户访问小程序的登录过程详解
Sep 20 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
Oct 26 Javascript
解决vue项目中遇到 Cannot find module ‘chalk‘ 报错的问题
Nov 05 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
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
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
一个经典的PHP验证码类分享
2014/11/18 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
JS实现搜索关键词的智能提示功能
2017/07/07 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
详解vue中router-link标签所必备了解的属性
2019/04/15 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python访问sqlserver示例
2014/02/10 Python
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
python爬虫入门教程--优雅的HTTP库requests(二)
2017/05/25 Python
Python 统计位数为偶数的数字代码详解
2020/03/15 Python
python中常见错误及解决方法
2020/06/21 Python
python excel和yaml文件的读取封装
2021/01/12 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
大学生优秀团员事迹材料
2014/01/30 职场文书
区级文明单位申报材料
2014/05/15 职场文书
优秀志愿者感言
2015/08/01 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
Mysql数据库手动及定时备份步骤
2021/11/07 MySQL
python3中apply函数和lambda函数的使用详解
2022/02/28 Python