从零开始, 开发一个 Web Office 套件(4):新的问题—— z-index
《从零开始, 开发一个 Web Office 套件》系列博客目录
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等.
对应的Github repo 地址: https://github.com/zhaokang555/canvas-text-editor
2. 富文本编辑器(MVP)
2.13 z-index
2.13.1 新的问题
上一篇博客中, 我们实现了mouse hover on SizeControlPoint的feature. 现在, 问题来了: SizeControlPoint和editor border会有重叠的部分, 当鼠标hover到这个位置时, 应该怎么处理?
我暂时想到了一种解决方案: 引入z-index
的概念, 为SizeControlPoint和editor border分配不同的z-index
. 当鼠标hover到元素重叠的部分时, 寻找最大的z-index
对应的元素.
2.13.2 实现
修改src/core/ResponsiveToMouseHover.ts
:
- 添加属性
zIndex
- constructor添加形参
options
, 用来设置zIndex
- 添加两个静态属性
topLayerZIndex
和topLayerCursorType
, 用来记录最上层图层对应的zIndex
值和鼠标样式 - 修改render函数, 记录
topLayerZIndex
和topLayerCursorType
同时, 修改src/core/SizeControlPoint.ts
, 让它支持设置zIndex
:
最后, 修改src/coreCanvasTextEditor.ts
:
- 修改
render
函数, 在所有的sizeControlPoints
render结束之后, 再设置canvas.style.cursor
- 修改
clearCanvas
函数, 重置ResponsiveToMouseHover.topLayerZIndex
和ResponsiveToMouseHover.topLayerCursorType
2.14 Mouse hover on editor border
处理完z-index
的问题, 我们就可以实现这个feature了: 当鼠标hover到编辑器边缘的虚线边框上时, 鼠标形状随之变化
2.14.1 重构: Extract component: CanvasTextEditorBorder
新建文件src/core/CanvasTextEditorBorder.ts
:
其中, Victor
是一个开源数学库: http://victorjs.org/, 可以做一些二维向量计算, 可以通过npm安装:
npm install victor --save
npm install @types/victor --save-dev
然后重构文件src/core/CanvasTextEditor.ts
:
- 修改
constructor
, 抽出initParagraphs
和initSizeControlPoints
函数 - 添加
initBorder
函数, 并在constructor
中调用 - 删除
renderBorder
函数 - 修改
render
函数
2.14.2 实现
实现这个feature之前, 我们需要思考如何拓展border的响应范围(responsive zone). 为什么要这样呢? 因为border是一条很细的线, 要让鼠标精确地hover上去非常困难, 所以要扩大它的responsive zone. 如下图所示, 我们把border横向拓展, 灰色的范围就是拓展后的responsive zone.
然后, 我们动手来实现. 修改src/core/CanvasTextEditorBorder.ts
:
- 继承
ResponsiveToMouseHover
- 添加常量
borderResponsiveWidth
, 用来表示拓展后的responsive box的宽度 - 添加常量
defaultCanvasTextEditorBorderZIndex
, 用来表示border默认的zIndex
- 在
constructor
中:- 计算border的法向量
normalVector
- 然后计算
responsive zone
的四角坐标, 存入points
中 - 然后利用四角坐标, 计算
responsive zone
的left, top, width, height
, 传入super()
中
- 计算border的法向量
上图中,我们使用了Victor
(http://victorjs.org)这个二位向量运算库的若干API:
.clone()
: 克隆一个二维向量,并返回.substract(vector)
: 用自己减去另一个二维向量,并将结果赋值给自己.add(vector)
: 用自己加上另一个二维向量,并将结果赋值给自己.rotate(angle)
: 将自己沿原点旋转若干弧度,并将结果赋值给自己.normalize()
: 将自己标准化,并将结果赋值给自己.multiplyScalar(scalar)
: 将自己乘以一个数量,并将结果赋值给自己
同时, 在src/core/CursorType.ts
中, 添加十字鼠标样式(see: https://developer.mozilla.org/en-US/docs/Web/CSS/cursor) :
2.14.3 效果
给responsive zone
加上灰色背景, 看一下它的范围是否合适:
(未完待续)
从零开始, 开发一个 Web Office 套件(4):新的问题—— z-index的更多相关文章
- 从零开始, 开发一个 Web Office 套件 (2): 富文本编辑器
书接前文: 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器 这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Of ...
- 从零开始, 开发一个 Web Office 套件 (3): 鼠标事件
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 对应的Github r ...
- 《从零开始, 开发一个 Web Office 套件》系列博客目录
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 对应的Github r ...
- 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 富文本编辑器 万里长征 ...
- 从零开始,开发一个 Web Office 套件(7):新的问题—— Click 事件的 z-index
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
- 从零开始,开发一个 Web Office 套件(9):拖动鼠标选中文字 Edge Case
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
- 从零开始,开发一个 Web Office 套件(10):捕获键盘事件,输入文字
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
- 从零开始,开发一个 Web Office 套件(11):支持中文输入法(or 其它使用输入法的语言)
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
- 从零开始,开发一个 Web Office 套件(12):删除文字 & 回车换行
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
随机推荐
- SpringCloud的Config应用
一.简介 ***应用程序先注册到注册中心,在注册中心根据guli-config服务的名字找到配置中心,然后在配置中心根据配置从github加载基本配置. 二.配置中心(服务端,可以部署集群) 1.依赖 ...
- vue 使用mock来模拟数据
首先,需要安装mock npm install mockjs --save-dev 在main.js中引入mock mock文件写法如下: const Mock = require('mockjs') ...
- Pytorch之Spatial-Shift-Operation的5种实现策略
Pytorch之Spatial-Shift-Operation的5种实现策略 本文已授权极市平台, 并首发于极市平台公众号. 未经允许不得二次转载. 原始文档(可能会进一步更新): https://w ...
- 论文解读GCN 1st《 Deep Embedding for CUnsupervisedlustering Analysis》
论文信息 Tittle:<Spectral Networks and Locally Connected Networks on Graphs> Authors:Joan Bruna.Wo ...
- leetcode 921. 使括号有效的最少添加
问题描述 给定一个由 '(' 和 ')' 括号组成的字符串 S,我们需要添加最少的括号( '(' 或是 ')',可以在任何位置),以使得到的括号字符串有效. 从形式上讲,只有满足下面几点之一,括号字符 ...
- Java构造器(构造方法)
类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的,并且构造器有以下两个特点: 1.必须和类名字相同 2.必须没有返回类型也不能写void public class Demo06 { //一 ...
- elasticsearch算法之词项相似度算法(一)
一.词项相似度 elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算:今天我们来通过不同的距离算法来学习一下词项相似度算法: 二.数据准备 计算词项相似度,就需要首先将词项 ...
- linux主机名称文件修改
目录 一:linux主机名称查看与修改 1.查看自己主机名: 3.临时修改 4.永久修改 一:linux主机名称查看与修改 1.查看自己主机名: [root@localhost ~]# echo $H ...
- 计算机网络再次整理————UDP例子[六]
前言 简单的说,UDP 没有 TCP 用的广泛,但是还有很多是基于UDP的程序的,故而简单介绍一下. 正文 秉承节约脑容量的问题,只做简单的介绍和例子,因为自己几乎也没怎么用过UDP. 只是了解和知晓 ...
- Web:移动端阻止默认行为的小坑
问题 移动端 web 开发中,使用 addEventListener 阻止了 touchstart 事件的默认行为却发现没有生效 描述 再移动端 web 开发中,我们一般会用 addEventList ...