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 & json的省市区联动代码
Jun 26 Javascript
SOSO地图JS画出标注和中心点以html形式运行
Aug 09 Javascript
js 与 php 通过json数据进行通讯示例
Mar 26 Javascript
node.js中的path.dirname方法使用说明
Dec 09 Javascript
jQuery找出网页上最高元素的方法
Mar 20 Javascript
20170918 前端开发周报之JS前端开发必看
Sep 18 Javascript
bootstrap轮播模板使用方法详解
Nov 17 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
vue 中基于html5 drag drap的拖放效果案例分析
Nov 01 Javascript
Vue-CLI3.x 设置反向代理的方法
Dec 06 Javascript
node.js express框架简介与实现
Jul 23 Javascript
基于VUE的v-charts的曲线显示功能
Oct 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
修改了一个很不错的php验证码(支持中文)
2007/02/14 PHP
php字符串截取函数用法分析
2014/11/25 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
详解PHP归并排序的实现
2016/10/18 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
JS与框架页的操作代码
2010/01/17 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
基于javascript实现九九乘法表
2016/03/27 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
vue两组件间值传递 $router.push实现方法
2019/05/15 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
[04:38]完美世界携手游戏风云打造 卡尔工作室饰品系统篇
2013/04/25 DOTA
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
python 动态调用函数实例解析
2019/10/21 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
中专自荐信
2013/10/13 职场文书
秋季运动会广播稿大全
2014/02/17 职场文书
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS
Python函数对象与闭包函数
2022/04/13 Python
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL