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 快速结束当前正在执行的动画
Nov 20 Javascript
用console.table()调试javascript
Sep 04 Javascript
javascript验证身份证号
Mar 03 Javascript
jQuery UI插件自定义confirm确认框的方法
Mar 20 Javascript
浅析jQuery 3.0中的Data
Jun 14 Javascript
微信js-sdk上传与下载图片接口用法示例
Oct 12 Javascript
深入理解jquery中extend的实现
Dec 22 Javascript
详解react-router如何实现按需加载
Jun 15 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
浅谈Vue.js路由管理器 Vue Router
Aug 16 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
JavaScript实现移动端带transition动画的轮播效果
Mar 24 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生成静态页面详解
2006/11/19 PHP
PHP strtotime函数详解
2009/12/18 PHP
使用php清除bom示例
2014/03/03 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
仿服务器端脚本方式的JS模板实现方法
2007/04/27 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
angularJS 入门基础
2015/02/09 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
Python MySQLdb Linux下安装笔记
2015/05/09 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
django表单的Widgets使用详解
2019/07/22 Python
python3下pygame如何实现显示中文
2020/01/11 Python
多个python文件调用logging模块报错误
2020/02/12 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
python3 logging日志封装实例
2020/04/08 Python
Python flask框架端口失效解决方案
2020/06/04 Python
Python生成随机验证码代码实例解析
2020/06/09 Python
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
Lands’ End英国官方网站:高质量男女服装
2017/10/07 全球购物
中学老师的自我评价
2013/11/07 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
信仰心得体会
2014/09/05 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
科学发展观标语
2014/10/08 职场文书
委托书范本格式
2019/04/18 职场文书