在談到旋轉SVG的文本,有多個不同的方面:
Full, rather difficult to comprehend, specs here。
的寫作模式「屬性應該改變第一個方面,而不會影響其他人,但你發現it's not implemented at all in Firefox,而IE旋轉文本,但不尊重水平字形規則。
理論上,你應該能夠通過組合旋轉,以獲得相同的效果和變換屬性:改變整個<text>
元素將其旋轉到垂直位置,然後反向 - 旋轉單個字符,讓他們回水平。但在實踐中,它會變得混亂...
對於初學者來說,雙旋轉會導致文本最終在左(x,y)點,所以如果(x,y)是(0, 0)它將被剪切到SVG外部而無需補充輪班。由於進行了轉換,因此需要使用負數dy
值將文本移回到定位點的右側。
其次,有一個事實是,旋轉應用於每個角色到位,角色的間距不會被調整,以解釋「l」比寬度高很多的事實。所以除非你使用等寬空間,否則看起來很混亂。您應該可以使用kerning
和letterspacing
屬性更改字母間距,但對這些屬性的瀏覽器支持也很差:IE11似乎沒有承認字距值,Firefox也不承認。
最後一個選擇是採取佈局自己的控制:使用D3的功率和字符串.split("")
方法打破你標題分成單字符<tspan>
元件可以定位一個下面彼此和內整齊地居中<text>
元素。缺點是,這會增加額外的DOM元素,您仍然可以選擇整個文本塊,就像您可以在HTML段落中選擇一個短語一樣,即使每個字母的樣式都是獨立的<span>
。我不知道,如果屏幕閱讀器會自動假設有字母之間的空間,但...
比較
這撥弄試行三種方式來獲得在垂直文本標籤水平字符(寫作-mode 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
IE 11
火狐
我覺得這是D3的贏...
工作對我來說:http://jsfiddle.net/hx5Th/ – Duopixel 2013-03-15 17:08:25
Firefox不支持TB書寫模式呢。 – 2013-03-15 17:11:05
謝謝,那是問題所在。我在Chrome中嘗試過它,但它工作正常,但我需要在樣式中添加'glyph-orientation-vertical:0'來防止旋轉文本。 – Samarth 2013-03-16 01:04:07