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 bxCarousel实现图片滚动切换效果示例代码
May 15 Javascript
简单实用的全选反选按钮例子
Oct 18 Javascript
jquery用data方法获取某个元素上的事件
Jun 23 Javascript
简述jQuery ajax的执行顺序
Jan 05 Javascript
三种Node.js写文件的方式
Mar 08 Javascript
判断横屏竖屏(三种)
Feb 13 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
基于JavaScript实现的快速排序算法分析
Apr 14 Javascript
vue源码解析之事件机制原理
Apr 21 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
Sep 02 Javascript
Vue中父子组件的值传递与方法传递
Sep 28 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/10/09 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
jquery插件tooltipv顶部淡入淡出效果使用示例
2013/12/05 Javascript
JS中操作JSON总结
2020/12/06 Javascript
JavaScript中的console.group()函数详细介绍
2014/12/29 Javascript
12306验证码破解思路分享
2015/03/25 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
2017/05/17 jQuery
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
详解tensorflow实现迁移学习实例
2018/02/10 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
python实现ping命令小程序
2020/12/28 Python
水芝澳美国官网:H2O Plus
2016/10/15 全球购物
实习期自我鉴定
2013/10/11 职场文书
中英文自我评价常用句型
2013/12/19 职场文书
财务简历的自我评价
2014/03/05 职场文书
生产车间标语
2014/06/11 职场文书
2014年党员评议表自我评价
2014/09/27 职场文书
李强感恩观后感
2015/06/17 职场文书
导游词之新疆-喀纳斯
2019/10/10 职场文书
JS数组方法some、every和find的使用详情
2021/10/05 Javascript
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS
德生BCL3000抢先使用感受和评价
2022/04/07 无线电