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 相关文章推荐
拖拉表格的JS函数
Nov 20 Javascript
js去除空格的12种实用方法
Nov 08 Javascript
JQuery中使用on方法绑定hover事件实例
Dec 09 Javascript
推荐4个原生javascript常用的函数
Jan 12 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
javascript产生随机数方法汇总
Jan 25 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
JavaScript数组复制详解
Feb 02 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
React如何将组件渲染到指定DOM节点详解
Sep 08 Javascript
JavaScript实现简单生成随机颜色的方法
Sep 21 Javascript
react中Suspense的使用详解
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
一个多文件上传的例子(原创)
2006/10/09 PHP
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
完美解决jQuery 鼠标快速滑过后,会执行多次滑出的问题
2016/12/08 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
图片懒加载插件实例分享(含解析)
2017/01/09 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
vue 本地环境跨域请求proxyTable的方法
2018/09/19 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
2019/09/26 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
Python任意字符串转16, 32, 64进制的方法
2019/06/12 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
小学教师培训感言
2014/02/11 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
提档介绍信范文
2015/10/22 职场文书
导游词之天津古文化街
2019/11/09 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android