ข้ามไปยังเนื้อหา

Spacing Systems

คุณรู้อยู่แล้วว่า spacing แบบสุ่มรู้สึกผิด เมื่อปุ่มมี padding 14px ในที่หนึ่งและ 11px ในอีกที่หนึ่ง ผู้ใช้รู้สึกได้ — แม้ว่าพวกเขาจะไม่สามารถบอกได้ว่าทำไม นักออกแบบใช้ spacing tokens เพื่อป้องกันสิ่งนี้ ใน CSS เราทำสิ่งเดียวกันพอดี: ผูกมัดกับ spacing scale และใช้เฉพาะค่าจาก scale นั้น

spacing scale ที่ใช้กันมากที่สุดนั้นอิงตามตัวคูณของ 4 (บางครั้งเรียกว่า “4-point grid”) หรือตัวคูณของ 8 (“8-point grid”) ทุกค่า spacing ในโปรเจกต์ของคุณมาจากลำดับนี้:

Step4pt scale8pt scale
14px8px
28px16px
312px24px
416px32px
520px40px
624px48px

ใน CSS มักแสดงเป็นหน่วย rem (โดยที่ 1rem = 16px ตามค่าเริ่มต้น):

remเทียบเท่า px
0.25rem4px
0.5rem8px
0.75rem12px
1rem16px
1.5rem24px
2rem32px

padding — พื้นที่ ภายใน element ระหว่าง border กับเนื้อหา ทำให้ element เองใหญ่ขึ้น คิดว่าเหมือน “horizontal/vertical padding” ใน Figma auto-layout frame

margin — พื้นที่ ภายนอก element ดัน neighbor ออกไป ไม่ทำให้ element ใหญ่ขึ้น — แต่สร้างบัฟเฟอร์โซนรอบๆ

gap — พื้นที่ ระหว่าง children ใน Flex หรือ Grid container วิธีที่สะอาดและคาดเดาได้มากที่สุดในการเว้นระยะไอเทม — ไม่เพิ่มพื้นที่รอบขอบ เพิ่มเฉพาะระหว่างไอเทม

สถานการณ์ใช้
พื้นที่ระหว่างไอเทมใน flex หรือ grid containergap
padding ภายในของปุ่ม, card หรือกล่องpadding
ดัน element หนึ่งออกจาก siblingmargin
จัดกึ่งกลาง block element ในแนวนอนmargin: 0 auto
เว้นเนื้อหาห่างจากขอบหน้าpadding บน body/container

สิ่งที่ลองได้:

  • เปลี่ยน padding ของ .card จาก 1.5rem เป็น 0.5rem — สังเกตว่ารู้สึกแออัดแค่ไหน
  • เปลี่ยน gap ของ .page จาก 1rem เป็น 3rem — สังเกตว่าโปร่งขึ้นแค่ไหน
  • เปลี่ยน gap ของ .actions จาก 0.5rem เป็น 2rem — ปุ่มจะห่างออกจากกัน
  • ลอง padding: 2rem บน .card — การ์ดจะขยายให้พอดี
  • ใส่ spacing แบบสุ่ม (13px, 22px, 7px) แทนใช้ scale ที่สม่ำเสมอ
  • ไม่ sync spacing scale ระหว่าง Figma กับ code ทำให้ developer ต้อง “เดา” ค่าที่ใกล้เคียงที่สุด

Designer เห็น “ระยะห่างที่ดูดี” แต่ developer อยากได้ scale จำกัด (4px, 8px, 16px, 24px…) เพื่อ map เป็น design token/CSS variable ที่ reuse ได้ทั้งระบบ

💡 ตัวอย่างจากของจริง

Design system ของ Airbnb และ Stripe ใช้ spacing scale แบบ 4px หรือ 8px grid เท่านั้น ทำให้ทุก spacing ในทั้งเว็บ “ไปด้วยกัน” โดยไม่ต้องคิดใหม่ทุกครั้ง

คุณต้องการ 16px ระหว่างปุ่มใน flex container property ที่ดีที่สุดคือ:
ความแตกต่างระหว่าง padding กับ margin คืออะไร?
ใน 8pt spacing scale ค่าใดที่ไม่ใช่ส่วนหนึ่งของ scale?
จะ center block element ในแนวนอนด้วย margin อย่างไร?