一般來說, 在頁面中,ID 應該是唯一的才對,但是實務上,不見得會有影響;不過,最近在測試開發中的新版筆順練習程式時,終於踢到鐵板了!
筆順示範的動畫是先建立一個筆畫的「遮罩」,然後在遮罩下,不斷的用不同座標畫大大小小的圓,畫面上只會看到該筆畫慢慢地被「塗上」顏色,彷彿用筆在寫的樣子。所以「遮罩」是很重要的關鍵。在 SVG 中設定要使用哪一個遮罩是用類似這樣的語法:
mask="url(#demo-mask)"
也就是設定名稱為「mask」的屬性,而用「url(# ... )」來指定用 ID 為 ... 的 mask ;以前面的例子來說,它指定使用 ID 為「demo-mask」的遮罩。
整個網頁中只有一個 ID 是「demo-mask」的話,當然不會有任何問題;如果有多個 ID 都叫作「demo-mask」,「url(#demo-mask)」只會取用第一個;應用在第一個 SVG 也不會有問題,其它的 SVG 就無法正常顯示了。之所以會踢到鐵板,完全是因為自己愛亂玩,一次在頁面中放了好幾個國字的 SVG ,而它們的遮罩的 ID 通通叫作「demo-mask」,玩到第二個字以後,只有第一個置入頁面的會正常顯示;這部份倒是和設定 style 不同,style 是後載入的會覆蓋先載入者。
▋ 動態產生 uuid
怎樣動態產生唯一的 ID 呢?
之前曾看過別人使用這樣的語法:
uuid = function b(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,b)}
只要呼叫 uuid() 就能得到一個不會重覆的 uuid。
另外一個語法是:
window.URL.createObjectURL(new Blob([])).slice(-36)
哈!我是喜歡簡潔一點的後者。如果想讓 id 短一點,就將 36 改小一點。
▋ 測試
以下的字,照設計的流程是:
- 多色的靜態筆畫。
- 按完播放鈕,筆畫變紅色。
- 黑色的書寫動畫。
- 黑色靜態筆畫,至全字動畫播畢。
- 多色的靜態筆畫。
可以觀察一下,當 mask 使用相同 ID,與使用不同 ID 有何差異,按底下的按鈕,開始測試:
[圖1] 是右邊的「試」 在 [測試1 (相同ID)] 中,第四筆畫時的截圖,本來應該是寫橫畫的,卻冒出了豎畫。我故意將「測」的輪廓疊上去,比較容易看出豎畫哪裡冒出來的;。那其實就是第一個字「測」的第四筆畫,「貝」的起筆豎畫製作的遮罩,「試」此時寫的是橫畫,所以只能看到短短的豎畫,這是因為遮罩 ID 衝突,所造成的誤用。而在 [測試2 (ID不同)] 中,兩個字都能正常的顯示遮罩內容。
![]() |
[圖1] 右邊的字誤用了左邊的遮罩而不正常 |
所以在 SVG 中有使用到「url(# ... )」來指定對象者,ID 在命名時,務必要特別注意,不然就會像我,程式改來又改去,對的程序都會改成錯的了。
沒有留言:
張貼留言