การจัดตำแหน่ง SVG


203

ฉันกำลังเล่นกับ SVG และกำลังมีปัญหาเล็กน้อยกับการวางตำแหน่ง ฉันมีชุดของรูปร่างที่อยู่ในgแท็กกลุ่ม ฉันหวังว่าจะใช้มันเหมือนภาชนะดังนั้นฉันจึงสามารถกำหนดตำแหน่ง x ได้จากนั้นองค์ประกอบทั้งหมดในกลุ่มนั้นก็จะเคลื่อนไหวเช่นกัน แต่ดูเหมือนจะเป็นไปไม่ได้

  1. คนส่วนใหญ่ไปเกี่ยวกับการวางตำแหน่งกลุ่มองค์ประกอบที่คุณต้องการย้ายควบคู่อย่างไร
  2. มีแนวคิดเรื่องการวางตำแหน่งสัมพัทธ์หรือไม่? เช่นที่สัมพันธ์กับผู้ปกครอง

คำตอบ:


276

ทุกอย่างในองค์ประกอบ g อยู่ในตำแหน่งที่สัมพันธ์กับเมทริกซ์การแปลงปัจจุบัน

หากต้องการย้ายเนื้อหาเพียงแค่ใส่การแปลงในองค์ประกอบ g:

<g transform="translate(20,2.5) rotate(10)">
    <rect x="0" y="0" width="60" height="10"/>
</g>

ลิงค์: ตัวอย่างจากข้อกำหนด SVG 1.1


73

มีทางเลือกที่สั้นกว่าสำหรับคำตอบก่อนหน้านี้ องค์ประกอบ SVG ยังสามารถจัดกลุ่มได้โดยการซ้อนองค์ประกอบ svg:

<svg xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <svg x="10">
    <rect x="10" y="10" height="100" width="100" style="stroke:#ff0000;fill: #0000ff"/>
  </svg>
  <svg x="200">
    <rect x="10" y="10" height="100" width="100" style="stroke:#009900;fill: #00cc00"/>
  </svg>
</svg>

สี่เหลี่ยมสองรูปนั้นเหมือนกัน (นอกเหนือจากสี) แต่องค์ประกอบ svg หลักมีค่า x แตกต่างกัน

ดู http://tutorials.jenkov.com/svg/svg-element.html


33
ขวาองค์ประกอบ SVG สามารถเป็นองค์ประกอบการจัดกลุ่มได้เช่นกัน ฉันต้องการชี้ให้เห็นว่าองค์ประกอบ SVG ใช้การตัดตามค่าเริ่มต้น (อย่างน้อยก็ในขณะนี้ใน Chrome) นี่หมายความว่าจะไม่สามารถมองเห็นการล้นใด ๆ ไม่เหมือนกับองค์ประกอบ "g" เพียงแค่ตั้งค่า overflow = "มองเห็นได้" และคุณจะกลับมาทำธุรกิจหากสิ่งนี้กัดคุณ
bladnman

1
มีประโยชน์ถ้าคุณต้องการแปลกลุ่มองค์ประกอบด้วยเปอร์เซ็นต์: stackoverflow.com/a/17103928/470117
mems

14
มีข้อเสียเปรียบในการใช้ svg แทนที่จะเป็น g หรือไม่?
grabantot

34

ดังที่กล่าวไว้ในความคิดเห็นอื่นtransformแอตทริบิวต์ในgองค์ประกอบคือสิ่งที่คุณต้องการ ใช้transform="translate(x,y)"เพื่อย้ายgไปรอบ ๆ และสิ่งที่อยู่ภายในจะย้ายในความสัมพันธ์กับgg


22

มีสองวิธีในการจัดกลุ่มรูปร่าง SVG หลายแบบและจัดกลุ่ม:

เป็นคนแรกที่ใช้<g>กับtransformคุณลักษณะตามที่แอรอนเขียน แต่คุณไม่สามารถใช้xคุณลักษณะกับ<g>องค์ประกอบได้

อีกวิธีคือใช้<svg>องค์ประกอบ ซ้อนกัน

<svg id="parent">
   <svg id="group1" x="10">
      <!-- some shapes -->
   </svg>
</svg>

ด้วยวิธีนี้ # group1 svg ถูกซ้อนใน #parent และx=10สัมพันธ์กับ parent svg อย่างไรก็ตามคุณไม่สามารถใช้transformแอตทริบิวต์กับ<svg>องค์ประกอบซึ่งเป็นสิ่งที่ตรงกันข้ามกับ<g>องค์ประกอบ


13
เหตุใด <g> จึงไม่มีแอตทริบิวต์ ax และ y ในขณะที่แท็ก svg อื่น ๆ มี หมายความว่าตำแหน่งนั้นสัมบูรณ์เสมอใน <svg> ... ไม่มีตำแหน่งสัมพัทธ์
รวม

2
คณะกรรมการโอเพนซอร์สก็เป็นเช่นนั้น
มูฮัมหมัดอูเมอร์

ฉันเห็นด้วย ... ดูเหมือนว่าเป็นตัวเลือกการออกแบบที่ไม่ดี เพียงแค่เพิ่มการแปลง X ของกลุ่มต้องเขียนสตริงที่ซับซ้อนและจัดเก็บตัวแปรทั้งหมดไว้ที่อื่น
Eyelash

9
@ user1952009: มีโอกาส - เป็นโอกาส - ที่คุณไม่เข้าใจตัวเลือกการออกแบบที่เข้าสู่ SVG
Paul D. Waite

3
<g> สำหรับการจัดกลุ่ม มันไม่ได้เป็นตัวแทนรูปร่างใด ๆ ด้วยตัวเองดังนั้นจึงไม่มีเหตุผลที่จะมีที่ตั้งหรือขนาด มันสมเหตุสมผลที่จะมีคุณสมบัติการแปลงซึ่งคุณสามารถอ่านเช่น "ใช้การแปลงนี้กับทั้งกลุ่ม"
AlQafir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.