transform
åºçº¿
广æ³å¯ç¨
èª 2015å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
transform 屿§å®ä¹åºç¨äºå
ç´ åå
¶åå
ç´ ç忢è§åå表ã
夿³¨ï¼ä» SVG2 å¼å§ï¼transform 为表ç°å±æ§ï¼è¿æå³çå®å¯ä»¥ç¨ä½ CSS 屿§ã使¯ï¼è¯·æ³¨æ CSS 屿§åè¯¥å±æ§çè¯æ³åå¨ä¸äºå·®å¼ãæå
³å¨è¿ç§æ
åµä¸ä½¿ç¨çç¹å®è¯æ³ï¼è¯·åè§ CSS transform 屿§çææ¡£ã
ä½ å¯ä»¥å¨ä»»ä½ SVG å ç´ ä¸ä½¿ç¨æ¤å±æ§ã
示ä¾
<svg
viewBox="-40 0 150 100"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<g
fill="grey"
transform="rotate(-10 50 100)
translate(-36 45.5)
skewX(40)
scale(1 0.5)">
<path
id="heart"
d="M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z" />
</g>
<use href="#heart" fill="none" stroke="red" />
</svg>
å¨ SVG 1.1 ä¸ï¼ä»
æ 16 ç§å
ç´ å¯ä»¥ä½¿ç¨å®ï¼<a>ã<circle>ã<clipPath>ã<defs>ã<ellipse>ã<foreignObject>ã<g>ã<image>ã<line>ã<path>ã<polygon>ã<polyline>ã<rect>ã<switch>ã<text> å <use>ã
å¦å¤ï¼ä½ä¸º SVG 1.1 çéçç©ï¼<linearGradient> å <radialGradient> æ¯æ gradientTransform 屿§ï¼è <pattern> æ¯æ patternTransform 屿§ï¼ä¸¤è
çè¡ä¸ºä¸ transform 屿§å®å
¨ç¸åã
| å¼ |
<transform-list>
|
|---|---|
| é»è®¤å¼ | æ |
| å¨ç»æ§ | æ |
忢彿°
transform 屿§ç <transform-list> å¯ä»¥ä½¿ç¨ä»¥ä¸ææç忢彿°
è¦åï¼æ ¹æ®è§èï¼ä½ è¿åºè¯¥è½å¤ä½¿ç¨ CSS 忢彿°ã使¯ï¼è¿ä¸è½ä¿è¯å ¼å®¹æ§ã
ç©éµ
matrix(<a> <b> <c> <d> <e> <f>) 忢彿°ä»¥å
个å¼ç忢ç©éµå½¢å¼æå®åæ¢ãmatrix(a,b,c,d,e,f) çåäºåºç¨åæ¢ç©éµï¼
å®éè¿ä»¥ä¸ç©éµçå¼å°åæ ä»å åçåæ ç³»æ å°å°æ°çåæ ç³»ï¼
示ä¾
<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
<rect x="10" y="10" width="30" height="20" fill="green" />
<!--
å¨ä¸é¢ç示ä¾ä¸ï¼æä»¬åºç¨ç©éµï¼
[a c e] [3 -1 30]
[b d f] => [1 3 40]
[0 0 1] [0 0 1]
ç©å½¢åæ¢å¦ä¸ï¼
å·¦ä¸è§ï¼oldX=10 oldY=10
newX = a * oldX + c * oldY + e = 3 * 10 - 1 * 10 + 30 = 50
newY = b * oldX + d * oldY + f = 1 * 10 + 3 * 10 + 40 = 80
å³ä¸è§ï¼oldX=40 oldY=10
newX = a * oldX + c * oldY + e = 3 * 40 - 1 * 10 + 30 = 140
newY = b * oldX + d * oldY + f = 1 * 40 + 3 * 10 + 40 = 110
å·¦ä¸è§ï¼oldX=10 oldY=30
newX = a * oldX + c * oldY + e = 3 * 10 - 1 * 30 + 30 = 30
newY = b * oldX + d * oldY + f = 1 * 10 + 3 * 30 + 40 = 140
å³ä¸è§ï¼oldX=40 oldY=30
newX = a * oldX + c * oldY + e = 3 * 40 - 1 * 30 + 30 = 120
newY = b * oldX + d * oldY + f = 1 * 40 + 3 * 30 + 40 = 170
-->
<rect
x="10"
y="10"
width="30"
height="20"
fill="red"
transform="matrix(3 1 -1 3 30 40)" />
</svg>
平移
translate(<x> [<y>]) 忢彿°å°å¯¹è±¡ç§»å¨ x å yãå¦ææ²¡ææä¾ yï¼é£ä¹å
¶é»è®¤ä¸º 0ã
æ¢èè¨ä¹ï¼
xnew = xold + <x> ynew = yold + <y>
示ä¾
<svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
<!-- æªç»å¹³ç§» -->
<rect x="5" y="5" width="40" height="40" fill="green" />
<!-- 水平平移 -->
<rect
x="5"
y="5"
width="40"
height="40"
fill="blue"
transform="translate(50)" />
<!-- åç´å¹³ç§» -->
<rect
x="5"
y="5"
width="40"
height="40"
fill="red"
transform="translate(0 50)" />
<!-- æ°´å¹³ååç´å¹³ç§» -->
<rect
x="5"
y="5"
width="40"
height="40"
fill="yellow"
transform="translate(50 50)" />
</svg>
缩æ¾
scale(<x> [<y>]) 忢彿°æå®ä¸ä¸ªæ x å y è¿è¡ç¼©æ¾çæä½ãå¦ææ²¡ææä¾ yï¼é£ä¹åå®å
¶çåäº xã
示ä¾
<svg viewBox="-50 -50 100 100" xmlns="http://www.w3.org/2000/svg">
<!-- çæ¯ç¼©æ¾ -->
<circle cx="0" cy="0" r="10" fill="red" transform="scale(4)" />
<!-- åç´ç¼©æ¾ -->
<circle cx="0" cy="0" r="10" fill="yellow" transform="scale(1, 4)" />
<!-- æ°´å¹³ç¼©æ¾ -->
<circle cx="0" cy="0" r="10" fill="pink" transform="scale(4, 1)" />
<!-- æ ç¼©æ¾ -->
<circle cx="0" cy="0" r="10" fill="black" />
</svg>
æè½¬
rotate(<a> [<x> <y>]) 忢彿°æå®ä¸ä¸ªå´ç»ç»å®ç¹æè½¬ a 度çæä½ãå¦ææ²¡ææä¾å¯éåæ° x å yï¼é£ä¹é»è®¤ç»å½åç¨æ·åæ ç³»çåç¹æè½¬ãå¦åï¼å°±ä»¥ (x,y) 为åç¹è¿è¡æè½¬ã
示ä¾
<svg viewBox="-12 -2 34 14" xmlns="http://www.w3.org/2000/svg">
<rect x="0" y="0" width="10" height="10" />
<!-- ç» 0,0 ç¹æè½¬ -->
<rect x="0" y="0" width="10" height="10" fill="red" transform="rotate(100)" />
<!-- ç» 10,10 ç¹æè½¬ -->
<rect
x="0"
y="0"
width="10"
height="10"
fill="green"
transform="rotate(100, 10, 10)" />
</svg>
徿 X
skewX(<a>) 忢彿°æå®æ²¿ x è½´å¾æ a 度ç徿忢ã
示ä¾
<svg viewBox="-5 -5 10 10" xmlns="http://www.w3.org/2000/svg">
<rect x="-3" y="-3" width="6" height="6" />
<rect x="-3" y="-3" width="6" height="6" fill="red" transform="skewX(30)" />
</svg>
徿 Y
skewY(<a>) 忢彿°æå®äºæ²¿ y è½´å¾æ a 度ç徿忢ã
示ä¾
<svg viewBox="-5 -5 10 10" xmlns="http://www.w3.org/2000/svg">
<rect x="-3" y="-3" width="6" height="6" />
<rect x="-3" y="-3" width="6" height="6" fill="red" transform="skewY(30)" />
</svg>
è§è
| è§è |
|---|
| CSS Transforms Module Level 1 > # svg-transform > |
| Scalable Vector Graphics (SVG) 2 > # TransformProperty > |