TP Notes
全部
CSS
SVG
資源收集
HTML
其它
關於我
Translate
2020年11月27日 星期五
SVG 的文字
以前自己開發繪圖函式庫時,字都是自己畫,一開始是抓倚天中文的字形檔,後來用自己的方式產生自己的字形檔,並加上 alpha 來做反鋸齒,當時還為了開發泰國版本,自行設計泰文輸入法,雖然可以使用 truetype 字形,但是當時硬體規格太差,為了速度,還是要自己寫效率比較高,現在看到 SVG 文字相關的定義,真的覺得當初自己所想到的功能太陽春,SVG 的規劃要完整多了。 ## text 的參數如下: ```css x,y 座標 dx,dy 偏移 rotate 旋轉 lengthAdjust spacing (預設) 字與字之間以空白做間隔 spacingAndGlyphs 字與字之間以變形填滿 textLength 字串長度 text-anchor start , middle , end 文字定位 以下參數也可以做為 CSS 的參數 dominant-baseline auto (預設) text-bottom alphabetic ideographic middle central mathematical hanging text-top writing-mode horizontal-tb vertical-rl vertical-lr ``` 先來一個簡單範例 ``` $mmcode(r1) ```
1a
1a
可以發現,SVG 的字完全就是用畫的,像多邊形一樣,所以右邊的文字有加上 `stroke-linejoin="round"` 在角落的地方就成了圓角 文字處理另一個麻煩的就是基準線,這裡使用的是 dominant-baseline ,可以當作參數,也可以當作 CSS 使用
auto
測試1a
CSS 的文字有個很特別的設計,利用類似陣列的方式為每一個字設定屬性 ``` $mmcode(r3) ```
abcde
也可以用 dx 和 dy 做偏移 ``` $mmcode(r4) ```
abcde
可以用 rotate 旋轉, 而旋轉預設的中心點在左下角 ``` $mmcode(r5) ```
abcde ddd
textLength 和 lengthAdjust 搭配,設定字串長度後,看要用空白還是變形的方式填空間 ``` $mmcode(r6) ```
abcde
abcde
abcde
直寫測試123
# tspan 當一段文字想要有不同設定時,可以用 tspan ,就如同 css 的 span 一樣,搭配 dominant-baseline 就可以做到上標字和下標字的效果,
*經實測結果 Firefox 會不正常顯示
,以下正確結果應該顯示為
X₂+Y²=Z⁽²ⁿ⁺¹⁾
``` $mmcode(r7) ```
abc
123
def
def
ghi
X
2
+Y
2
=Z
(2n+1)
如果要完全相容的上標和下標字,似忽只有利用 dy 來實作,但是這個缺點就是,沒辦法單純用 css 來完成,而且 `
` 的定義很奇怪,一但 dy 改變了,就是改變了,並不會在 `
` 時變回來,所以在使用上標字(dy 減去某個值) ,必須在下一個顯示的字把 dy 的值加回來。 ``` $mmcode(r8) ```
X
2
+Y
2
=Z
(2n+1)
為了處理上標和下標問題,只好利用 javascript 來協助,加上 svgsup 和 svgsub 兩個 class ,由 javascript 來處理 dy 的問題,程式碼很簡單,效果也不錯 ``` $mmcode(svgsup) ```
X
2
+Y
2
=Z
(2n+1)
# textPath SVG 有個有趣的東西叫 textPath ,文字可以隨著路徑跑,這個功能當初我在設計網頁上的向量地圖時曾經用來顯示路名 當初在寫導航程式顯示路名時,字隨路徑走是用比較偷懶的方式,計算出每個字的座標,但是字不會旋轉,隨著現在硬體規格越來越強,加上 SVG 有這麼方便的指令,要開發 2D 地圖真的簡單多了。 ``` $mmcode(r9) ```
文字可以隨著路徑跑
startOffset="100"
可以使用
tspan
來做效果
這個設定在 iPhone 及 safari 沒用
dominant-baseline="central"
直式書寫 writing-mode:vertical-lr;
文字可以隨著路徑跑,那麼是不是可以取得路徑長度後,計算每個字的間距,讓字平均分布呢 ? 方法如下 : ``` let pp = document.getElementById("[path 的 ID]"); let len = pp.getTotalLength(); //取得路徑總長度 let xy = pp.getPointAtLength(500); //取得距離 500 的點位 , return {x:n,y:m} let box = pp.getBBox(); //取得路徑範圍 , return {x:n,y:n,width:n,height:n} ``` 取得長度後就可以計算平均分布的位置 ``` $mmcode(r10) ```
文字可以隨著路徑跑喲
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言