text-overflow:ellipsis
是咱們用來設置文本溢出的一個經常使用屬性。css
可是究竟什麼狀況纔會觸發文本溢出,大部分人確定沒有探究過。
我之前也沒有注意,反正這樣的css樣式一把梭,溢出了就點點點dom
width: 100px; overflow: hidden; text-overflow: ellipsis;
原本是沒啥問題的,直到測試給我提了一個bug:表格內的文字超長隱藏後鼠標hover沒有懸浮提示測試
我一個開始不信,我用的element-UI還會出問題?
不過看完源碼之後果真翻車了this
const cellChild = event.target.querySelector('.cell'); if (hasClass(cellChild, 'el-tooltip') && cellChild.scrollWidth > cellChild.offsetWidth && this.$refs.tooltip) { //執行懸浮窗顯示操做 }
問題就出在了cellChild.scrollWidth > cellChild.offsetWidth
爲了方便控制元素寬度,設置了box-sizing: border-box;
按照理解scrollWidth
是內容的寬度,offsetWidth
是容器的寬度。
也不會出問題,可是誰也沒想到當scrollWidth===offsetWidth
時,text-overflow:ellipsis
竟然生效了。
重現效果:
http://jsfiddle.net/f0dmkkh8/1/spa
我天真的覺得cellChild.scrollWidth >= cellChild.offsetWidth
不就完事了。.net
知道我看了element-UI最新的代碼才發現本身錯了,原來scrollWidth
超出offsetWidth
並非text-overflow:ellipsis
觸發的條件。3d
const range = document.createRange(); range.setStart(cellChild, 0); range.setEnd(cellChild, cellChild.childNodes.length); const rangeWidth = range.getBoundingClientRect().width; const padding = (parseInt(getStyle(cellChild, 'paddingLeft'), 10) || 0) + (parseInt(getStyle(cellChild, 'paddingRight'), 10) || 0);
使用range對象截取dom片斷後獲取到的DOMRect對象的width纔是內容的真正寬度。(scrollWidth
並非內容區域的真正寬度)code
也就是說當對象
//加padding是應爲box-sizing:border-box; rangeWidth + padding > cellChild.offsetWidth
成立時纔是觸發text-overflow:ellipsis
真正的條件。blog