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 相关文章推荐
javascript void(0)的妙用
Oct 21 Javascript
最新的10款jQuery内容滑块插件分享
Sep 18 Javascript
js点击页面其它地方将某个显示的DIV隐藏
Jul 12 Javascript
jquery应该如何来设置改变按钮input的onclick事件
Dec 10 Javascript
实例讲解JS中数组Array的操作方法
May 09 Javascript
JavaScript制作windows经典扫雷小游戏
Mar 31 Javascript
浅析javascript中的事件代理
Nov 06 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
Jul 10 Javascript
Bootstrap和Java分页实例第一篇
Dec 23 Javascript
提高Web性能的前端优化技巧总结
Feb 27 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
Apr 17 Javascript
json解析大全 双引号、键值对不在一起的情况
Dec 06 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中其实也可以用方法链
2011/11/10 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
用mysql_fetch_array()获取当前行数据的方法详解
2013/06/05 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
Symfony2实现在doctrine中内置数据的方法
2016/02/05 PHP
浅析PHP数据导出知识点
2018/02/17 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
laravel框架与其他框架的详细对比
2019/10/23 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
用js实现计算加载页面所用的时间
2010/04/02 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
前端必备插件之纯原生JS的瀑布流插件Macy.js
2017/11/22 Javascript
node.js博客项目开发手记
2018/03/16 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
python插入数据到列表的方法
2015/04/30 Python
python多线程同步之文件读写控制
2021/02/25 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
使用phonegap获取位置信息的实现方法
2017/03/31 HTML / CSS
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
sort命令的作用和用法
2012/11/04 面试题
环境工程毕业生自荐信
2013/11/17 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
办公自动化毕业生求职信
2014/03/09 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
银行给客户的感谢信
2015/01/23 职场文书
党校个人总结
2015/03/04 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python