DevUI 是一款面向企業中後臺產品的開源前端解決方案,它倡導沉浸
、靈活
、至簡
的設計價值觀,提倡設計者為真實的需求服務,為多數人的設計,拒絕譁眾取寵、取悅眼球的設計。如果你正在開發 ToB
的工具類產品
,DevUI 將是一個很不錯的選擇!
以下文章和本文相關,也許你也會喜歡:
引言
之前在HWEB大前端技術分享會上給大家分享過 Quill 的一些實踐,不過由於時間關係只講了個大概,後續打算深入淺出地對 Quill 做一個詳細的介紹。
這個系列打算從實踐的角度去講 Quill 富文字編輯器,先從 Quill 的基本使用開始吧!
極簡方式使用 Quill
快速開始三部曲:
- 安裝
- 引入
- 使用
// 安裝
npm i quill
<div id="editor"></div>
// 引入
import Quill from 'quill';
// 使用
const quill = new Quill('#editor');
雖然我們已經初始化了 Quill 例項,但是在頁面中卻什麼也看不到。
雖然看上去什麼也沒有,但是我們點選空白處,會發現有一個游標,並且可以輸入內容,並給內容增加格式(由於沒有工具欄,只能通過 Quill 快捷鍵Ctrl+B
增加格式),以下是動畫效果:
雖然只是一個極簡版的富文字編輯器,不過加上邊框和按鈕,就是一個基礎版的掘金評論框(還差插入表情和圖片)?
這是使用 Quill 最簡單的方式。
加一些配置選項吧
配置編輯器容器元素 container
Quill 類一共有兩個引數,第一個引數是必選的編輯器容器元素container
,可以是一個CSS選擇器,比如前面的#editor
,也可以是一個DOM元素,比如:
const container = document.getElementById('editor');
// const container = document.querySelector('#editor');
// const container = $('#editor').get(0);
const quill = new Quill(container);
如果容器裡面已經有一些 HTML 元素,那麼初始化 Quill 的時候,那些元素也會渲染出來,比如:
<div id="editor">
<p>DevUI:面向企業中後臺的前端開源解決方案</p>
<h2>宗旨與法則</h2>
<p>規範的元件化的目的不是為了限制創造,而是為了創造者更確定、科學、高效。所有行為決策的價值歸依是產品業務。產品業務永遠比元件化本身更重要,業務第一。</p>
<p>規範不是絕對、教條、冷漠、強制的,實際工作中總會有新增需求、存優化空間、情感化設計需求超出一般通用規範。保持克制的同時,允許基於強烈業務需求的規範突破;之後如果有足夠的理由迭代出元件,那麼就進行元件深化。</p>
<h2>設計語言</h2>
<p>DevUI的價值觀奠定了 DevCloud品牌的基礎。它是 DevCloud 的設計師們思考、工作的產物,反映了 DevCloud 的產品文化、設計理念和對客戶的承諾。DevUI的這些價值觀貫穿於所有產品和麵向客戶的溝通和內容中。同時,它是 DevUI 設計原則的源頭,為具體的設計方法提供啟發和指引。</p>
<p>DevUI倡導<code>沉浸</code>、<code>靈活</code>、<code>致簡</code>的設計價值觀,提倡設計者為真實的需求服務,為多數人的設計,拒絕譁眾取寵、取悅眼球的設計。</p>
<h2>致簡</h2>
<p>DevUI堅持以使用者為中心去進行設計,注重直觀可達性,把服務示例化以幫助使用者快速融入到使用中去。同時, DevUI提供大量的快捷鍵,簡化使用的流程、提高操作效率。</p>
<h2>沉浸</h2>
<p>DevUI的沉浸式體驗包括人的感官體驗和認知體驗,當使用者的個人技能與面對的挑戰互相匹配,並且長時間處在穩定狀態時,使用者達到心流狀態並且不易被外界因素所干擾。</p>
<p>在產品設計中,DevUI專注在降低使用者在完成任務目標時的認知阻力中。為此,DevUI同時提供多種不同的切換頁面的途徑,包括麵包屑、快捷鍵、按鈕和連結等,方便使用者隨時快速、連續地切換頁面,到達自己所需的頁面,使使用者處於流暢的體驗中,減輕尋找資訊的焦慮感。</p>
<h2>靈活</h2>
<p>DevUI提供超過60個獨立原子級元件,可以自由組合,像搭積木一樣,用小元件搭建出符合自身產品需要的分子級元件,進而搭建出自己的業務系統。</p>
</div>
渲染出來的編輯器效果:
配置選項 options
第二個引數是可選的配置選項options
,options是一個JSON物件,比如我們想給我們的編輯器增加一個主題,使它不再那麼單調。
const quill = new Quill('#editor', {
theme: 'snow'
});
另外需要引入該主題對應的樣式:
@import 'quill/dist/quill.snow.css';
這時我們看到編輯器已經有一個工具欄。
並且可以通過工具欄對編輯器的內容進行操作,比如給DevUI
增加一個超連結:
除了snow
主題,Quill 還內建了一個bubble
氣泡主題,配置方式和snow
主題一樣:
- 引入主題樣式
- 在options裡配置主題
// 引入bubble主題樣式
@import 'quill/dist/quill.bubble.css';
const quill = new Quill('#editor', {
theme: 'bubble' // 配置 bubble 主題
});
效果如下:
bubble主題沒有顯性的工具欄,它會在你選中編輯器中的文字時,在選中文字的下方顯示一個氣泡工具欄,從而對文字進行格式化操作,比如給選中的段落增加引用格式:
更多配置選項
Quill 不僅僅可以配置主題,options一共支援8個配置選項:
- bounds 編輯器內浮框的邊界
- debug debug級別
- formats 格式白名單
- modules 模組
- placeholder 佔位文字
- readOnly 只讀模式
- scrollingContainer 滾動容器
- theme 主題
formats 格式白名單
這個配置項非常有用,比如剛剛提到的掘金評論框,我們發現評論框裡只能插入純文字,其他格式都不允許,即使時貼上進來的格式化文字也會變成純文字。
在 Quill 裡很容易實現,只需要配置formats
為空陣列即可。
const quill = new Quill('#editor', {
theme: 'snow',
formats: []
});
注意這裡的formats
格式白名單,控制的是內容實際的格式,和設定格式的渠道無關,比如formats
設定為空,那麼無論是:
- 通過工具欄設定格式
- 還是通過快捷鍵(比如
Ctrl+B
)設定格式 - 抑或是貼上帶格式的文字
都是無法設定格式的。
如果我們想保留一部分格式,比如只保留粗體
和列表
兩種格式:
const quill = new Quill('#editor', {
theme: 'snow',
formats: [ 'bold', 'list' ]
});
Quill 一共支援11
種行內格式:
- background
- bold
- color
- font
- code
- italic
- link
- size
- strike
- script
- underline
7
種塊級格式:
- blockquote
- header
- indent
- list
- align
- direction
- code-block
3
種嵌入格式:
- formula
- image
- video
不配置formats
選項,會預設支援所有的21
種格式。
placeholder 佔位文字
我們發現掘金的評論框在沒有輸入內容時,會有一個輸入評論...
的佔位文字。
這可以很容易地通過配置placeholder
選項實現。
const quill = new Quill('#editor', {
formats: [],
placeholder: '輸入評論...',
});
readOnly 只讀模式
通過配置readOnly
可以實現:
初始狀態編輯器是閱讀態,不可以編輯,可以通過點選
編輯
按鈕讓編輯器變成編輯態。
由於掘金的評論框不支援編輯,就不拿它舉例子。
以 DevCloud 看板專案的評論框為例,初始狀態下評論是不可編輯的,點選編輯
按鈕,變成可編輯狀態,並且顯示工具欄、儲存按鈕等元素,點選儲存按鈕,新增的內容被儲存,編輯器變成只讀態。
modules 模組配置
這個配置項放在最後並不代表它不重要,恰恰相反,這是 Quill 中最重量級
也是最常用
的配置。
在之前的文章中,給大家介紹過 Quill 的模組化機制,這個配置項就是用來配置 Quill 的模組的。
在Quill的模組化機制一文中,我們提到
Quill 一共有6個內建模組:
- Clipboard 貼上版
- History 操作歷史
- Keyboard 鍵盤事件
- Syntax 語法高亮
- Toolbar 工具欄
- Uploader 檔案上傳
每個模組的用途詳見Quill內建模組章節。
modules
選項可以用來配置這些模組。
配置 toolbar 模組
Quill 預設只在工具欄中顯示一部分格式化按鈕,裡面沒有插入圖片的按鈕,我們可以通過配置toolbar
模組來增加。
const quill = new Quill('#editor', {
theme: 'snow',
modules: {
toolbar: [
// 預設的
[{ header: [1, 2, 3, false] }],
['bold', 'italic', 'underline', 'link'],
[{ list: 'ordered'}, { list: 'bullet' }],
['clean'],
// 新增的
['image']
]
}
});
如果想做一個掘金這樣的富文字編輯器,也非常簡單。
掘金的富文字編輯器主要包含以下工具欄按鈕:
- 加粗
- 斜體
- 下劃線
- 一級/二級標題
- 引用
- 程式碼塊
- 行內程式碼
- 無序列表
- 有序列表
- 超連結
- 插入圖片
使用 Quill 實現,需要這樣配置toolbar
模組。
const quill = new Quill('#editor', {
theme: 'snow',
modules: {
toolbar: [
'bold', 'italic', 'underline',
{ header: 1 }, { header: 2 },
'blockquote', 'code-block', 'code', 'link',
{ list: 'ordered'}, { list: 'bullet' },
'image',
]
}
});
稍微修改下樣式,就能做出一個和掘金富文字編輯器差不多的富文字編輯器啦,效果如下:
以下是和掘金實際的富文字編輯器的對比圖:
對比以上效果對比圖,除了工具欄的 icon 使用的是掘金 Markdown 編輯器的 icon 之外,其他幾乎是一樣的。
配置 keyboard 模組
除了工具欄模組,我們還可以配置別的模組,比如快捷鍵模組keyboard
,keyboard
模組預設支援很多快捷鍵,比如:
- 加粗的快捷鍵是
Ctrl+B
; - 超連結的快捷鍵是
Ctrl+K
; - 撤銷/回退的快捷鍵是
Ctrl+Z/Y
。
但它不支援刪除線的快捷鍵,如果我們想定製刪除線的快捷鍵,假設是Ctrl+Shift+S
,可以這樣配置:
const quill = new Quill('#editor', {
theme: 'snow',
modules: {
toolbar: [
// 預設的
[{ header: [1, 2, 3, false] }],
['bold', 'italic', 'underline', 'link'],
[{ list: 'ordered'}, { list: 'bullet' }],
['clean'],
['image']
],
// 新增的
keyboard: {
bindings: {
strike: {
key: 'S',
ctrlKey: true,
shiftKey: true,
handler: function(range, context) {
// 獲取當前游標所在文字的格式
const format = this.quill.getFormat(range);
// 增加/取消刪除線
this.quill.format('strike', !format.strike);
}
},
}
},
}
});
配置 history 模組
Quill 內建的history
模組,每隔1s
會記錄一次操作歷史,並放入歷史操作棧(最大100)中,便於撤銷/回退操作。
如果我們不想記錄得那麼頻繁,想2s
記錄一次,另外我們想增加操作棧的大小,最大記錄200次操作歷史,可以這樣配置:
const quill = new Quill('#editor', {
theme: 'snow',
modules: {
toolbar: [
// 預設的
[{ header: [1, 2, 3, false] }],
['bold', 'italic', 'underline', 'link'],
[{ list: 'ordered'}, { list: 'bullet' }],
['clean'],
['image']
],
keyboard: {
bindings: {
strike: {
key: 'S',
ctrlKey: true,
shiftKey: true,
handler: function(range, context) {
// 獲取當前游標所在文字的格式
const format = this.quill.getFormat(range);
// 增加/取消刪除線
this.quill.format('strike', !format.strike);
}
},
}
},
// 新增的
history: {
delay: 2000, // 2s記錄一次操作歷史
maxStack: 200, // 最大記錄200次操作歷史
}
}
});
小結
本文主要介紹了 Quill 的基本用法,以及如何通過 options 選項配置 Quill。
後續將介紹更多關於 Quill 的實踐,關注 DevUI 不迷路?。
歡迎加DevUI小助手微信:devui-official,一起討論Angular技術和前端技術。
歡迎關注我們DevUI元件庫,點亮我們的小星星?:
https://github.com/devcloudfe/ng-devui
也歡迎使用DevUI新發布的DevUI Admin系統,開箱即用,10分鐘搭建一個美觀大氣的後臺管理系統!
加入我們
我們是DevUI團隊,歡迎來這裡和我們一起打造優雅高效的人機設計/研發體系。招聘郵箱:muyang2@huawei.com。
文/DevUI Kagol
往期文章推薦