GodzillaxNitrogen
3 min readSep 7, 2021

SVG คืออะไรกันนะ + ทดลองเขียนโค้ดด้วยการวาดรูป (●'◡'●) ?

สวัสดีค่ะ กลับมาเจอกับบทความของ Gojira กันอีกแล้วนะคะ ไม่นานมานี้เราพึ่งได้รับโปรเจคนึงมา ในนั้นจะมี featureที่เราต้องการสร้างร่างกายของมนุษย์ขึ้นมาเพื่อให้ผู้ใช้งานสามารถคลิกบริเวณต่างๆ แล้วแสดงออกมาว่า เจ็บหรือปวดบริเวณหรือส่วนนี้ของร่างกายนะ

ตอนเราเห็น requirement ครั้งแรกเราถึงกับกุมขมับเลย แบบไปไม่เป็นจริงๆนะ แต่ด้วยความที่เราเป็น godzilla ที่ใช้ google เป็น ปัญหานี้เลยหมดไป เย่

เราเลยอยากมาแชร์การเขียน code ที่ใช้การวาดรูป? หรือสร้าง Vector Graphic เพื่อกำหนดทิศทาง/หรือ implement XML ขึ้นมานั่นเอง เพื่อที่จะลดเวลาในการ set position ต่างๆ

โดยเรามีความรู้พื้นฐานว่า SVG ถูกสร้างขึ้นมาจากภาษา XML แต่หากเราจะวาดรูปอะไรขึ้นมาโดยการเขียนโค้ด XML เอง ก็คงจะเสียเวลาไม่น้อยเลย (สิ่งแรกที่เราคิดจะทำเลย ╯︿╰) เพราะถ้าให้ทำแบบนั้นจริงๆ เราน่าจะตายคาจอแน่ๆ

เราแก้ปัญหาโดยการวาดด้วย Vector Graphic Editor อย่าง Adobe Illustrator หรือ Adobe XD แทน เพราะจะมีเครื่องมือต่างๆ ที่จะช่วยให้เราวาดรูปได้สะดวกมากขึ้น หลังจากที่วาดเสร็จแล้วเราก็สามารถ save ให้เป็นไฟล์ SVG ได้ทันที concept ง่ายๆใช่มั้ยล่าา

งั้นมารู้จัก SVG ก่อนลงมือดีกว่านะ เพราะเราลงมือก่อนหาข้อมูล เลยต้องทำหลายรอบเลย

SVG คืออะไร ?

SVG(Scalable Vector Graphics) เป็นรูปแบบหนึ่งของกราฟิกที่ใช้แสดงผลบนหน้าเว็บ โดยกราฟิกแบบ SVG นี้มีลักษณะเด่นตรงที่เป็นกราฟิกแบบ Vector ไม่ว่าจะเป็นเส้นตรง เส้นโค้ง หรือรูปทรงต่างๆ ล้วนถูกสร้างขึ้นมาจากการคำนวณทางคณิตศาสตร์ ซึ่งจะต่างจากกราฟิกแบบ Raster(Bitmap) อย่าง JPG หรือ PNG ที่จะสร้างภาพขึ้นมาโดยอิงกับ pixels เรามักจะเห็นว่ากราฟิกแบบ Raster นี้ พอขยายใหญ่มากๆ แล้วภาพจะแตก แต่สิ่งนี้จะไม่เกิดขึ้นกับกราฟิกแบบ Vector อย่าง SVG 

ฟังดู cool ใช่มั้ยล่า รูปก็จะไม่แตกด้วยขยายยังไงก็ได้ พอรู้อย่างนี้แล้วก็ไม่รอช้า ลงมือวาดรูปกันเลย

Vector Graphic Editor ที่เราใช้จะเป็น adobe xd นะคะ

เราลงมือวาดเส้นกันและนำ svg ที่ save ได้ไปใส่หน้าเว็บกัน

รูปแบบการนำ SVG ไปใส่ในหน้าเว็บ

สมมติว่ากราฟิก SVG ที่เราสร้างไว้มีขนาด 361x468 เราสามารถนำมันมาใส่ในหน้าเว็บได้หลายวิธีด้วยกัน ดังนี้

Inline

วิธีนี้คือให้เราดู source ของไฟล์ SVG แล้วคัดลอกเฉพาะโค้ดในส่วนของ svg element มาใส่ไว้ภายใน body element ตามตำแหน่งที่ต้องการ

  • ข้อดีไม่เกิด HTTP Request + สามารถเข้าถึงแต่ละ element ใน SVG ได้ด้วย CSS และ JavaScript
  • ข้อเสีย cache ไม่ได้ เพราะโค้ดฝังอยู่ในหน้าเว็บเลย

ซึ่งเราใช้วิธีนี้ในการทำ โดยเราจะเริ่มจากการวาดรูปก่อนเลย

เราจะยกตัวอย่าง code ที่ได้จากการวาด vector บริเวณไหล่นะคะ เราทำการวาด vector ที่ไหล่ โดยแบ่งเป็น 4 path แล้วทำการ group ด้วย directory

code ที่ได้มาก็จะเป็นแบบนี้

คือมี svg element เป็นแบบนี้

<body>
<svg>
<g>
<path>
<path>
<path>
</g>
</svg>
</body>

ซึ่งการ group ด้วย director yทำให้เกิดปัญหาเล็กน้อยตอนเราจะใส่ css และ js เพราะมันใส่ยากมาก

ยกตัวอย่างแบบง่ายๆเลย

จะเห็นว่าใน <g> ของ head

มี <path> ของ face

มี <g>ของ ear

มี <path>ของ hair

ซึ่งเป็น tag ลูกผสมเลย ทำให้การเขียน css หรือ js เพื่อทำการ set data-position เป็นไปได้ยากมาก

เราเลยไปหาวิธี group แบบใหม่มาที่จะรวม path ด้วยกัน จนเจอวิธี group แบบ union ซึ่งเป็นการกรุ๊ปแบบคณิตศาสตร์ มันจะได้ผลลัพธ์แบบ directory เลย ตอนแสดงผล แต่ในด้าน code ที่ออกมา code ที่ได้จะทำการ union ไว้ใหเแล้ว

จะเห็นได้ว่า แค่เราเปลี่ยนวิธี group ใหม่ xml ของ svg ที่ได้มาจะเป็นระเบียบขึ้น เอาไปเขียน css และ js และ css ต่อได้ง่ายขึ้นมากเลย

จากตอนแรกที่เราต้องจับหลาย tag ตอนนี้เหลือแค่ tag <path>เพียงอย่างเดียวแล้ว

และนี้ก็เป็นวิธีการ implemet ที่เราไม่ต้องเขียน code หรือ set view box เองเลย ง่ายๆใช่มั้ยล่าา ต่างจากตอนแรกมากเลยที่ต้องมานั่ง set view box และ position ต่างๆของรูปภาพ

หลักจากที่ได้ svg แบบที่เราต้องดารเรียบร้อย ก็เข้าสู่โหมดการเขียน css และ js กันเลย เพื่อที่จะให้เราจิ้มไปที่ส่วนไหน ส่วนนั้นจะแสดงผลออกมา

ซึ่งการใส่ css และ js นี้ เราจะมาเขียนในบทความถัดไปนะคะ

GodzillaxNitrogen
GodzillaxNitrogen

No responses yet