feat: doric-web text support maxLines
This commit is contained in:
@@ -2,6 +2,7 @@ import { DoricViewNode, LEFT, RIGHT, CENTER_X, CENTER_Y, TOP, BOTTOM, toPixelStr
|
||||
import { toRGBAString } from "../utils/color";
|
||||
|
||||
export class DoricTextNode extends DoricViewNode {
|
||||
maxLines = 0
|
||||
textElement!: HTMLElement
|
||||
build(): HTMLElement {
|
||||
const div = document.createElement('div')
|
||||
@@ -61,10 +62,66 @@ export class DoricTextNode extends DoricViewNode {
|
||||
break
|
||||
}
|
||||
break
|
||||
case "maxLines":
|
||||
this.maxLines = prop as number
|
||||
break
|
||||
default:
|
||||
super.blendProps(v, propName, prop)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
layout() {
|
||||
super.layout()
|
||||
Promise.resolve().then(_ => {
|
||||
this.configSize()
|
||||
})
|
||||
}
|
||||
|
||||
configSize() {
|
||||
if (this.maxLines > 0) {
|
||||
const currentHeight = this.view.offsetHeight
|
||||
const computedStyle = window.getComputedStyle(this.view)
|
||||
const maxHeight = this.getLineHeight(computedStyle) * this.maxLines
|
||||
if (currentHeight > maxHeight) {
|
||||
this.view.style.height = toPixelString(maxHeight)
|
||||
this.view.style.alignItems = "flex-start"
|
||||
this.view.style.overflow = 'hidden'
|
||||
this.view.textContent = this.getTruncationText(computedStyle, maxHeight)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getLineHeight(style:CSSStyleDeclaration) {
|
||||
const tempEle = document.createElement('div')
|
||||
tempEle.style.cssText = style.cssText
|
||||
tempEle.textContent = 'Test'
|
||||
document.body.appendChild(tempEle);
|
||||
const lineHeight = tempEle.offsetHeight;
|
||||
document.body.removeChild(tempEle);
|
||||
return lineHeight;
|
||||
}
|
||||
|
||||
getTruncationText(style:CSSStyleDeclaration, maxHeight:number) {
|
||||
const originalText = this.view.textContent!
|
||||
let start = 0, end = originalText.length
|
||||
|
||||
const tempEle = document.createElement('div')
|
||||
tempEle.style.cssText = style.cssText
|
||||
tempEle.style.alignItems = "flex-start"
|
||||
tempEle.style.width = this.view.style.width
|
||||
document.body.appendChild(tempEle);
|
||||
|
||||
while(start <= end) {
|
||||
const mid = Math.floor((start + end) / 2)
|
||||
tempEle.textContent = originalText.slice(0,mid) + '...'
|
||||
if (tempEle.offsetHeight > maxHeight) {
|
||||
end = mid - 1
|
||||
} else {
|
||||
start = mid + 1
|
||||
}
|
||||
}
|
||||
document.body.removeChild(tempEle)
|
||||
return `${originalText.slice(0, end) + '...'}`
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user