国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

設置表格列寬—在富文本編輯器中的實現

開發(fā) 前端
之前因為工作上的一些原因,使用的 wangEditor 富文本編輯器的表格(table)功能并不能滿足需求,創(chuàng)建的表格只是設置了 width: 100%,列的寬度的自適應的效果非常不美觀。

大家好,我是前端西瓜哥。

之前因為工作上的一些原因,使用的 wangEditor 富文本編輯器的表格(table)功能并不能滿足需求,創(chuàng)建的表格只是設置了 width: 100%,列的寬度的自適應的效果非常不美觀。于是決定修改源碼,對表格功能做了加強,使其支持調整列寬。

為了方便讀者理解,最近把這部分邏輯單獨抽離出來并做了優(yōu)化,寫了個能獨立運行的 demo,配合這篇文章簡單說一說實現思路。

實現思路

1、 創(chuàng)建空表格

第一步是創(chuàng)建空表格。要想支持表格可以設置寬度,需要在 table 元素下使用 colgroup 元素。我們根據表格列的數量,在 colgroup 下創(chuàng)建同等數量的 col 元素并設置寬度,就能給對應順序的列賦予寬度。效果可以查看這個 在線demo 。

此外,表格的單元格如果沒有內容,是會發(fā)生高度塌陷的,且無法通過 min-height 和 height 設置高度 。為解決這個問題,我們通常會在創(chuàng)建空表格時,給單元格添加內容。

2、 高亮線的顯現

第二步是實現光標劃到列之間的分割線上方時,將高亮線顯現出來。實現方式是:

  • 初始化時,在編輯器容器元素下創(chuàng)建一個絕對定位的 div 元素作為高亮線,并隱藏。
  • 給編輯器容器元素綁定鼠標移動事件。當光標移動到表格元素內部時,遍歷 col 元素得到所有列分隔線的位置(最左邊的不需要)。若光標位于這些分隔線附近,拿到左位移量,然后修改高亮線的位置并將其顯現出來;否則隱藏高亮線。

3、 拖拽高亮線實現設置列寬

前面提到,當光標懸浮在列分割線上方附近,會出現高亮線。其實為實現修改列寬,我們還要記錄一些數據:(1)對應的表格元素;(2)第幾列 rowIdx。當然光標移開時,要把這些數據清空。

下面是拖拽這一動作的實現,涉及到鼠標按下、鼠標移動、鼠標釋放三個事件:

  • 當鼠標在高亮線上 按下 時,我們要將上面的數據拷貝一份,然后再記錄好要修改的(3)列的寬度;(4)光標左偏移量 left(后面要用來計算相對移動位置)(5)對應的 col 元素。
  • 在鼠標按下不釋放的情況下,移動鼠標,就代表著 拖拽 這一動作的發(fā)生。此時,我們計算光標的相對左移動,給對應的 col 元素設置寬度,就能實現動圖上的效果。
  • 鼠標釋放,將這些數據重置為空。

因為只需要得到拖拽的相對位置,所以我們不是必須要將事件綁定到編輯器容器上。另外為了確保鼠標釋放事件正在發(fā)生,最終我選擇在 document 元素上綁定事件。document 元素上綁定的鼠標釋放事件,按下鼠標后,即便在瀏覽器外面釋放鼠標,也能觸發(fā)。

另外,為處理列寬過小,甚至計算出負值的情況,我們需要設置一個最小列寬。

代碼實現

那么這里就簡單講解一下核心代碼。

首先是創(chuàng)建空表格:

const DEFAULT_COL_WIDTH = 80
const DEFAULT_COL_SIZE = 5
const DEFAULT_ROW_SIZE = 5
// 生成空 table
function createTable(row = DEFAULT_ROW_SIZE, col = DEFAULT_COL_SIZE, hasTh = false, colWidth = DEFAULT_COL_WIDTH) {
const tbody = document.createElement('tbody')
let tr, td
for (let i = 0; i < row; i++) {
tr = document.createElement('tr')
tbody.appendChild(tr)
for (let j = 0; j < col; j++) {
td = document.createElement((i === 0 && hasTh) ? 'th' : 'td')
td.innerHTML = '<br />' // 填充點東西,處理單元格高度塌陷問題
tr.appendChild(td)
}
}
const colgroup = document.createElement('colgroup')
let colElm
for (let i = 0; i < col; i++) {
colElm = document.createElement('col')
colElm.style.width = colWidth + 'px'
colgroup.appendChild(colElm)
}
const table = document.createElement('table')
table.appendChild(colgroup)
table.appendChild(tbody)
return table
}

顯現高亮線的核心實現邏輯如下。計算左偏移量使用了 getBoundingClientRect() 方法和鼠標事件中得到的 clientX 坐標。其中還需要注意坐標系有 “相對表格” 和 “相對編輯器容器” 兩種。

const hl = new HL(editorEl) // 高亮線對象
// ...
let lastState = {} // 高亮線出現時,記錄對應的 tableElrowIdx
function handleMovemove(event) {
// 找到最近的table父元素
const nearestTable = getNearestTable(event.target, editorEl)
if (!nearestTable) {
hl.hideHL()
lastState = {}
return
}
const tableLeftByViewport = nearestTable.getBoundingClientRect().left
const cursorLeftByTable = event.clientX - tableLeftByViewport
const tableLeftByEditor = tableLeftByViewport - editorEl.getBoundingClientRect().left
//accurateLeft 為精準的列分割線上的左偏移量
const { idx: rowIdx, left: accurateLeft } = getNearestRowBorder(nearestTable, cursorLeftByTable)
if (rowIdx !== -1) {
hl.drawHL(nearestTable, tableLeftByEditor + accurateLeft) // 轉換為相對 editor 容器的左偏移量
lastState = { tableEl: nearestTable, rowIdx } // 保存 table 元素和 列索引,鼠標按下時要用到。
editorEl.style.cursor = 'col-resize'
} else {
hl.hideHL()
lastState = {}
}
}

然后是拖拽的邏輯。dragState.tableEl 除了記錄保存當前表格元素,還在 moveover 事件中做是否觸發(fā)拖拽的標識。

// 拖拽過程中保存的變量
const emptyDragState = {
tableEl: undefined,
rowIdx: undefined,
col: null,
width: undefined,
left: undefined,
}
let dragState = {...emptyDragState}
function dragMouseDown(event) {
// TODO: 需要點左鍵才執(zhí)行
const { tableEl, rowIdx } = lastState
if (!tableEl) return
const col = getCol(tableEl, rowIdx)
const width = parseFloat(col.style.width)
const left = event.clientX
dragState = { ...dragState, ...lastState, col, width, left }
}
function dragMouseover(event) {
const { left, tableEl, width, rowIdx } = dragState
if (!tableEl) return
const offset = event.clientX - left
setColWidth(tableEl, rowIdx, width + offset)
}
function dragMouseup() {
dragState = {...emptyDragState}
}

結尾

俗話說的好,“Talk is cheap, show me your code!”。如果你對里面的實現細節(jié)感興趣的話,請去我的在線 demo 閱讀源碼和測試:

??https://codepen.io/F-star/pen/eYWjKBg?editors=1010。??

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-04-17 11:03:52

富文本編輯器MTE

2017-07-27 20:21:06

iOSUITableView富文本編輯器

2016-09-23 20:30:54

Javascriptuiwebview富文本編輯器

2013-11-18 10:08:56

工具免費編程工具

2023-05-11 07:34:36

Yjs協同編輯

2012-08-10 10:47:45

JavaScript

2022-03-11 08:00:49

編輯器框架Draft.js

2018-01-05 14:48:03

前端JavaScript富文本編輯器

2020-12-23 22:25:11

Vi文本編輯器Unix

2020-04-09 19:07:12

Vuetiptap前端

2010-03-24 09:20:07

CentOS vi編輯

2022-02-15 09:00:18

Vue編輯器字符串

2017-02-14 10:00:57

2021-01-07 11:00:59

Sed文本編輯器Linux

2022-05-13 15:32:11

GNOME文本編輯器

2021-01-08 13:56:50

LinuxJOE文本編輯器

2025-05-28 02:02:00

2011-05-11 10:27:42

文本編輯器

2011-08-24 14:47:55

LUA文本編輯器

2012-09-29 11:38:27

編程工具文本編輯器編程
點贊
收藏

51CTO技術棧公眾號

九一九一国产精品| 日韩精品不卡| 国产一线二线三线女| 99香蕉久久| 色悠悠亚洲一区二区| 成人黄色大片网站| 99精品视频在线观看免费播放| 欧美v亚洲v综合ⅴ国产v| 亚洲午夜精品久久久久久人妖| 我不卡神马影院| 久久精品国产一区二区三区| 黄色视屏网站在线免费观看| 91在线看国产| 区一区二区三区中文字幕| 国产精品一线| 亚洲精品美女在线| 男生女生差差差的视频在线观看| av电影一区二区| 欧美不卡1区2区3区| 国产欧美日韩一区二区三区四区| 亚洲区免费影片| 草碰在线视频| 日韩一区有码在线| 97在线免费视频观看| 亚洲激情偷拍| 国产91在线播放精品91| 成人午夜电影小说| 久久视频精品在线| 婷婷五月综合缴情在线视频| 日本午夜精品久久久久| 亚洲人妖av一区二区| 欧美激情亚洲视频| 给我免费播放片在线观看| 永久免费网站在线| 91麻豆精品| 日韩在线你懂的| 2020国产精品| 国产免费一区二区三区在线观看| 污污的网站18| av高清不卡| 蜜桃伊人久久| 亚洲精品乱码| 中文字幕日韩在线观看| 国产精品久久波多野结衣| 精品久久久久久久久久岛国gif| 九九亚洲视频| 精品国产伦一区二区三区观看体验 | 精品福利av导航| 最新av番号| 香蕉成人啪国产精品视频综合网| 中文有码在线观看| 欧美视频在线不卡| 在线观看av黄网站永久| 久久精品美女视频网站| 国产视频一区二区三区在线播放| 国产极品在线观看| 欧美在线网址| 国产97在线|亚洲| 电影网一区二区| 成人免费小视频| 国产一区二区色| 国产精品高潮久久| 欧美激情一区二区三区蜜桃视频| xvideos亚洲人网站| 日韩一级特黄毛片| 91精品国产自产观看在线| 亚洲色图丝袜美腿| 成人短视频软件网站大全app| 伊人春色在线| 成人精品视频一区二区| 亚洲精品一区二区三| 香蕉av福利精品导航| 欧洲天堂在线观看| 色狠狠一区二区三区香蕉| 成人免费一区二区三区牛牛| 成人激情视频在线观看| 亚洲日本在线视频观看| 米奇精品关键词| 国产精品久久久久一区二区 | 亚洲国产裸拍裸体视频在线观看乱了 | 好看的日韩av电影| 今天免费高清在线观看国语| 亚洲成av人综合在线观看| 亚洲一区电影| 欧洲精品一区二区三区在线观看| 九九九九精品| 亚洲精品一二区| 亚洲激情自拍偷拍| 久久精品av麻豆的观看方式| 国产精品伦一区二区| 精品99又大又爽又硬少妇毛片| 一本一道久久久a久久久精品91| 久久高清视频免费| 678五月天丁香亚洲综合网| 亚洲一级二级三级| 久久久www成人免费毛片麻豆| 一区二区高清| 精品不卡一区| 香蕉久久一区| 黄动漫在线看| 久久久久久久久久久视频| 午夜精品视频在线观看一区二区| 在线不卡免费av| 白白色 亚洲乱淫| 牛牛影视一区二区三区免费看| 在线观看成年人视频| 成人性生交大片免费看视频直播 | 鲁大师成人一区二区三区| 三级在线观看视频| 成人免费观看www在线| 国模精品一区二区三区| 亚洲女人天堂色在线7777| 亚洲亚洲精品在线观看| 亚洲毛片视频| 亚洲一级大片| 国产又色又爽又黄刺激在线视频| 激情六月天婷婷| 日韩一级大片在线观看| 伊人精品一区| 日韩免费在线播放| 国产精品自拍av| 北岛玲日韩精品一区二区三区| 欧美激情一区二区三区在线视频观看 | 久操视频在线播放| 欧美中文字幕在线播放| 国产原创一区二区三区| 成a人v在线播放| 国产精品久久77777| 久久久久久久久久久99999| 中文不卡1区2区3区| 欧美精品一区二区视频 | 日韩欧美在线国产| 日本妇女一区| 国产91对白刺激露脸在线观看| 精品久久久影院| 性欧美69xoxoxoxo| 欧美艹逼视频| 性欧美长视频免费观看不卡| 99在线热播精品免费| rebdb初裸写真在线观看| 精品欧美国产| 欧美日韩精品免费观看视频 | 亚洲欧美一区二区三区情侣bbw| 亚洲精品影院在线观看| 天堂av在线7| 国产美女久久精品| 中文字幕在线免费不卡| 国产高清亚洲| 大j8黑人w巨大888a片| 中文精品99久久国产香蕉| 国产美女久久久久| 69久成人做爰电影| 在线观看视频黄色| 日韩毛片在线看| 毛片av一区二区| a级片免费在线观看| 日本一区二区三区免费观看 | 成人羞羞网站入口| 日本成年免费网站| 国产精品久久久久久网站| 亚洲尤物在线视频观看| 成人在线电影在线观看视频| 三上悠亚在线免费观看| 亚洲aaa激情| 欧美性感一类影片在线播放| 99精品99| 中文字幕这里只有精品| 六月婷婷在线视频| 色噜噜狠狠狠综合曰曰曰| 久久久亚洲午夜电影| 精品伊人久久久| 中文字幕在线观| 国产厕所精品在线观看| 日韩精品一区二区在线观看| 精品一区二区三区欧美| 成人精品一区二区三区电影| 免费国产黄色网址| 欧美亚洲视频一区二区| 日韩欧美黄色动漫| 日本女人一区二区三区| 成人精品三级| www.日本xxxx| 国产日韩专区在线| 欧美精品在欧美一区二区少妇| 久久99国产精品久久| 成人污污www网站免费丝瓜| 欧美aaa大片| 欧洲一区二区在线 | 亚洲国产精品久久久久| caoporn国产一区二区| 日韩a级大片| 人人超碰在线| 日韩激情视频| 久久亚洲电影天堂| 午夜精品久久久久久久99樱桃 | 日本亚洲精品在线观看| 欧美色国产精品| 成人高清免费观看| 国产欧美一区| av男人的天堂在线观看|