这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等.

对应的Github repo 地址: https://github.com/zhaokang555/canvas-text-editor

书接前文: 从零开始, 开发一个 Web Office 套件 (2): 富文本编辑器

2. 富文本编辑器(MVP)

2.11 鼠标事件

这篇文章, 我们来实现迄今为止我们需要的鼠标事件相关的feature. 我初步整理了一下, 有如下几个:

  • WHEN 鼠标hover到编辑器边缘的六个控制点(SizeControlPoint)上时, THEN 鼠标形状需要变化

  • WHEN 鼠标hover到编辑器边缘的虚线边框上时, THEN 鼠标形状需要变化

  • WHEN 鼠标hover到文字上时, THEN 鼠标形状需要变化(第1篇博文中提到的)
  • WHEN 鼠标点击某一个文字(字符)的半部分时, THEN 需要在它的面插入光标 AND 光标应该匹配其左侧文字样式

  • WHEN 鼠标点击某一个文字(字符)的半部分时, THEN 需要在它的面插入光标 AND 光标应该匹配其左侧文字样式

  • GIVEN 鼠标hover到文字上, WHEN 鼠标进行拖选时, THEN 需要高亮拖选中的文字

2.12 Mouse hover on SizeControlPoint

之前, 我们渲染控制点的代码是写在src/core/CanvasTextEditor.ts中的:

如果继续这个类中处理鼠标相关逻辑, 这个类就会变得很臃肿. 所以, 我们需要重构一下代码, 把控制点相关的代码抽离出来.

2.12.1 重构代码

新建文件src/core/SizeControlPoint.ts:

然后, 我们还需要实现SizeControlPoint中依赖的两个接口: IBoundingBox, IRenderable.

新建src/core/IBoundingBox.ts:

新建src/core/IRenderable.ts:

然后, 将CanvasTextEditor中的renderBorderCircle方法稍加修改, 迁移到SizeControlPoint类中:

最后, 修改CanvasTextEditor类, 删除老代码, 引入SizeControlPoint:

2.12.2 架构设计

2.12.3 自顶向下实现

首先, 修改src/core/CanvasTextEditor.ts:

  • 添加一个sizeControlPoints属性, 用来存放所有的控制点
  • renderBorder中渲染控制点相关的代码, 转移到构造函数中
  • 添加一个析构函数, 用来清理事件监听函数
  • clearCanvas中重置鼠标形状
  • render中渲染所有控制点

同时, 定义了一个枚举src/core/CursorType.ts, 用来存放目前所使用到的鼠标样式:

其中每个值的含义可以参考MDN的这个文档: https://developer.mozilla.org/en-US/docs/Web/CSS/cursor

然后, 修改src/core/SizeControlPoint.ts:

然后, 新建src/core/ResponsiveToMouseHover:

  • 实时监听鼠标位置, 存入mouseX, mouseX
  • 同时, 计算鼠标是否处于自身包围盒中, 将结果存入isMouseHovering
  • 在析构函数中移除监听函数

2.12.4 效果

(未完待续)

从零开始, 开发一个 Web Office 套件 (3): 鼠标事件的更多相关文章

  1. 《从零开始, 开发一个 Web Office 套件》系列博客目录

    这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 对应的Github r ...

  2. 从零开始, 开发一个 Web Office 套件 (2): 富文本编辑器

    书接前文: 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器 这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Of ...

  3. 从零开始, 开发一个 Web Office 套件(4):新的问题—— z-index

    <从零开始, 开发一个 Web Office 套件>系列博客目录 这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office ...

  4. 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器

    这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 富文本编辑器 万里长征 ...

  5. 从零开始,开发一个 Web Office 套件(9):拖动鼠标选中文字 Edge Case

    这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...

  6. 从零开始,开发一个 Web Office 套件(5):Mouse hover over text

    <从零开始, 开发一个 Web Office 套件>系列博客目录 这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office ...

  7. 从零开始,开发一个 Web Office 套件(6):光标 & Click 事件

    <从零开始, 开发一个 Web Office 套件>系列博客目录 这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office ...

  8. 从零开始,开发一个 Web Office 套件(15):拖动边框,平移编辑器

    这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...

  9. 从零开始,开发一个 Web Office 套件(7):新的问题—— Click 事件的 z-index

    这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...

随机推荐

  1. Selenium_截图(16)

    selenium截图有两种方式 截取全屏 get_screenshot_as_file(filename):将截图转化成文件保存到本地,filename为保存的文件路径 get_screenshot_ ...

  2. Echart可视化学习(十)

    文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 官网找到类似实例, 适当分析,并且 ...

  3. redis 主从复制实现

    Redis 主从复制的实现 安装redis 修改redis的配置文件 redis.conf ②开启daemonize yes ③Pid文件名字 ④指定端口 ⑤Log文件名字 ⑥Dump.rdb名字 在 ...

  4. 1010day-人口普查系统

    1.xiugai.java package com.edu.ia; import java.io.IOException;import java.sql.SQLException; import ja ...

  5. Cesium中文网的朋友们

    目前已开通知识星球-Cesium中文网的朋友们 注意:仔细思量好再进来,一旦付费,概不退费.下述内容均尽力而为. 1. 每月一次技术交流(Cesium为主),提供源码. 2. 每人5次/周免费提问(C ...

  6. Java Selenide 介绍&使用

    目录 Selenide 介绍 官方快速入门 元素定位 元素操作 浏览器操作 断言 常用配置 Selenide 和 Webdriver 对比 Selenide 介绍 Selenide github Se ...

  7. Centos7下,Docker的安装与使用

    一.Docker Install 1.卸载旧的版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ ...

  8. Vue.use()用法

    通常我们引入一个第三方组件形式的插件进来时,我们在main.js里面需要Vue.use('该插件名字'),比如引入一个vant组件 那么我们如何自己也来尝试将自己封装的组件以Vue.use()的形式来 ...

  9. Linux 标准输入输出、重定向

    一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |). 2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes ` ...

  10. IBM MQ常用运维命令

    创建队列管理器 crtmqm –q QMgrName -q是指创建缺省的队列管理器 删除队列管理器 dltmqm QmgrName 启动队列管理器 strmqm QmgrName 如果是启动默认的队列 ...