svg之文本

基本概念

  • 字符:在XML文档中,字符是指带有一个数字值的一个或多个字节,数字值与Unicode标准对应。例如,字母gUnicode值为103的字符。
  • 符号:符号(glyph)是指字符的视觉呈现。每个字符都可以用很多不同的符号来呈现。

一个符号可能由多个字符构成。一些字体为特定的字母组合(如fl和ff)准备了单独的符号,以使它们更好看,这种特性叫作“连字”(ligature)。有时候,一个字符也可能由几个符号组合而成,比如打印程序可能会组合符号e和重音符号(ˊ)来打印字符é(Unicode 值为 233)。

  • 字体:字体是指代表某个字符集合的一组符号。
  • 基线:字体中的所有符号以基线对齐。需要注意的是,中文字体中的基线概念并没有西文字体那么明确

mark

  • 上坡度:基线到字体中最高字符顶部的距离称为上坡度(ascent)。
  • 下坡度:基线到最深字符底部的距离称为下坡度(descent)。
  • em高度:字符的总高度为上坡度和下坡度之和,也称为em高度。
  • em box:指宽度为em高度的方块。
  • 大写字母高度:大写字母高度(cap-height)是指基线上的大写字母的高度。
  • x高度:指基线到小写字母x顶部的高度。x 高度通常能比em高度更好地衡量一个字体的尺寸和可读性

属性设置

基本属性

svg字体的基本属性与css的属性基本一致:

  • font-family:
  • font-size:
  • font-weight:
  • font-style:
  • text-decoration:
  • word-spacing:
  • letter-spacing:

文本方向

可以通过writing-mode属性(css3中也有这个属性)来设置文本排列的方向,如从右往左,从上往下等等;不过在svg中writing-mode属性使用的选项值是按照IE的规则:

1
-ms-writing-mode: lr-tb | rl-tb | tb-rl | bt-rl | tb-lr | bt-lr | lr-bt | rl-bt | lr | rl | tb

mark

不过在实际使用中这些属性值貌似不是每一个都被支持,只有tbtop to bottom,纵向排列)是被支持的:

mark

文本对齐

可以通过设置<text>元素的xy属性来确定文本的起点位置,而根据不同的对齐方式,字体符号所呈现的方式有所不同;可以通过text-anchor属性来设置文本与起点坐标的关系,text-anchor属性有以下几个选项:

  • start(默认值):以文本从左往右排列为例,x表示该文本第一个符号的em box的左侧位置,而y表示基线位置;
  • middle:同理,x表示该文本的水平中点位置,而y表示基线位置;
  • endx表示该文本最后一个符号的em box的右侧位置,而y表示基线位置;

mark

文本路径

通过在<text>元素内使用<textPath>元素可以为文字指定一条path,并按照path的形状进行文字排列;使用方法如下:

1
2
<path d="M100 200h150 v100" id="pathID" fill="none"></path>
<text><textPath xlink:href="#pathID">一段文字</textPath></text>

这样textPath内包含的文字就会按照所指定的#pathID路径进行排列,这里既可以指定定义在<defs>内的路径,也可以是实际出现过的路径;需要注意的是只能是<path>元素所定义的路径,像诸如<rect>这样的基本形状是不能被指定为路径的

mark

文本长度

<text>元素内文本并不会由于超过某一长度就会自动换行,也无法事先知道文本的终点在哪,但是可以通过textLength来控制文字的总长度(若文字原长度超过总长度也会被『压缩』在总长度内),并通过lengthAdjust属性来设置文本符号之间的间距和符号自身的大小;lengthAdjust属性有以下选项:

  • spacing(默认值):只调整符号之间的间距,而不会改变符号本身的尺寸大小;因此当设置的textLength小于文本原有长度时,字符的间距为『负』,也就是会被挤压重叠到一块:

  • spacingAndGlyphs:间距和符号本身的大小一起调整,按比例缩放。

mark

tspan元素

<tspan>元素有点类似html中的行内元素<span>,可以用来对<text>内的一段文本进行单独调整;除了基本的文字样式之外,<tspan>元素还可以调整文本的位置和变形。

位置调整

  • x,y:指定绝对位置坐标;
  • dx,dy:指定相对位置坐标;

需要注意的是,设置以上属性会影响该<tspan>后面的文本

  • baseline-shift:调整文本符号的基线位置,可以是一个长度值,也可以是super(上标)和sub(下标);该属性只会对<tspan>内产生作用!

变形

  • rotate:对<tspan>内的每个文本符号进行旋转(单独地?),单位为度数

参考文档

  1. 改变CSS世界纵横规则的writing-mode属性 « 张鑫旭-鑫空间-鑫生活
  2. 《SVG精髓(第2版)》