編輯:不要使用這個!我對其進行了更多測試,並意識到A-> C轉換在所有情況下都不可靠,並且還有一些其他路徑命令組合失敗。請改用this!
最後得到它在Safari,Opera或IE9,Firefox和鉻的工作: http://jsfiddle.net/timo2012/M6Bhh/41/
功能正常化SVG路徑的數據,使得所有路徑段被轉換爲M,C,L和Z(=絕對座標,這意味着所有相對座標都轉換爲絕對座標)。所有其他分段都很平常,100%準確,但弧(A)是一種特殊情況,您可以選擇將弧線轉換爲線(L),二次曲線(Q)還是三次曲線(C)。最準確的是線條,但是然後我們失去了獨立性。由於某些原因,Quadratics在某些弧段中失敗,但立方體更精確。
如果我們有以下路徑:
<svg width="400" height="400">
<path stroke="red" stroke-width="3" d="M30 30 S40 23 23 42 L23,42 C113.333,113.333 136.667,113.333 150,80 t40,50 T230,240 q20 20 54 20 s40 23 23 42 t20,30 a20,30 0,0,1 -50,-50"/>
</svg>
,並使用規範它:
var path = document.querySelector('path');
path.normalizePath(3, 0.1); // 3 = C = cubic curves. Best alternative, rather good accuracy and path data remains reasonable sized
標準化的版本是這樣的:
<svg width="400" height="400">
<path stroke="red" stroke-width="3" d="M 30 30 C 30 30 40 23 23 42 L 23 42 C 113.333 113.333 136.667 113.333 150 80 C 150 80 163.333 96.6667 190 130 C 216.667 163.333 230 200 230 240 C 243.333 253.333 261.333 260 284 260 C 284 260 324 283 307 302 C 307 302 313.667 312 327 332 C 324.811 336.924 321.997 341.154 318.719 344.448 C 315.441 347.741 311.762 350.033 307.893 351.194 C 304.024 352.355 300.04 352.361 296.169 351.213 C 292.298 350.064 288.616 347.783 285.333 344.5 C 282.05 341.217 279.23 336.996 277.035 332.078 C 274.839 327.161 273.311 321.642 272.537 315.839 C 271.763 310.035 271.759 304.06 272.525 298.254 C 273.291 292.448 274.811 286.924 277 282"/>
</svg>
如果我們對頂面佈置兩個彼此的結果是這樣的(紅色標準化,黑色是原創):
其他可能性是這些:
path.normalizePath(1,0.5); // A->L, Many lines, high accuracy. Very good accuracy, but not so resolution independent, because when scaled, the corners become visible
path.normalizePath(1,40); // A->L, Few lines, less accuracy
path.normalizePath(2,0.5); // A->Q, quadratic curves. I tested this, but not good. Fails in some cases.
而這有什麼好處呢?
規範化路徑數據的原生方式尚未在所有瀏覽器中實現,所以我們目前爲止都是獨立的。而當原生方式實施時,我們並不確定所有瀏覽器都採用相同的方式。 SVG文檔提到了將弧線轉換爲線條,但這不是一個好方法,因爲SVG的主要優勢 - 分辨率獨立性 - 將會丟失。我們應該完全控制弧的規範化是如何完成的,並且這個腳本提供了一個方法。
數據標準化後,可以完全改變位圖圖像中的座標。如果我們想要以Illustrator方式彎曲(Arc,Arch,Bulge,Shell,Flag,Wave,Fish,Rise,Fisheye,Inflate,Squeeze,Twist)路徑或扭曲路徑以獲得透視錯覺,則可以修改規範化路徑數據可靠。
該代碼基於YannickBochatay的script,我使它更加跨瀏覽器。
我不確定這個行爲是否與原生'normalizedPathSegList'完全相同,但它確實從相對絕對轉換:http://phrogz.net/convert-svg-path-to-all-absolute-commands – Duopixel
@ Duopixel:謝謝你。我測試了它,並且它確實使REL-> ABS轉換如所假定的那樣,但是使Q,A,H,V,S和T不標準化。 http://jsfiddle.net/ybochatay/AtTND/3/很有前途(因爲它可以在IE和FF中使用),但是一些錯誤或類似的問題阻礙了它在其他瀏覽器中的工作。 –
應該爲由問題組成的帖子創建'精神分裂'徽章,然後由OP編寫每一個答案。 – MrMisterMan