未验证 提交 5a972e9d 编写于 作者: N niko 提交者: GitHub

Update Ellipsis compute through height (#171)

* Update Ellipsis compute with height & Fixed https://github.com/ant-design/ant-design-pro/issues/167
上级 1800435a
......@@ -55,17 +55,15 @@ export default class Ellipsis extends Component {
computeLine = () => {
const { lines } = this.props;
if (lines && !isSupportLineClamp) {
const fontSize = parseInt(window.getComputedStyle(this.node).fontSize, 10) || 14;
const text = this.shadowChildren.innerText;
const targetWidth = (this.node.offsetWidth || this.node.parentNode.offsetWidth) * lines;
const targetHeight = this.root.offsetHeight;
const shadowNode = this.shadow.firstChild;
// bisection
const tw = (targetWidth - (lines * (fontSize / 2)) - fontSize);
const len = text.length;
const mid = Math.floor(len / 2);
const count = this.bisection(tw, mid, 0, len, text, shadowNode);
const count = this.bisection(targetHeight, mid, 0, len, text, shadowNode);
this.setState({
text,
......@@ -74,40 +72,45 @@ export default class Ellipsis extends Component {
}
}
bisection = (tw, m, b, e, text, shadowNode) => {
bisection = (th, m, b, e, text, shadowNode) => {
const suffix = '...';
let mid = m;
let end = e;
let begin = b;
shadowNode.innerHTML = text.substring(0, mid);
let sw = shadowNode.offsetWidth;
shadowNode.innerHTML = text.substring(0, mid) + suffix;
let sh = shadowNode.offsetHeight;
if (sw < tw) {
shadowNode.innerHTML = text.substring(0, mid + 1);
sw = shadowNode.offsetWidth;
if (sw >= tw) {
if (sh < th) {
shadowNode.innerHTML = text.substring(0, mid + 1) + suffix;
sh = shadowNode.offsetHeight;
if (sh >= th) {
return mid;
} else {
begin = mid;
mid = Math.floor((end - begin) / 2) + begin;
return this.bisection(tw, mid, begin, end, text, shadowNode);
return this.bisection(th, mid, begin, end, text, shadowNode);
}
} else {
if (mid - 1 < 0) {
return mid;
}
shadowNode.innerHTML = text.substring(0, mid - 1);
sw = shadowNode.offsetWidth;
if (sw <= tw) {
shadowNode.innerHTML = text.substring(0, mid - 1) + suffix;
sh = shadowNode.offsetHeight;
if (sh <= th) {
return mid;
} else {
end = mid;
mid = Math.floor((end - begin) / 2) + begin;
return this.bisection(tw, mid, begin, end, text, shadowNode);
return this.bisection(th, mid, begin, end, text, shadowNode);
}
}
}
handleRef = (n) => {
handleRoot = (n) => {
this.root = n;
}
handleNode = (n) => {
this.node = n;
}
......@@ -130,7 +133,6 @@ export default class Ellipsis extends Component {
...restProps
} = this.props;
const cls = classNames(styles.ellipsis, className, {
[styles.lines]: (lines && !isSupportLineClamp),
[styles.lineClamp]: (lines && isSupportLineClamp),
......@@ -160,7 +162,7 @@ export default class Ellipsis extends Component {
}
const childNode = (
<span>
<span ref={this.handleNode}>
{
(targetCount > 0) && text.substring(0, targetCount)
}
......@@ -173,7 +175,7 @@ export default class Ellipsis extends Component {
return (
<div
{...restProps}
ref={this.handleRef}
ref={this.handleRoot}
className={cls}
>
{
......
.ellipsis {
overflow: hidden;
display: inline-block;
word-break: break-all;
}
......@@ -6,13 +7,10 @@
.lines {
position: relative;
.shadow {
display: block;
position: relative;
color: transparent;
opacity: 0;
display: block;
position: absolute;
top: 0;
left: 0;
width: 9999px;
z-index: -999;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册