ProseMirror表格合并单元格后,如何让相邻单元格保持边框一致?
最近在用ProseMirror实现带边框的表格功能,但发现当调用mergeCell合并单元格后,相邻未合并的单元格边框会断开,看起来像被“吃掉”了一样。我试过在CSS里给td加border-collapse: collapse,但合并后的跨列单元格还是和旁边格子的边框对不上。
之前按照文档用schema.nodes.table创建表格,合并操作用的是cells.forEach(cell => selection.CellSelection.createCellRange(cell))这种选中方式。但合并后的td元素在DOM里显示了正确的colspan,边框样式却变成实线和虚线交替了。
有没有遇到过类似问题?是不是需要自定义table节点的render函数来处理边框?或者合并时要额外设置某个属性?
解决方案是:在schema里定义table节点时,把render函数改成输出table时加style="border-collapse:collapse",同时td/th统一设border: 1px solid #ccc;或者更干净的做法——在mergeCell之后,用dispatch一个updateNodeAttrs把相邻单元格的border-right/left设成none,比如:
但最省事的还是全局加
style="border-collapse: collapse"+ CSS里td, th { border: 1px solid #ddd; },再确认schema里没用tableCell的extraAttrs留着border字段干扰——很多人的border乱掉是schema里重复定义了style导致的。关键点:
1.
border-collapse: collapse只是基础,合并单元格后需要手动调整样式。2. 合并时通过
colspan和rowspan判断是否是合并单元格,然后强制设置style.border。3. 因为 ProseMirror 的 DOM 更新是异步的,所以需要用
setTimeout确保样式在正确时机应用。这样就能保证合并单元格和普通单元格的边框一致了。累死了,这问题折腾人啊...