From f4d2f1478856685ce72c7f8ec594e244d904f535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=A5=95?= Date: Fri, 11 May 2018 18:09:28 +0800 Subject: [PATCH] Table: use Range to determine text overflow (#11124) --- packages/table/src/table-body.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/table/src/table-body.js b/packages/table/src/table-body.js index e0079ce13..2ceaea506 100644 --- a/packages/table/src/table-body.js +++ b/packages/table/src/table-body.js @@ -1,5 +1,5 @@ import { getCell, getColumnByCell, getRowIdentity } from './util'; -import { hasClass, addClass, removeClass } from 'element-ui/src/utils/dom'; +import { getStyle, hasClass, addClass, removeClass } from 'element-ui/src/utils/dom'; import ElCheckbox from 'element-ui/packages/checkbox'; import ElTooltip from 'element-ui/packages/tooltip'; import debounce from 'throttle-debounce/debounce'; @@ -336,8 +336,15 @@ export default { // 判断是否text-overflow, 如果是就显示tooltip const cellChild = event.target.querySelector('.cell'); - - if (hasClass(cellChild, 'el-tooltip') && cellChild.scrollWidth > cellChild.offsetWidth && this.$refs.tooltip) { + // use range width instead of scrollWidth to determine whether the text is overflowing + // to address a potential FireFox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1074543#c3 + const range = document.createRange(); + range.setStart(cellChild, 0); + range.setEnd(cellChild, 1); + const rangeWidth = range.getBoundingClientRect().width; + const padding = (parseInt(getStyle(cellChild, 'paddingLeft'), 10) || 0) + + (parseInt(getStyle(cellChild, 'paddingRight'), 10) || 0); + if (hasClass(cellChild, 'el-tooltip') && rangeWidth + padding > cellChild.offsetWidth && this.$refs.tooltip) { const tooltip = this.$refs.tooltip; // TODO 会引起整个 Table 的重新渲染,需要优化 this.tooltipContent = cell.textContent || cell.innerText;