ToolHub
View All Posts

คู่มือการแปลงหน่วย CSS: px, rem, em, vw, vh อย่างละเอียด

การเลือกหน่วย CSS ที่ถูกต้องเป็นหนึ่งในการตัดสินใจที่มีผลกระทบมากที่สุดเมื่อเขียน stylesheet หน่วยที่คุณเลือกจะกำหนดว่าองค์ประกอบจะปรับขนาดอย่างไรในหน้าจอขนาดต่างๆ ตอบสนองต่อความต้องการของผู้ใช้ (เช่น การตั้งค่าขนาดตัวอักษรของเบราว์เซอร์) อย่างไร และเลย์เอาต์มีพฤติกรรมที่คาดเดาได้อย่างไร อย่างไรก็ตาม นักพัฒนาจำนวนมากใช้พิกเซลเป็นค่าเริ่มต้นเพราะความเคยชิน ทำให้พลาดความยืดหยุ่นและประโยชน์ด้านการเข้าถึงที่หน่วยสัมพัทธ์มอบให้ คู่มือนี้ครอบคลุมหน่วย CSS หลักทั้งหมด อธิบายว่าเมื่อใดควรใช้แต่ละหน่วย แสดงวิธีการแปลงระหว่างหน่วย และนำเสนอแนวทางปฏิบัติที่ดีที่สุดสำหรับ Responsive Design สมัยใหม่

ทำความเข้าใจการจำแนกประเภทหน่วย CSS

หน่วย CSS แบ่งออกเป็นสองประเภทใหญ่: หน่วยสัมบูรณ์และหน่วยสัมพัทธ์ หน่วยสัมบูรณ์มีขนาดทางกายภาพที่คงที่ ในขณะที่หน่วยสัมพัทธ์คำนวณค่าจากจุดอ้างอิงอื่น การเข้าใจความแตกต่างนี้เป็นพื้นฐานในการเลือกหน่วยอย่างชาญฉลาด

หน่วยสัมบูรณ์

หน่วยสัมบูรณ์คือการวัดที่มีขนาดคงที่ หน่วยสัมบูรณ์ที่ใช้บ่อยที่สุดในการพัฒนา Web คือ พิกเซล (px) หน่วยสัมบูรณ์อื่นๆ ได้แก่ พอยท์ (pt), เซนติเมตร (cm), มิลลิเมตร (mm) และนิ้ว (in) หน่วยเหล่านี้ใช้เป็นหลักใน stylesheet สำหรับการพิมพ์หรือเมื่อคุณต้องการการวัดที่ไม่เปลี่ยนแปลงตามบริบท ใน CSS บนหน้าจอ px เป็นหน่วยสัมบูรณ์เดียวที่คุณจะใช้บ่อยๆ

หน่วยสัมพัทธ์

หน่วยสัมพัทธ์คำนวณค่าสุดท้ายจากค่าอ้างอิง em สัมพัทธ์กับขนาดตัวอักษรขององค์ประกอบปัจจุบัน rem สัมพัทธ์กับขนาดตัวอักษรของ root element vw และ vh สัมพัทธ์กับขนาด viewport และเปอร์เซ็นต์สัมพัทธ์กับ parent element หน่วยสัมพัทธ์เป็นรากฐานของ Responsive Design และการเข้าถึง เพราะช่วยให้เลย์เอาต์ของคุณปรับตัวเข้ากับบริบทที่แตกต่างกันโดยอัตโนมัติ

พิกเซล (px): หน่วยพื้นฐาน

พิกเซลเป็นหน่วย CSS ที่เข้าใจง่ายที่สุด เนื่องจากแมปโดยตรงกับพิกเซลหน้าจอ (มีข้อควรระวังบางประการเกี่ยวกับ device pixel ratio) ค่า px จะเท่ากันเสมอไม่ว่าบริบทจะเป็นอย่างไร ทำให้คาดเดาได้และเข้าใจง่าย อย่างไรก็ตาม ความสามารถในการคาดเดานี้มีราคาที่ต้องจ่าย: ขนาดที่ใช้พิกเซลจะไม่ปรับขนาดเมื่อผู้ใช้เปลี่ยนขนาดตัวอักษรเริ่มต้นของเบราว์เซอร์ ซึ่งสร้างปัญหาด้านการเข้าถึง

เมื่อใดควรใช้ px

เมื่อใดควรหลีกเลี่ยง px

หลีกเลี่ยงการใช้ px สำหรับขนาดตัวอักษร, padding, margin และขนาดเลย์เอาต์ที่ควรปรับตามความต้องการของผู้ใช้ ผู้ใช้ที่เพิ่มขนาดตัวอักษรเบราว์เซอร์เป็น 20px คาดหวังว่าข้อความทั้งหมดจะปรับขนาดตาม แต่ขนาดตัวอักษรที่ใช้ px จะไม่ตอบสนองต่อการเปลี่ยนแปลงนี้

rem: ขนาดสัมพัทธ์กับ root

) ในเบราว์เซอร์ส่วนใหญ่ ขนาดตัวอักษร root เริ่มต้นคือ 16px ดังนั้น 1rem = 16px, 0.5rem = 8px, 2rem = 32px ข้อได้เปรียบสำคัญของ rem คือมันจะปรับขนาดเมื่อผู้ใช้เปลี่ยนขนาดตัวอักษรเริ่มต้นของเบราว์เซอร์ ทำให้เป็นตัวเลือกที่ดีที่สุดสำหรับการเข้าถึง

การแปลง px เป็น rem

สูตรการแปลงง่ายมาก: นำค่าพิกเซลหารด้วยขนาดตัวอักษร root

rem = px / root-font-size

// With default root font size of 16px:
12px = 12 / 16 = 0.75rem
16px = 16 / 16 = 1rem
24px = 24 / 16 = 1.5rem
32px = 32 / 16 = 2rem
48px = 48 / 16 = 3rem

เทคนิค 62.5%

นักพัฒนาหลายคนพบว่าการหารด้วย 16 เป็นเรื่องน่าเบื่อ เทคนิคยอดนิยมคือการตั้งขนาดตัวอักษร root เป็น 62.5% ทำให้ 1rem เท่ากับ 10px ซึ่งช่วยให้การคำนวณในใจง่ายขึ้น: 14px กลายเป็น 1.4rem, 24px กลายเป็น 2.4rem และอื่นๆ

html {
    font-size: 62.5%; /* 1rem = 10px */
}

body {
    font-size: 1.6rem; /* 16px */
}

h1 {
    font-size: 3.2rem; /* 32px */
    margin-bottom: 1.6rem; /* 16px */
}
หมายเหตุด้านการเข้าถึง: เทคนิค 62.5% ทำงานได้เพราะมันยังคงเคารพความต้องการขนาดตัวอักษรของผู้ใช้ การตั้ง font-size: 62.5% บน root element คือ 62.5% ของค่าเริ่มต้นที่ผู้ใช้เลือก ดังนั้นหากผู้ใช้ตั้งเบราว์เซอร์เป็น 20px, root element จะกลายเป็น 12.5px และค่า rem ทั้งหมดจะปรับขนาดตามสัดส่วน อย่าตั้งค่าขนาดตัวอักษร root เป็นค่า px คงที่ เพราะจะเขียนทับความต้องการของผู้ใช้

em: ขนาดสัมพัทธ์กับบริบท

หน่วย em สัมพัทธ์กับขนาดตัวอักษรขององค์ประกอบปัจจุบัน (หรือสำหรับ property อื่นที่ไม่ใช่ font-size จะสัมพัทธ์กับ parent element) นั่นหมายความว่า 1em เท่ากับขนาดตัวอักษรปัจจุบัน และค่า em จะทบต้นเมื่อองค์ประกอบซ้อนกัน พฤติกรรมการทบต้นนี้อาจทั้งทรงพลังและน่าสับสน

ปัญหาการทบต้น

/* Parent: font-size 16px */
.parent {
    font-size: 1em; /* 16px */
}

/* Child: 1.2em of parent's 16px = 19.2px */
.child {
    font-size: 1.2em;
}

/* Grandchild: 1.2em of child's 19.2px = 23.04px */
.grandchild {
    font-size: 1.2em;
}

แต่ละองค์ประกอบที่ซ้อนกันจะคูณขนาดตัวอักษร ทำให้เกิดการเติบโตแบบทวีคูณ นี่คือเหตุผลที่ rem มักเหมาะสมกว่าสำหรับขนาดตัวอักษร อย่างไรก็ตาม em ทำงานได้ดีในกรณีเฉพาะที่คุณต้องการการปรับขนาดระดับ component

เมื่อใดควรใช้ em

หน่วย Viewport: vw, vh, vmin, vmax

หน่วย Viewport สัมพัทธ์กับขนาดหน้าต่างเบราว์เซอร์ 1vw เท่ากับ 1% ของความกว้าง viewport, 1vh เท่ากับ 1% ของความสูง viewport vmin คือค่าที่น้อยกว่าระหว่าง vw และ vh, vmax คือค่าที่มากกว่า หน่วยเหล่านี้สำคัญอย่างยิ่งสำหรับการสร้างเลย์เอาต์ที่ตอบสนองต่อพื้นที่หน้าจอที่มีอยู่

กรณีการใช้งานหน่วย Viewport ที่พบบ่อย

กรณีใช้งานหน่วยตัวอย่าง
พื้นที่ Hero เต็มหน้าจอvhheight: 100vh
Fluid Typographyvw + clampfont-size: clamp(1rem, 2.5vw, 2rem)
เลย์เอาต์แบบเคียงข้างvwwidth: 50vw
องค์ประกอบสี่เหลี่ยมจัตุรัสvminwidth: 20vmin; height: 20vmin
Overlay เต็ม Viewportvw + vhwidth: 100vw; height: 100vh

ปัญหา vh บนมือถือ

บนเบราว์เซอร์มือถือ 100vh ไม่ได้เท่ากับความสูง viewport ที่มองเห็นเสมอไป แถบที่อยู่และส่วนควบคุมการนำทางของเบราว์เซอร์ใช้พื้นที่ แต่ 100vh รวมพื้นที่ด้านหลังส่วนควบคุมเหล่านี้ ทำให้เนื้อหาด้านล่างของพื้นที่เต็มความสูงถูกตัด CSS สมัยใหม่มี dvh (Dynamic Viewport Height) เป็นโซลูชัน ซึ่งคำนึงถึงแถบเครื่องมือแบบไดนามิก หรือใช้ JavaScript ตั้งค่า CSS Custom Property ตาม window.innerHeight

/* Modern approach */
.hero {
    height: 100dvh; /* Dynamic viewport height */
}

/* Fallback for older browsers */
.hero {
    height: 100vh;
    height: 100dvh;
}

หน่วย Viewport ใหม่: svh, lvh, dvh

CSS ได้แนะนำหน่วยความสูง Viewport ใหม่สามหน่วยเพื่อแก้ปัญหามือถือ:

ตัวแปร small/large/dynamic แบบเดียวกันนี้มีอยู่สำหรับความกว้าง (svw, lvw, dvw) และหน่วย min/max (svmin, lvmin, dvmin ฯลฯ) ใช้ dvh สำหรับเลย์เอาต์เต็มหน้าจอบนมือถือ ใช้ svh เมื่อต้องการรับประกันว่าเนื้อหาแสดงผลโดยไม่ต้องเลื่อน และใช้ lvh เมื่อต้องการเติมพื้นที่ให้มากที่สุดเท่าที่เป็นไปได้

การใช้ clamp() เพื่อการจัดตัวอักษรแบบ Fluid

ฟังก์ชัน CSS clamp() เป็นตัวเปลี่ยนเกมสำหรับการจัดตัวอักษรแบบ Responsive มันรับค่าสามค่า: ค่าต่ำสุด, ค่าที่ต้องการ และค่าสูงสุด เบราว์เซอร์เลือกค่าที่ต้องการ แต่จำกัดไว้ระหว่างค่าต่ำสุดและค่าสูงสุด

/* Font size scales from 1rem to 2.5rem based on viewport */
h1 {
    font-size: clamp(1rem, 2.5vw + 0.5rem, 2.5rem);
}

/* Padding scales proportionally */
.container {
    padding: clamp(1rem, 3vw, 3rem);
}

วิธีการนี้ให้ประโยชน์ของการปรับขนาดตาม viewport โดยไม่มีความเสี่ยงที่ข้อความจะเล็กเกินไปบนมือถือหรือใหญ่เกินไปบนเดสก์ท็อป มันช่วยลดความจำเป็นในการใช้ media query breakpoint สำหรับขนาดตัวอักษร ลดความซับซ้อนของ CSS ลงอย่างมาก

ตารางอ้างอิงการแปลง

ใช้ตารางนี้เป็นข้อมูลอ้างอิงด่วนสำหรับการแปลงทั่วไป ค่าทั้งหมดสมมติขนาดตัวอักษร root 16px และ viewport 1920x1080

pxremem (ที่ 16px)vw(1920px)% (ของ 16px)
8px0.5rem0.5em0.417vw50%
12px0.75rem0.75em0.625vw75%
16px1rem1em0.833vw100%
20px1.25rem1.25em1.042vw125%
24px1.5rem1.5em1.25vw150%
32px2rem2em1.667vw200%
48px3rem3em2.5vw300%
64px4rem4em3.333vw400%

แนวทางปฏิบัติที่ดีที่สุดสำหรับหน่วย CSS

ต้องการแปลงระหว่างหน่วย CSS อย่างรวดเร็ว? ลองใช้ตัวแปลงหน่วย CSS ออนไลน์ฟรีของเรา แปลงระหว่าง px เป็น rem, em เป็น px, หน่วย Viewport และอื่นๆ ได้ทันที

ตัวแปลงหน่วย CSS

คำถามที่พบบ่อย

ควรใช้ px หรือ rem สำหรับขนาดตัวอักษร?

ใช้ rem สำหรับขนาดตัวอักษรในกรณีส่วนใหญ่ หน่วย rem สัมพัทธ์กับขนาดตัวอักษร root ดังนั้นจะปรับขนาดเมื่อผู้ใช้เปลี่ยนขนาดตัวอักษรเริ่มต้นของเบราว์เซอร์ สิ่งนี้ช่วยปรับปรุงการเข้าถึง ใช้ px เฉพาะสำหรับรายละเอียดละเอียดเช่น border, shadow หรือเมื่อต้องการความแม่นยำระดับพิกเซลที่ไม่ควรปรับขนาดตามความต้องการของผู้ใช้

em และ rem แตกต่างกันอย่างไร?

em สัมพัทธ์กับขนาดตัวอักษรของ parent element ในขณะที่ rem สัมพัทธ์กับขนาดตัวอักษร root (ปกติ 16px) em จะทบต้นเมื่อซ้อนกัน ซึ่งอาจทำให้เกิดการเปลี่ยนแปลงขนาดที่ไม่คาดคิด rem อ้างอิงพื้นฐานเดียวกันเสมอ ทำให้คาดเดาได้มากกว่า ใช้ rem สำหรับขนาดทั่วโลก ใช้ em สำหรับการปรับขนาดระดับ component ที่คุณต้องการให้องค์ประกอบที่ซ้อนกันปรับขนาดตามสัดส่วน

จะแปลง px เป็น rem ได้อย่างไร?

นำค่าพิกเซลหารด้วยขนาดตัวอักษร root (ปกติ 16px) ตัวอย่างเช่น 24px / 16 = 1.5rem สูตรคือ: rem = px / root-font-size หากขนาดตัวอักษร root เป็น 16px ดังนั้น 1rem = 16px, 0.5rem = 8px, 2rem = 32px คุณสามารถใช้ตัวแปลงหน่วย CSS ออนไลน์เพื่อการแปลงที่รวดเร็ว

ควรใช้หน่วย Viewport (vw, vh) เมื่อใด?

ใช้หน่วย Viewport เมื่อคุณต้องการขนาดที่สัมพัทธ์กับหน้าต่างเบราว์เซอร์ กรณีทั่วไปรวมถึงพื้นที่ hero แบบเต็มหน้าจอ (100vh), การจัดตัวอักษรที่ปรับขนาดตามความกว้าง viewport (clamp กับ vw) และเลย์เอาต์ที่ควรเติมพื้นที่ว่าง หลีกเลี่ยงการใช้ vw เพียงอย่างเดียวสำหรับข้อความเนื้อหา เพราะอาจเล็กเกินไปบนมือถือหรือใหญ่เกินไปบนหน้าจอกว้าง

หน่วย CSS ที่ดีที่สุดสำหรับ Responsive Design คืออะไร?

ไม่มีหน่วยที่ดีที่สุดเพียงหน่วยเดียว การใช้ร่วมกันให้ผลลัพธ์ดีที่สุด: rem สำหรับขนาดตัวอักษรและระยะห่าง, เปอร์เซ็นต์สำหรับความกว้างภายใน container, หน่วย Viewport สำหรับองค์ประกอบเต็มหน้าจอ, CSS clamp() สำหรับการจัดตัวอักษรแบบ Fluid ที่ปรับขนาดระหว่างค่าต่ำสุดและสูงสุด หัวใจสำคัญคือการเข้าใจว่าแต่ละหน่วยอ้างอิงอะไรและเลือกตามนั้น

ToolHub's collection of 300+ free online tools including CSS unit converters, formatters, and more — no sign-up required.