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 相关文章推荐
新浪刚打开页面出来的全屏广告代码
Apr 02 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
Nov 19 Javascript
JS图像无缝滚动脚本非常好用
Feb 10 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
Jun 12 jQuery
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
knockoutjs模板实现树形结构列表
Jul 31 Javascript
vue双向绑定数据限制长度的方法
Nov 04 Javascript
小程序使用wxs解决wxml保留2位小数问题
Dec 13 Javascript
原生JavaScript创建不可变对象的方法简单示例
May 07 Javascript
原生JavaScript实现轮播图
Jan 10 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
隐藏X-Space个人空间下方版权方法隐藏X-Space个人空间标题隐藏X-Space个人空间管理版权方法
2007/02/22 PHP
php 无限分类的树类代码
2009/12/03 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
PHP Curl出现403错误的解决办法
2014/05/29 PHP
destoon复制新模块的方法
2014/06/21 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
原生js生成图片验证码
2020/10/11 Javascript
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
Python正规则表达式学习指南
2016/08/02 Python
python和opencv实现抠图
2018/07/18 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
生物制药毕业生自荐信
2013/10/16 职场文书
小学教育毕业生自荐信
2013/11/18 职场文书
客服专员岗位职责范本
2013/11/29 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
搞笑结婚保证书
2015/05/08 职场文书
余世维讲座观后感
2015/06/11 职场文书
毕业生就业推荐表自我鉴定
2019/06/20 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
详解php中流行的rpc框架
2021/05/29 PHP