当谈到旋转 SVG 文本时,有多个不同的方面:
完整的,相当难以理解的规格在这里。
'writing-mode' 属性应该改变第一个方面而不影响其他方面,但正如您发现它根本没有在 Firefox 中实现,而 IE 旋转文本但不遵守水平字形规则。
从理论上讲,您应该能够通过组合旋转和变换属性来获得相同的效果:变换整个<text>
元素以将其旋转到垂直位置,然后反向旋转单个字符以使其恢复水平。但在实践中,它变得混乱......
对于初学者来说,双重旋转会导致文本位于 (x,y) 点的左侧,因此如果 (x,y) 为 (0,0) 它将被剪切到 SVG 之外而无需补充移位。由于变换,您需要一个负值dy
来将文本移回锚点的右侧。
其次,旋转应用于每个字符的位置,字符的间距没有调整以解释“l”比它的宽度高得多的事实。所以除非你使用等宽,否则事情看起来很混乱。您应该能够使用kerning
andletterspacing
属性更改字母间距,但浏览器对这些属性的支持也很差:IE11 似乎不承认字距调整值,而 Firefox 也不承认。
最后一种选择是自己控制布局:使用 d3 的强大功能和 string.split("")
方法将标题分解为单字符<tspan>
元素,这些元素可以彼此下方放置并在<text>
元素内整齐地居中。缺点是这增加了额外的 DOM 元素,您仍然可以选择整个文本块,就像您可以在 HTML 段落中选择一个短语一样,即使每个字母都设置为单独的<span>
. 我不确定屏幕阅读器是否会自动假设字母之间有空格,但......
比较
这个小提琴尝试了三种在垂直文本标签中获取水平字符的方法(写作模式vs双旋转vs拆分成<tspan>
s):http:
//jsfiddle.net/hx5Th/11/
代码:
var svg = d3.select("body").append("svg");
//Green text, uses writing-mode property //
svg.append("text")
.attr("x", 40)
.attr("y", 40)
.attr("id", "title")
.attr("font-size", 50)
.attr("style", "fill: lightgreen; writing-mode: tb; glyph-orientation-vertical: 0")
.text("Top 100 Mentions");
//Black text, uses a double rotate //
svg.append("text")
.attr("x", 40)
.attr("y", 40)
.attr("id", "title")
.attr("font-size", 50)
.attr("rotate", -90)
.attr("dx", "1em")
.attr("dy", "-1em")
.attr("kerning", 0)
.attr("letter-spacing", "0.5em")
.attr("transform", "translate(150,0) rotate(90)")
.text("Top 100 Mentions");
//Blue text, uses d3 to create a series of tspans//
svg.append("text")
.attr("x", 40)
.attr("y", 40)
.attr("font-size", 50)
.attr("id", "title")
.style("fill", "blue")
.attr("transform", "translate(300,0)")
.attr("text-anchor", "middle")
.selectAll("tspan")
.data("Top 100 Mentions".split(""))
.enter().append("tspan")
.attr("x", 0)
.attr("dy", "0.8em")
.text(function(d){return d;});
结果(全部在 Windows 7 系统上):
铬 33
即 11
火狐
我认为这是胜利的d3...