书接前文: 从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等.
对应的Github repo 地址: https://github.com/zhaokang555/canvas-text-editor
2.5 观察一下幻灯片中的文本框
我们发现:
- 一个文本框中有若干行文字
-
一行文字中每个字符的大小, 样式都可能不一样 (废话)
- 但是, 上一篇文章中, 我们设置样式, 是以行为对象的
-
任意一个单独的字符, 都可以用鼠标选中 (废话)
- 但是, 上一篇文章中, 我们计算文字包围盒, 是以行为整体计算的
- 一行文字如果过长, 可以自动折行(默认行为, 可以修改)
- 当我调整文本框的宽度, 折行位置随之改变
- 文本框的位置和宽高都是可以调整的.
为了将来我们的web slides中能够用上CanvasTextEditor, 我们需要重构一下我们的代码.
2.6 重构Editor
- 修改
src/core/CanvasTextEditor.ts
, 为编辑器加上位置属性, 宽高属性, 样式属性:
- 修改
src/demo/App.tsx
, 给编辑器传入位置信息:
- 修改
src/core/CanvasTextEditor.ts
:
实现render函数, 渲染一个临时边框:
添加renderBorderCirclor函数, 渲染边框上的8个圆形控制点:
- 最终效果:
2.7 设计Editor的整体架构
如下图所示:
一张幻灯片(Slide)中可能有多个编辑器(Editor), 一个编辑器中可能有多个段落(Paragraph), 一个段落中可能有多行(SoftLine), 一行中可能有多个字符(Char).
2.8 自顶向下实现
接下来, 我们按照自顶向下的方式, 来一步步实现这个架构:
2.8.1 Paragraph
- 修改
src/core/CanvasTextEditor.ts
, 添加一个字段 paragraphs:
其中, 每个Paragraph要接收这几个参数:
chars: Char[]
- canvas context
- left
- top
- maxWidth
为什么Paragraph的构造函数里, 要直接接收Char列表, 而不是SoftLine列表呢?
因为一个SoftLine并不是真正的一行, 而是根据每个Char的宽度和Paragraph的maxWidth, 实时计算出来的.
我们以后将会实现这样的feature: 如果用户调整了Editor的大小, Paragraph的maxWidth随之改变, 所有的SoftLine都会重新计算. 类似下图一样:
- 新建文件
src/core/CanvasTextEditorParagraph.ts
如上图, 在构造Paragraph时, 我们需要实现2个逻辑:
-
calcLayoutForSoftLines
:- 根据maxWidth, 将所有的Char进行分组, 得到softLines. (类似我们上一篇中的splitContentIntoLines方法)
- 根据每个softLine中的Chars的大小, 计算每个softLine的大小
-
calcLayout
:- 根据每个softLine的大小, 计算Paragraph的大小
然后, 我们来实现这两个逻辑:
2.8.2 SoftLine
新建src/core/CanvasTextEditorSoftLine.ts
文件, 并在其构造函数中, 计算传入的所有chars的位置:
2.8.3 Char
- 新建
src/core/CanvasTextEditorChar.ts
文件:
- 目前暂时先支持定制
color
和fontSize
两个样式:
- 另外, 要对外暴露
setPosition
方法, 方便在SoftLine中为每个Char设置位置:
2.8.4 删除CanvasTextEditorText
由于之前src/core/CanvasTextEditorText.ts
中的逻辑现在已经分散到了Paragraph, SoftLine, Char中, 所以现在可以删除这个文件.
2.8.5 最终效果
2.9 行内文字底部对齐
截止到目前为止, 出现了一个小问题: 一行内不同大小的文字, 他们的纵向对齐方式, 是以顶部为基线的.
为了看得更清楚, 我们给每个字符加上辅助边框和背景色, 修改src/core/CanvasTextEditorChar.ts
:
修改src/core/CanvasTextEditor.ts
, 再加上几个汉字:
这样, 可以更清晰地看出, 不同大小的文字是顶部对齐的:
为什么会出现行内文字纵向顶部对齐呢? 因为我们之前为了方便, 将textBaseline
设置为了top
:
这样设置之后, 包围盒顶部坐标 和 fillText(text, x, y)
中的y坐标就相等了. 我们之前把它们统一记作top
.
现在, 我们不得不放弃之前的偷懒方式, 将两者分别记录:
- 将
fillText(text, x, y)
中的y
记作top
- 将包围盒顶部坐标记作
boundingBoxTop
修改src/core/CanvasTextEditorChar.ts
:
看一下效果:
2.10 再议textBaseLine
这次行内文字纵向对齐的问题解决了, 可是新的问题来了: 为什么所有的文字整体上移了?
因为我们已经把textBaseLine
恢复成了默认值alphabetic
. 绘制文字的基线下移了, 且文字的坐标(left, top)没变, 所以相当于文字上移了.
为了解决这个问题, 我暂时想到了一种方法:
- 我们需要将每一行文字统一向下偏移一个长度
offsetY
- 每一行的
offsetY
, 取决于行内所有字符fontBoundingBoxAscent
的最大值 - 在渲染行内的每个字符时, 统一加上这个偏移值
接下来我们来实现, 修改src/core/CanvasTextEditorSoftLine.ts
:
效果:
文字上移的问题解决了, 棒!
(未完待续)
从零开始, 开发一个 Web Office 套件 (2): 富文本编辑器的更多相关文章
-
从零开始, 开发一个 Web Office 套件 (1): 富文本编辑器
这是一个系列博客, 最终目的是要做一个基于HTML Canvas 的, 类似于微软 Office 的 Web Office 套件, 包括: 文档, 表格, 幻灯片... 等等. 富文本编辑器 万里长征 ...
-
web项目中nicedit富文本编辑器的使用
web项目中nicedit富文本编辑器的使用 一.为什么要用富文本编辑器? 先说什么是富文本编辑器吧,普通的html中input或textarea标签只能进行简单的输入,而做不到其他的文本调整功能,甚 ...
-
现代富文本编辑器Quill的模块化机制
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...
-
【前端】wangEditor(富文本编辑器) 简易使用示例
转载请说明作者或者注明出处,谢谢 说到前端常用的编辑器,自然也少不了富文本编辑器(RichText Editor) 笔者在此之前也看了一些相关的在线编辑器,其中包括了当百度搜索“富文本编辑器”字样时出 ...
-
10个免费的javascript富文本编辑器(jQuery and non-jQuery)
祝愿园子里的朋友圣诞节快乐. 本文介绍了10个免费易用富文本编辑器(rich text editors,RTE),其中5个是Jquery插件,另外5个是非Jquery富文本编辑器 简介 Javascr ...
-
yii2集成富文本编辑器redactor
作者:白狼 出处:http://www.manks.top/article/yii2_redactor本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保 ...
-
Android 图片混排富文本编辑器控件
概述 一个Android 图片混排富文本编辑器控件(仿兴趣部落) 详细 代码下载:http://www.demodashi.com/demo/12032.html 一.一个Android 图片混排富文 ...
-
web开发实战--弹出式富文本编辑器的实现思路和踩过的坑
前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...
-
Python之路,Day18 - 开发一个WEB聊天来撩妹吧
Python之路,Day18 - 开发一个WEB聊天来撩妹吧 本节内容: 项目实战:开发一个WEB聊天室 功能需求: 用户可以与好友一对一聊天 可以搜索.添加某人为好友 用户可以搜索和添加群 每个 ...
随机推荐
-
Xshell远程管理Linux
Xshell[1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议. Xshell 通过互联网到远程主机的安全连接以及它创新 ...
-
bootstrap插件学习-bootstrap.collapse.js
先看bootstrap.collapse.js的结构 var Collapse = function ( element, options ){} // 构造器 Collapse.prototype ...
-
使用了Windows Live Writer 写的博客
<为什么标签不能正确的显示> 重新设置了之后再看看 停用了一些插件! 偶然看到很多Blog都在说:“尝试连接到您的日志时出错:服务器响应无效 – 从日志服务器接收的对 blogger. ...
-
iOS webView的一些基本用法
1.自己拼接html来显示想要的文字(参考:http://www.mamicode.com/info-detail-492242.html) NSString *htmlStr=@"< ...
-
js代码大全(里面啥都有)
事件源对象event.srcElement.tagNameevent.srcElement.type 捕获释放event.srcElement.setCapture(); event.srcElem ...
-
까페24 호스팅 php 에러메세지 출력
[문제점] 최근 까페24호스팅에서 php작업시화면에 에러메세지가 나오지 않아 디버깅시에 매우 곤란함 [해결책] .htaccess 내용에 아래추가.=================== ...
-
marquee标签制作轮播图
http://qy-0824.blog.163.com/blog/static/725075422011214142226/ 缺点是仅能控制轮播的速度.鼠标悬停暂停等,并不能给其指定链接.触摸滑动.分 ...
-
UVALive 4123 Glenbow Museum (组合数学)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud 易得,当n为奇数或者n<3时,答案为0,否则该序列中必定有(n+4)/2个R ...
-
web 前端 shopnc项目 首页分类一开始做前端,我是拒绝的
看图别说话 经过几小时的折腾 主要还是靠耐心
-
新更新kb4493472导致无法正常开机
昨天陆续接到电话,说是系统更新后电脑不能正常使用,症状基本是开机到欢迎界面就出现各种各样的状况,比如鼠标能动,其他无反应;欢迎界面结束后黑屏,只有鼠标能动:开机后正常,但电脑使用很卡等等状况.因为昨天 ...