惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog
博客园 - 聂微东
小众软件
小众软件
J
Java Code Geeks
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
量子位
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Apple Machine Learning Research
Apple Machine Learning Research
有赞技术团队
有赞技术团队
月光博客
月光博客
B
Blog RSS Feed
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
I
Intezer
The Register - Security
The Register - Security
博客园 - 【当耐特】
博客园 - 司徒正美
L
Lohrmann on Cybersecurity
U
Unit 42
N
News and Events Feed by Topic
S
Security Affairs
V
Visual Studio Blog
Y
Y Combinator Blog
Security Latest
Security Latest
Know Your Adversary
Know Your Adversary
Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
S
Schneier on Security
P
Privacy International News Feed
TaoSecurity Blog
TaoSecurity Blog
Spread Privacy
Spread Privacy
G
Google Developers Blog
NISL@THU
NISL@THU
Project Zero
Project Zero
P
Palo Alto Networks Blog
Help Net Security
Help Net Security
宝玉的分享
宝玉的分享
Stack Overflow Blog
Stack Overflow Blog
S
Security @ Cisco Blogs
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com

青空之蓝

[青空之蓝-2023] - 色彩 | 青空之蓝 [青空之蓝-2022] - 平静 | 青空之蓝 [青空之蓝-2021] - 远望 | 青空之蓝 浅谈垃圾回收 | 青空之蓝 浅谈泛型擦除 | 青空之蓝 浅谈单点登录 | 青空之蓝 使用 Kotlin 编写 Spring 测试 | 青空之蓝 设计模式系列文章 | 青空之蓝 从零实现一个 Java 微框架 - IoC | 青空之蓝 从零实现一个 Java 微框架 - 前言 | 青空之蓝 浅谈 JVM:类加载 | 青空之蓝 浅谈 IO | 青空之蓝 浅谈并发:synchronized & ReentrantLock | 青空之蓝 浅谈并发:CAS & AQS | 青空之蓝 浅谈并发:ThreadLocal | 青空之蓝 浅谈并发:三大特性 | 青空之蓝 浅谈组合注解 & 注解别名 | 青空之蓝 [青空之蓝-2020]-迷茫 | 青空之蓝 Java 系列文章 | 青空之蓝 HTTP 系列文章 | 青空之蓝 浅谈 EatWhatYouKill | 青空之蓝 浅谈可扩展线程池 | 青空之蓝 聊聊写框架 | 青空之蓝 聊聊现状-[2020-09] | 青空之蓝 浅谈并发:锁 | 青空之蓝 浅谈并发:基础 | 青空之蓝 浅谈缓存 | 青空之蓝 无须定义类,Spring 快速注入 Json 参数 | 青空之蓝 浅谈 Proxy 和 Aop | 青空之蓝 从零实现一个 PHP 微框架 - 初始化请求 | 青空之蓝 为 Vue3 添加一个简单的 Store | 青空之蓝 从零实现一个 PHP 微框架 - 服务提供者 | 青空之蓝 WSL2 踩坑记录 | 青空之蓝 浅谈浏览器Event Loop [更新] | 青空之蓝 从零实现一个 PHP 微框架 - Bootstrap 启动加载 | 青空之蓝 从零实现一个 PHP 微框架 - IoC 容器 | 青空之蓝 从零实现一个 PHP 微框架 - PSR & Composer | 青空之蓝 从零实现一个 PHP 微框架 - 前言 | 青空之蓝 MVVM 简单实现 | 青空之蓝 浅谈 DI 和 IoC | 青空之蓝 中间件实现 [PHP] | 青空之蓝 告别 Windows 终端的难看难用,打造好用的 PowerShell | 青空之蓝 VSCode Java输出中文乱码问题解决[更新] | 青空之蓝 浅谈浏览器渲染 | 青空之蓝 Vue-Cli@2 项目迁移日志 | 青空之蓝 Laragon & Scoop 集成踩坑记录 | 青空之蓝 「一行代码」优雅管理 Windows 软件 | 青空之蓝 [青空之蓝-2019]-年度总结 | 青空之蓝 为Vue添加简单的Store | 青空之蓝 为React添加简单的Store | 青空之蓝 为Vuex添加同步Action | 青空之蓝 浅谈B+树 | 青空之蓝 浅谈跳表 | 青空之蓝 浅谈数据库索引 | 青空之蓝 MySQL事务隔离 | 青空之蓝 算法复杂度分析(1) | 青空之蓝 一年来的经验总结 | 青空之蓝 Acrylic - VSCode Extension | 青空之蓝 Java二叉树实现 | 青空之蓝 Java图实现 | 青空之蓝 为apt方式安装的nginx重新编译增加WebDAV | 青空之蓝 XK-Editor - 一个支持富文本和Markdown的编辑器 | 青空之蓝 JS生成列表树 | 青空之蓝 Laravel生成目录树 | 青空之蓝 XK-Note - 集各种神奇功能的云笔记 | 青空之蓝 PHP GD生成验证码 | 青空之蓝 PHP GD图片处理[转换格式-水印-缩略图] | 青空之蓝 Origami - 简洁轻快的WordPress主题 | 青空之蓝 为WordPress启用WorkBox | 青空之蓝 [青空之蓝-2018]-年度总结 | 青空之蓝 VSCode Java手动导入jar和源码包 | 青空之蓝 Windows IP变化自动发送邮件 | 青空之蓝 C链表实现重制版 | 青空之蓝 C 结构体的定义和使用 | 青空之蓝 图的搜索(遍历) - BFS & DFS | 青空之蓝 Java链表实现 | 青空之蓝 C 快速排序 | 青空之蓝 C 插入排序 | 青空之蓝 C 归并排序 | 青空之蓝 C语言链表实现 | 青空之蓝 VSCode配置Java调试环境[Windows] | 青空之蓝 C 选择排序 | 青空之蓝 C 冒泡排序 | 青空之蓝 VSCode配置PHP调试环境[Windows] | 青空之蓝 VSCode配置C/C++ GDB调试环境[Windows] | 青空之蓝 WordPress友情链接模板 | 青空之蓝 Intel Optane 傲腾内存体验 | 青空之蓝 Mysql双机热备实战 | 青空之蓝 博客一年记录 | 青空之蓝 为WordPress启用Service Worker | 青空之蓝 Bing每日一图API | 青空之蓝 iframe延迟加载 | 青空之蓝 写在2018年高考前 | 青空之蓝 The Fox主题汉化分享 | 青空之蓝 [青空之蓝-2017]-崭新 | 青空之蓝 本博客评论规则 | 青空之蓝 世界,您好! | 青空之蓝
ace编辑器设置惯性滚动 | 青空之蓝
Otstar Lin · 2019-05-11 · via 青空之蓝

上个月我写了XK Editor这个项目,使用了 ace 编辑器和 tinymce 编辑器作为基础编辑器,但是当项目进入适配移动端的时候,遇到了一个很头疼的问题,ace 编辑器不支持惯性滚动,用起来会非常变扭,于是便为之增加惯性滚动的功能。

原理

惯性滚动,即在触屏设备中滑动手指,当手指离开屏幕后,滚动事件并不会立即停止,而是会继续移动一段距离,这段距离是由手离开屏幕时的滚动速度和预设的摩擦力决定的,通过这时的速度,预设的摩擦力和特定的公式计算出一系列滚动点,然后逐个滚动到滚动点,来模拟惯性滚动。

实现方案

  1. 监听开始触摸的事件,记录开始的时间和开始的坐标,同时重置滚动(防止连续滚动出现 Bug)
  2. 监听触摸结束的时间,记录结束的时间和结束的坐标
  3. 通过公式v = (endY - startY) / (endTime - startTime) * 1.5 1.5 的值可以调整
  4. 定义“摩擦力”deceleration = dir * 0.0018 0.0018 也可以调整
  5. 在每次微滚动前都计算一下滚动的坐标,然后进行滚动。
  6. 直至速度为 0 或者速度方向改变的时候停止滚动

实现代码

//惯性滚动
var editorDom = document.querySelector(".ace-editor");
var inertiaScrollTime = null;
editorDom.addEventListener("touchstart", function (event) {
  clearTimeout(inertiaScrollTime);
  var startY = event.changedTouches[0].pageY;
  var endY = 0;
  var startTime = Date.now();
  var endTime = 0;
  editorDom.addEventListener("touchend", function (event) {
    endY = event.changedTouches[0].pageY;
    endTime = Date.now();
    var _v = ((endY - startY) / (endTime - startTime)) * 1.5;

    function scrollToTop(v, sTime, contentY) {
      var dir = v > 0 ? -1 : 1;
      var deceleration = dir * 0.0018;
      var duration = v / deceleration;

      function inertiaMove() {
        // if(stopInertia) return
        var nowTime = Date.now();
        var t = nowTime - sTime;
        var nowV = v + t * deceleration;
        // 速度方向变化表示速度达到0了
        if (dir * nowV > 0) {
          return;
        }
        var moveY = (-(v + nowV) / 2) * t;
        window.$ace.session.setScrollTop(contentY + moveY);
        inertiaScrollTime = setTimeout(inertiaMove, 10);
      }
      inertiaMove();
    }
    scrollToTop(_v, endTime, window.$ace.session.getScrollTop());
  });
});
//惯性滚动
var editorDom = document.querySelector(".ace-editor");
var inertiaScrollTime = null;
editorDom.addEventListener("touchstart", function (event) {
  clearTimeout(inertiaScrollTime);
  var startY = event.changedTouches[0].pageY;
  var endY = 0;
  var startTime = Date.now();
  var endTime = 0;
  editorDom.addEventListener("touchend", function (event) {
    endY = event.changedTouches[0].pageY;
    endTime = Date.now();
    var _v = ((endY - startY) / (endTime - startTime)) * 1.5;

    function scrollToTop(v, sTime, contentY) {
      var dir = v > 0 ? -1 : 1;
      var deceleration = dir * 0.0018;
      var duration = v / deceleration;

      function inertiaMove() {
        // if(stopInertia) return
        var nowTime = Date.now();
        var t = nowTime - sTime;
        var nowV = v + t * deceleration;
        // 速度方向变化表示速度达到0了
        if (dir * nowV > 0) {
          return;
        }
        var moveY = (-(v + nowV) / 2) * t;
        window.$ace.session.setScrollTop(contentY + moveY);
        inertiaScrollTime = setTimeout(inertiaMove, 10);
      }
      inertiaMove();
    }
    scrollToTop(_v, endTime, window.$ace.session.getScrollTop());
  });
});

ace编辑器设置惯性滚动

https://blog.ixk.me/post/ace-editor-sets-inertial-scrolling
  • 许可协议

    BY-NC-SA

  • 本文作者

    Otstar Lin

  • 发布于

    2019/05/11

转载或引用本文时请遵守许可协议,注明出处、不得用于商业用途!

Acrylic - VSCode ExtensionJava二叉树实现

HomeGitHubStatus

Copyright © 2017-2026 Otstar Lin

Theme Coline by Otstar LinPowered by Next.js