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 仿关机效果的图片层
Dec 26 Javascript
javascript onmouseout 解决办法
Jul 17 Javascript
基于jQuery的输入框无值自动显示指定数据的实现代码
Jan 24 Javascript
js查找节点的方法小结
Jan 13 Javascript
原生Js实现简易烟花爆炸效果的方法
Mar 20 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
Nov 15 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
gulp解决跨域的配置文件问题
Jun 08 Javascript
JavaScript模拟实现封装的三种方式及写法区别
Oct 27 Javascript
VuePress 快速踩坑小结
Feb 14 Javascript
ElementUI之Message功能拓展详解
Oct 18 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
Mar 02 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 表单数据的获取代码
2009/03/10 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
浅谈php使用curl模拟多线程发送请求
2019/03/08 PHP
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
DOM 中的事件处理介绍
2012/01/18 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
jQuery中find()方法用法实例
2015/01/07 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
JS组件Bootstrap Table表格多行拖拽效果实现代码
2015/12/08 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
vue.js自定义组件directives的实例代码
2018/11/09 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
Python实现的栈(Stack)
2018/01/26 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
利用python实现凯撒密码加解密功能
2020/03/31 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
体育教学随笔感言
2014/02/24 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
年终工作总结范文2014
2014/11/27 职场文书
小学班主任心得体会
2016/01/07 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
详解PHP设计模式之依赖注入模式
2021/05/25 PHP
python内置进制转换函数的操作
2021/06/02 Python