Loading...
提供简单的单行/多行文本排版能力,单行支持水平对齐、字符间距;多行支持显式换行符以及自动换行,垂直对齐。
可以在该 示例 中调整以下属性。
文本/文本块的位置通过文本锚点描述,围绕该锚点通过 textBaseline(单行/多行)、textAlign(多行)等属性调整自身位置。
必填项,文本内容,可以包含换行符,例如 "测试文本\n另起一行"
与 CSS text-transform 一致,对文本内容进行转换,仅影响视觉效果,原始文本内容不变,支持以下枚举值:
'capitalize' 首字母大写'uppercase' 全大写'lowercase' 全小写'none' 不做转换,默认值| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'none' | - | 否 | 否 | <keywords> |
与 SVG dx / dy 属性对应,在水平和垂直方向增加偏移量
支持 px 和 em 两种单位,使用 number 类型时默认 px 单位:
{dx: 10;dx: '10px';dx: '0.5em';}
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| '0' | - | 否 | 是 | <percentage> <length> |
在 3D 场景下是否永远面朝相机,默认为 false,也称作“公告牌效果”。
在示例中,未开启情况下在相机发生旋转时,文本会呈现被压缩的效果:
开启后并不会改变文本的位置,但它会始终面朝相机。这也符合通常 3D 场景下对于文本这类 2D 图形的需求:
公告牌模式下的旋转角度,顺时针方向以 radians 为单位。
在示例中,我们为文本增加一个旋转角度:
label.style.isBillboard = true;label.style.billboardRotation = Math.PI / 8;
在透视投影下,是否进行尺寸衰减。在透视投影中遵循“近大远小”的视觉效果,如果希望保持大小始终一致不受深度影响,可以开启该选项。
在示例中,我们为文本开启了尺寸衰减:
label.style.isSizeAttenuation = true;
字体类型,例如 'PingFang SC' 'Microsoft Yahei'。
与 CSS font-family 一致。
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| '' | - | 是 | 否 | <keywords> |
字体大小。
与 CSS font-size 一致。
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| '16px' | - | 是 | 是 | <percentage> <length> |
字体粗细。
与 CSS font-weight 一致。
支持以下值:
'normal' 正常粗细度,等于 400'bold' 加粗,等于 700'bolder''lighter'number 1 到 1000 之间的值。| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'normal' | - | 是 | 否 | <keywords> |
字体样式。
与 CSS font-style 一致。
例如下图为倾斜 italic 效果:
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'normal' | - | 是 | 否 | <keywords> |
字体样式。
与 CSS font-variant 一致。
支持以下取值:
'normal' 默认值'small-caps'例如下图为 small-cap 效果
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'normal' | - | 是 | 否 | <keywords> |
在垂直方向的对齐通过该属性实现,
与 Canvas textBaseline 一致。下图展示了不同取值下的对齐效果:
以文本当前位置为锚点,下图依次展示了 top middle 和 bottom 的效果。除了单行也适用于多行文本块:
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'alphabetic' | - | 是 | 否 | <keywords> |
字符间距。
与 Canvas letterSpacing 一致。
在以下两种情况下会出现换行:
wordWrap 后,超出 wordWrapWidth 的部分自动换行,类似 CSS 中的 word-break因此在解析原始文本时,需要考虑这两种情况。但在处理 CJK(Chinese/Japanese/Korean) 字符时,需要考虑它们的特殊语言规范。事实上 CSS 的 word-break 也提供了考虑 CJK 情况的值。
在多行文本中,每一行可以在水平方向以锚点(anchor)对齐。
与 CSS text-align 一致。
支持以下取值:
'start''center''end''left' 与 'start' 一致。'right' 与 'end' 一致。下图依次展示了 left center 和 right 的效果:
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'left' | - | 是 | 否 | <keywords> |
是否开启自动折行,默认值为 false。
开启自动折行后,超出该宽度则换行。
用于确定如何提示用户存在隐藏的文本溢出内容,例如直接裁剪、追加省略号或一个自定义字符串。需要配合 wordWrap ,wordWrapWidth 和 maxLines 一起使用。
与 CSS text-overflow 一致。
支持以下取值:
'clip' 直接截断文本'ellipsis' 使用 ... 表示被截断的文本注意事项:
'clip' 和 'ellipsis' 为保留字,因此自定义字符串不能使用它们。'clip'。| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'clip' | - | 否 | 否 | <keywords> |
最大行数,文本超出后将被截断,需要配合 wordWrap ,wordWrapWidth 和 textOverflow 一起使用。
下图展示了限制文本在一行展示,超出后使用省略号截断:
行高。
与 CSS line-height 保持一致。
行间距。
文本装饰线通过以下四个属性控制,与 CSS text-decoration 一致。
装饰线类型,与 CSS text-decoration-line 一致。
支持以下取值:
'none' 无装饰线,默认值'underline' 下划线'overline' 上划线'line-through' 删除线'underline overline' 同时包含上下划线可以在该示例中调整以下属性。
| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'none' | - | 否 | 否 | <keywords> |
装饰线样式,与 CSS text-decoration-style 一致。
支持以下取值:
'solid' 实线,默认值'double' 双线'dotted' 点线'dashed' 虚线'wavy' 波浪线| 初始值 | 适用元素 | 是否可继承 | 是否支持动画 | 计算值 |
|---|---|---|---|---|
| 'solid' | - | 否 | 否 | <keywords> |
装饰线颜色,与 CSS text-decoration-color 一致。
支持 CSS 支持的所有颜色格式,例如:
'red' 'blue''#FF0000''rgb(255, 0, 0)''rgba(255, 0, 0, 1)'装饰线粗细,与 CSS text-decoration-thickness 一致。
支持数字类型,表示像素值。例如:
1 1像素粗细3 3像素粗细获取每一行文本的包围盒,例如:
text.getLineBoundingRects(); // Rectangle[]
其中包围盒结构如下,其中 x/y 相对于文本的局部坐标系:
interface Rectangle {x: number;y: number;width: number;height: number;}
在示例中,我们绘制出了多行文本中每一行的包围盒,可以根据包围盒信息实现例如下划线、删除线等高级文本特性:
text.getLineBoundingRects().forEach(({ x, y, width, height }) => {const block = new Rect({style: {x,y,width,height,stroke: 'black',lineWidth: 2,},});text.appendChild(block);});
用于判断是否有溢出内容。便于类似 Tooltip 组件判定是否需要展示完整文本。
text.isOverflowing(); // true
需要注意的是,存在折行并不意味着一定有溢出内容。例如下图即使设置了 maxLines 和 wordWrapWidth,但内容并不存在溢出情况,该方法返回 false:
而只有内容确实存在溢出情况,即 textOverflow 属性确实生效(无论它的取值是啥),才会返回 true:
除了系统默认字体,有时我们希望加载第三方字体。
此时可以使用 Web Font Loader,在加载成功的 active 回调函数中创建,示例:
import WebFont from 'webfontloader';WebFont.load({google: {families: ['Gaegu'],},active: () => {const text = new Text({style: {x: 100,y: 100,fontFamily: 'Gaegu',text: 'Almost before we knew it, we had left the ground.',fontSize: 30,fill: '#1890FF',stroke: '#F04864',lineWidth: 5,},});canvas.appendChild(text);},});
CanvasKit 提供了 众多文本段落增强功能。 我们将这些能力整合进了 g-canvaskit 渲染器中。
由于 Text 的很多属性都是可继承的,这意味着如果未显式传入它们的值,只有在加入文档后才能获取到正确的继承值,从而计算得到精确的包围盒。如果确实想在加入文档前获取包围盒大小,例如实例化之后立刻获取到精确的包围盒,需要手动传入它们的值:
const text = new Text({style: {text: 'abcde',},});text.getBounds(); // Wrong empty bounding box.text.attr({fontSize: '16px',fontFamily: 'sans-serif',fontWeight: 'normal',fontVariant: 'normal',fontStyle: 'normal',textAlign: 'start',textBaseline: 'alphabetic',lineWidth: 0,});text.getBounds(); // Right bounding box.