精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

設(shè)置表格列寬—在富文本編輯器中的實現(xiàn)

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

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

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

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

實現(xiàn)思路

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

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

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

2、 高亮線的顯現(xiàn)

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

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

3、 拖拽高亮線實現(xiàn)設(shè)置列寬

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

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

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

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

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

代碼實現(xiàn)

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

首先是創(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
}

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

const hl = new HL(editorEl) // 高亮線對象
// ...
let lastState = {} // 高亮線出現(xiàn)時,記錄對應(yīng)的 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) // 轉(zhuǎn)換為相對 editor 容器的左偏移量
lastState = { tableEl: nearestTable, rowIdx } // 保存 table 元素和 列索引,鼠標按下時要用到。
editorEl.style.cursor = 'col-resize'
} else {
hl.hideHL()
lastState = {}
}
}

然后是拖拽的邏輯。dragState.tableEl 除了記錄保存當(dāng)前表格元素,還在 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}
}

結(jié)尾

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

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

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-04-17 11:03:52

富文本編輯器MTE

2017-07-27 20:21:06

iOSUITableView富文本編輯器

2013-11-18 10:08:56

工具免費編程工具

2016-09-23 20:30:54

Javascriptuiwebview富文本編輯器

2023-05-11 07:34:36

Yjs協(xié)同編輯

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-08-24 14:47:55

LUA文本編輯器

2011-05-11 10:27:42

文本編輯器

2022-01-18 09:35:36

GNOME編輯器Linux
點贊
收藏

51CTO技術(shù)棧公眾號

米奇777四色精品人人爽| 全部毛片永久免费看| 欧美日韩免费电影| 亚洲欧美一区二区视频| av噜噜色噜噜久久| 在线观看亚洲欧美| 日韩精品免费一区二区在线观看| 这里只有精品视频在线观看| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 中国老头性行为xxxx| 99精品视频在线观看免费播放| 日韩欧美国产不卡| 91好吊色国产欧美日韩在线| a黄色在线观看| 成人黄色一级视频| 国产精品自产拍在线观看| 久草视频手机在线观看| 你懂的视频欧美| 日韩一区二区三区免费看 | 国内成人免费视频| 国内成人精品一区| 免费毛片视频网站| 91久久精品无嫩草影院| 91福利区一区二区三区| 日韩黄色片在线| 一级毛片视频在线观看| 91亚洲精华国产精华精华液| 2022国产精品| 在线观看国产成人| 国产精品一二| 久久免费观看视频| 亚洲国产美女视频| 红桃成人av在线播放| 亚洲精品大尺度| 久久久久无码精品| 久久精品黄色| 在线观看免费亚洲| 国产aaa一级片| 美足av综合网| 亚洲毛片av在线| 一区二区三区在线观看www| 免费a级毛片在线观看| 成人av资源在线观看| 91精品国产综合久久久久久丝袜| 在线观看日韩一区二区| 日韩不卡手机在线v区| 欧美一级视频一区二区| 日本少妇性高潮| 国内视频精品| 久久久亚洲影院你懂的| 欧美精品色哟哟| 欧美精品麻豆| 欧美激情xxxx性bbbb| 欧美精品乱码视频一二专区| 欧美福利影院| 欧美丰满片xxx777| 国产中文字幕免费| 亚洲精品激情| 欧美性做爰毛片| 久久久久久久久久久影院| 99热在线精品观看| 热99精品里视频精品| 中文在线第一页| 久久久久久色| 国产精品久久久久99| 在线观看毛片av| 久久99久久99精品免视看婷婷| 国产精品视频永久免费播放| 亚洲资源在线播放| 国产又粗又猛又爽又黄91精品| 69堂成人精品视频免费| 性一交一乱一色一视频麻豆| 成人深夜视频在线观看| 九九九九久久久久| 国产在线91| 最新热久久免费视频| www.一区二区.com| 日韩欧美精品一区二区三区| 日本大香伊一区二区三区| 亚洲天堂2018av| 欧美9999| 日韩精品在线视频观看| 国产精品久久免费观看| 一区二区三区午夜视频| 国外视频精品毛片| 中文字幕 人妻熟女| 激情成人午夜视频| 国产一区二区三区高清视频| 欧洲视频在线免费观看| 国产精品理论在线观看| 久久久久久久久久伊人| 一级毛片久久久| 欧美麻豆精品久久久久久| 久久黄色一级视频| 亚洲综合小说图片| 久久久精品久久久| 国产精品国产三级国产专区52| 三级欧美韩日大片在线看| 91久久中文字幕| 飘雪影院手机免费高清版在线观看| 中文字幕在线观看不卡| 国产一级爱c视频| 久久av日韩| 亚洲欧美综合图区| 欧美极品视频在线观看| 久久亚洲欧美| 国产精品12| 欧美天天影院| 日韩欧美在线看| 成人做爰69片免费| 色综合咪咪久久网| 97在线视频免费| aaaa一级片| 国产精品美女一区二区在线观看| 国产九九九九九| 精品视频91| 在线播放日韩av| 国产免费av一区| 成人av资源在线观看| 最近免费观看高清韩国日本大全| 亚洲成人看片| 日韩国产精品一区| 久久精品99久久久久久| 久久99久久精品| 视频一区二区在线| 综合另类专区| 亚洲国产成人精品女人久久久 | av网站免费在线播放| 欧美日韩在线大尺度| 国产一区二区色| 九色在线视频| 一本一道波多野结衣一区二区| 佐佐木明希电影| 欧美二区视频| 亚洲伊人第一页| 乱人伦中文视频在线| 欧美性猛交一区二区三区精品| aaaaa一级片| 一本色道久久综合亚洲精品高清| 99视频免费观看蜜桃视频| 麻豆传媒在线免费| 欧美裸体一区二区三区| 日韩一卡二卡在线观看| 美女www一区二区| 日韩资源av在线| 日韩成人影音| 国产亚洲美女精品久久久| 福利网址在线观看| 久久综合久久综合久久综合| 日韩av综合在线观看| 美女扒开腿让男人桶爽久久动漫| 高清欧美性猛交xxxx黑人猛交| 成人黄色免费视频| 亚洲高清免费在线| 97人妻精品一区二区三区免费 | 久久久久久香蕉网| 蜜桃视频在线观看www| 天天色天天操综合| 粉嫩av蜜桃av蜜臀av| 久久综合亚州| 亚洲欧美日韩另类精品一区二区三区 | 中文在线永久免费观看| 亚洲综合国产| 日韩.欧美.亚洲| 欧美日韩伦理一区二区| 欧美另类极品videosbest最新版本 | 日韩国产精品一区| 亚洲第一网站在线观看| 亚洲国产精品激情在线观看| 亚洲天堂伊人网| 欧美三级午夜理伦三级中文幕| 成人在线资源网址| 欧美aa在线观看| 国产亚洲综合久久| 国产精品久久久久久久久毛片| 亚洲色图欧洲色图婷婷| 成人在线电影网站| 天使萌一区二区三区免费观看| 亚洲国产欧美不卡在线观看| 国产美女亚洲精品7777| 国产69精品久久久久9| 免费a级毛片在线观看| 欧美顶级少妇做爰| 国产亚洲小视频| 国产视频不卡一区| aaaaaaaa毛片| 午夜亚洲性色视频| 在线观看亚洲视频啊啊啊啊| av日韩在线播放| 国产精品伦子伦免费视频| 婷婷在线播放| 亚洲一区999| 精品欧美在线观看| 91久久国产最好的精华液| 男人与禽猛交狂配| 91蜜桃免费观看视频| 一级黄色片国产| 免费永久网站黄欧美| 亚洲午夜久久久影院伊人| 国产精品超碰| 国产成人午夜视频网址| 麻豆蜜桃在线| 最近2019年手机中文字幕| 六月婷婷综合网| 欧美高清你懂得| 一级黄色大片视频| 亚洲一区二区三区四区五区黄| 天天操天天干天天操天天干| 成人黄色大片在线观看| jizz18女人| 丝袜脚交一区二区| www.av毛片| 欧美在线高清| 亚洲视频在线二区| 亚洲+变态+欧美+另类+精品| 亚洲自拍偷拍一区| 国产精品高潮久久| 欧美一区二区.| 9lporm自拍视频区在线| 久久精品人人做人人爽| 国产视频第一页在线观看| 亚洲精品久久久久久下一站| 精品久久久中文字幕人妻| 欧美日韩国产首页在线观看| 精品人妻一区二区三区免费看 | 全黄性性激高免费视频| 亚洲精品国产首次亮相| 亚洲看片网站| 日韩成人精品一区| 日本在线播放不卡| 亚洲+小说+欧美+激情+另类 | 欧洲一区av| 日韩极品精品视频免费观看| 国产激情久久久久久熟女老人av| 777a∨成人精品桃花网| 中文在线观看av| 在线视频一区二区三| 日本高清不卡码| 日韩欧美黄色动漫| 国产a∨精品一区二区三区仙踪林| 亚洲自拍偷拍麻豆| 欧美精品一区二区成人| 亚洲精品国久久99热| 久久久久久久久久网站| 一区二区在线观看视频在线观看| 国产稀缺精品盗摄盗拍| 亚洲女同女同女同女同女同69| 手机在线中文字幕| 亚洲欧洲另类国产综合| 五月天婷婷色综合| 亚洲免费伊人电影| 欧美人妻精品一区二区三区| 亚洲精品videosex极品| 九九九在线视频| 亚洲国产色一区| 免费在线不卡视频| 欧美性猛交xxxx乱大交3| 区一区二在线观看| 91久久人澡人人添人人爽欧美| 中国一区二区视频| 3d动漫精品啪啪一区二区竹菊| av av片在线看| 精品剧情v国产在线观看在线| 女人18毛片一区二区三区| 亚洲精品久久久一区二区三区| 你懂得网站在线| 在线免费看av不卡| 精品孕妇一区二区三区| 欧美精品videos| 中文在线免费视频| 国产精品美女免费| 美国十次综合久久| 国精产品一区二区| 精品国产成人| 操bbb操bbb| 国产亚洲精品bv在线观看| 欧美精品aaaa| 国产成人免费视频网站| av网站免费在线播放| 国产精品国产三级国产普通话三级 | www香蕉视频| 亚洲免费电影在线观看| 日本中文字幕在线视频| 欧美极度另类性三渗透| 最近高清中文在线字幕在线观看1| 国产精品国产三级国产aⅴ浪潮| 2020国产精品小视频| 精品无人乱码一区二区三区的优势 | 另类成人小视频在线| 95视频在线观看| 欧美韩日一区二区三区四区| 国产a免费视频| 一本一道波多野结衣一区二区| 一本色道久久综合亚洲| 亚洲成人av片在线观看| 91在线免费看| 久久久亚洲国产| 免费一区二区三区四区| 国产日韩二区| 68国产成人综合久久精品| 久久综合九色综合88i| 精品在线亚洲视频| aaaaaav| 一区二区三区在线免费| 日韩精品在线一区二区三区| 精品国产人成亚洲区| 网友自拍视频在线| 欧美壮男野外gaytube| 国产精品毛片aⅴ一区二区三区| 欧美国产视频在线观看| 国自产拍偷拍福利精品免费一| 污污的网站18| 91香蕉视频污| 日本免费在线播放| 欧美一区欧美二区| aaa日本高清在线播放免费观看| 久久久久久久999| 精品国产亚洲一区二区三区大结局| 欧美精品一区二区三区四区五区| 欧美精品福利| 国产亚洲视频一区| 欧美激情一区二区三区不卡| 日韩精品无码一区二区| 欧美一区二区三区爱爱| 日韩在线资源| 国产精品久久久久久久电影| 网友自拍一区| 黄色网址在线免费| 日韩美女久久久| 波多野结衣激情视频| 欧美精品一区二区三区蜜臀| 久做在线视频免费观看| 国产精品久久久av久久久| 亚洲另类av| 男人日女人逼逼| 成人妖精视频yjsp地址| 欧美成人精品欧美一级| 欧美一区二区三区婷婷月色| 麻豆传媒视频在线观看免费| 国产精品女人久久久久久| 亚洲免费专区| 日韩手机在线观看视频| 2021中文字幕一区亚洲| 51国产偷自视频区视频| 日韩成人小视频| 日韩精品美女| 日本成人三级电影网站| 三级在线观看一区二区| 亚洲久久久久久久| 在线欧美小视频| 成年人免费在线视频| 国产精品吴梦梦| 99久久婷婷国产综合精品电影√| 成人黄色一级大片| 亚洲欧美另类图片小说| 午夜精品久久久久久久99老熟妇| 欧美激情国产精品| 福利电影一区| 免费黄色福利视频| 久久精品亚洲一区二区三区浴池| 波多野结衣网站| 久久国内精品一国内精品| av在线精品| 成年人网站国产| 92国产精品观看| 成年人晚上看的视频| 日韩亚洲在线观看| 国产精品亚洲欧美日韩一区在线| 欧美美女黄色网| 92精品国产成人观看免费 | 黄色在线视频网站| av一区和二区| 中文国产一区| 91成人精品一区二区| 日韩视频在线永久播放| 牛牛精品一区二区| 一区二区视频在线播放| 成人黄色大片在线观看 | 精品久久久久久久人人人人传媒 | 老司机精品影院| 成人欧美一区二区三区视频| 国产精品一区毛片| 亚洲色图100p| 日韩av在线看| 日本免费在线一区| 国产av天堂无码一区二区三区| 国产色婷婷亚洲99精品小说| 国产黄色片av| 国产成人短视频| 欧美精品网站| 免费黄色片网站| 精品国产亚洲在线| 91综合国产| 成人免费aaa| 国产精品久久综合| 天天干天天草天天射| 国产欧美精品久久久| 激情视频一区二区三区| 国产又粗又黄又猛| 日韩av影视在线|