The CSS Podcast - 008: Sizing Units
เว็บเป็นสื่อที่ปรับเปลี่ยนตามพื้นที่โฆษณา แต่บางครั้งคุณอาจต้องควบคุมขนาดของเว็บเพื่อปรับปรุงคุณภาพโดยรวมของอินเทอร์เฟซ ตัวอย่างที่ดีของกรณีนี้คือ การจำกัดความยาวบรรทัดเพื่อปรับปรุงความง่ายในการอ่าน คุณจะทําเช่นนั้นในสื่อที่ยืดหยุ่นอย่างเว็บได้อย่างไร
ในกรณีนี้ คุณสามารถใช้หน่วย ch ซึ่งเท่ากับความกว้างของตัวอักษร "0" ในแบบอักษรที่แสดงผลตามขนาดที่คำนวณ
หน่วยนี้ช่วยให้คุณจำกัดความกว้างของข้อความด้วยหน่วยที่ออกแบบมาเพื่อปรับขนาดข้อความ ซึ่งจะช่วยให้ควบคุมได้อย่างคาดการณ์ได้ไม่ว่าจะปรับขนาดข้อความอย่างไรก็ตาม
หน่วย ch เป็นหนึ่งในหน่วยไม่กี่หน่วยที่มีประโยชน์สำหรับบริบทที่เฉพาะเจาะจง เช่น ตัวอย่างนี้
Numbers
ระบบจะใช้ตัวเลขเพื่อกำหนด opacity, line-height และแม้แต่ค่าของช่องสีใน rgb
ตัวเลขคือจำนวนเต็มที่ไม่มีหน่วย (1, 2, 3, 100) และทศนิยม (.1, .2, .3)
ตัวเลขมีความหมายโดยขึ้นอยู่กับบริบท
ตัวอย่างเช่น เมื่อกําหนด line-height ตัวเลขจะแสดงอัตราส่วนหากคุณกําหนดโดยไม่ระบุหน่วยที่รองรับ
p {
  font-size: 24px;
  line-height: 1.5;
}
ในตัวอย่างนี้ 1.5 เท่ากับ 150% ของขนาดแบบอักษรพิกเซลที่คำนวณแล้วขององค์ประกอบ p
ซึ่งหมายความว่าหาก p มี font-size เป็น 24px ระบบจะคํานวณความสูงของบรรทัดเป็น 36px
นอกจากนี้ คุณยังใช้ตัวเลขในตำแหน่งต่อไปนี้ได้ด้วย
- เมื่อตั้งค่าตัวกรอง: filter: sepia(0.5)จะใช้ฟิลเตอร์สีซีเปีย50%กับองค์ประกอบ
- เมื่อตั้งค่าความทึบแสง: opacity: 0.5จะใช้ความทึบแสง50%
- ในช่องสี: rgb(50, 50, 50)โดยค่าที่ยอมรับได้คือ 0-255 ดูบทเรียนเกี่ยวกับสี
- วิธีเปลี่ยนรูปแบบองค์ประกอบ: transform: scale(1.2)ปรับขนาดองค์ประกอบเป็น 120% ของขนาดเริ่มต้น
เปอร์เซ็นต์
เมื่อใช้เปอร์เซ็นต์ใน CSS คุณจำเป็นต้องทราบวิธีคำนวณเปอร์เซ็นต์
เช่น width จะคํานวณเป็นเปอร์เซ็นต์ของความกว้างที่ใช้ได้ขององค์ประกอบหลัก
div {
  width: 300px;
  height: 100px;
}
div p {
  width: 50%;
}
ในตัวอย่างก่อนหน้านี้ ความกว้างของ div p คือ 150px โดยสมมติว่าเลย์เอาต์ใช้ box-sizing: content-box เริ่มต้น
หากคุณตั้งค่า margin หรือ padding เป็นเปอร์เซ็นต์ ความกว้างขององค์ประกอบหลักจะแบ่งออกเป็นส่วนๆ โดยไม่คำนึงถึงทิศทาง
div {
  width: 300px;
  height: 100px;
}
div p {
  margin-top: 50%; /* calculated: 150px */
  padding-left: 50%; /* calculated: 150px */
}
ในตัวอย่างก่อนหน้านี้ ทั้ง margin-top และ padding-left จะคํานวณเป็น 150px
div {
  width: 300px;
  height: 100px;
}
div p {
  width: 50%; /* calculated: 150px */
  transform: translateX(10%); /* calculated: 15px */
}
หากคุณตั้งค่า transform เป็นเปอร์เซ็นต์ ระบบจะอิงตามองค์ประกอบที่มีชุดการเปลี่ยนรูปแบบ
ในตัวอย่างนี้ p มีค่า translateX เป็น 10% และ width เป็น 50%
ก่อนอื่น ให้คำนวณความกว้าง: 150px เนื่องจากเป็น50% ของความกว้างขององค์ประกอบหลัก
จากนั้นนำ 10% ของ 150px ซึ่งก็คือ 15px
ขนาดและความยาว
หากคุณแนบหน่วยกับตัวเลข ตัวเลขนั้นจะกลายเป็นมิติข้อมูล
เช่น 1rem คือมิติข้อมูล
ในบริบทนี้ หน่วยที่แนบมากับตัวเลขเรียกว่าโทเค็นมิติข้อมูลในข้อกําหนด
ความยาวคือมิติข้อมูลที่อ้างอิงถึงระยะทาง และอาจเป็นค่าสัมบูรณ์หรือสัมพัทธ์ก็ได้
ความยาวสัมบูรณ์
ความยาวแบบสัมบูรณ์ทั้งหมดจะแก้ไขตามฐานเดียวกัน ซึ่งทำให้คาดการณ์ได้ไม่ว่าจะใช้ที่ใดใน CSS
ตัวอย่างเช่น หากคุณใช้ cm เพื่อปรับขนาดองค์ประกอบแล้วพิมพ์ออกมา ผลลัพธ์ที่ได้ควรถูกต้องเมื่อคุณเปรียบเทียบกับไม้บรรทัด โปรดทราบว่าหน่วยวัดจริง เช่น cm และ in จะไม่แสดงในขนาดเหล่านั้นบนหน้าจออย่างน่าเชื่อถือเนื่องจากขนาดพิกเซลที่ต่างกัน หน่วยวัดจริงเหมาะสําหรับสไตล์ชีตสำหรับสิ่งพิมพ์มากที่สุด เนื่องจากจะมีความน่าเชื่อถือมากกว่า
div {
  width: 10cm;
  height: 5cm;
  background: black;
}
หากคุณพิมพ์หน้านี้ div จะพิมพ์เป็นรูปสี่เหลี่ยมผืนผ้าสีดําขนาด 10x5 ซม.
โปรดทราบว่า CSS ไม่เพียงใช้กับเนื้อหาดิจิทัลเท่านั้น แต่ยังใช้เพื่อจัดรูปแบบเนื้อหาสิ่งพิมพ์ด้วย
ความยาวแบบสัมบูรณ์มีประโยชน์อย่างยิ่งเมื่อออกแบบสำหรับสิ่งพิมพ์
| หน่วย | ชื่อ | เทียบเท่า | 
|---|---|---|
| cm | เซนติเมตร | 1 ซม. = 96 พิกเซล/2.54 | 
| มม. | มิลลิเมตร | 1 มม. = 1/10 ของ 1 ซม. | 
| Q | เศษ 1 ใน 4 มิลลิเมตร | 1Q = 1/40 ของ 1 ซม. | 
| in | นิ้ว | 1 นิ้ว = 2.54 ซม. = 96 พิกเซล | 
| pc | Picas | 1pc = 1/6 ของ 1 นิ้ว | 
| pt | คะแนน | 1pt = 1/72 ของ 1 นิ้ว | 
| px | พิกเซล | 1 พิกเซล = 1/96 ของ 1 นิ้ว | 
ความยาวแบบสัมพัทธ์
ระบบจะคํานวณความยาวแบบสัมพัทธ์เทียบกับค่าฐาน ซึ่งคล้ายกับเปอร์เซ็นต์
ความแตกต่างระหว่างค่าเหล่านี้กับเปอร์เซ็นต์คือคุณสามารถกำหนดขนาดตามขนาดฐานที่เกี่ยวข้อง เช่น ขนาดแบบอักษรเริ่มต้นหรือขนาดหน้าต่าง
ซึ่งหมายความว่า CSS มีหน่วย เช่น ch ที่ใช้เมตริกขนาดแบบอักษรเป็นพื้นฐาน และ vw ซึ่งอิงตามความกว้างของวิวพอร์ต (หน้าต่างเบราว์เซอร์) ความยาวแบบสัมพัทธ์มีประโยชน์อย่างยิ่งบนเว็บเนื่องจากมีลักษณะที่ปรับเปลี่ยนตามอุปกรณ์
หน่วยแบบสัมพันธ์กับขนาดแบบอักษร
CSS มีหน่วยที่มีประโยชน์ซึ่งสัมพันธ์กับขนาดขององค์ประกอบของการจัดรูปแบบตัวอักษรที่ผ่านการจัดการแสดงผล เช่น ขนาดของข้อความ (หน่วย em) หรือความกว้างของอักขระแบบอักษร (หน่วย ch)
| หน่วย | เทียบกับ | 
|---|---|
| em | เมื่อเทียบกับขนาดแบบอักษร 1.5emจะใหญ่กว่าขนาดแบบอักษรฐานที่คำนวณแล้วขององค์ประกอบหลัก 50%
        (ตามประวัติแล้วคือความสูงของอักษรตัวพิมพ์ใหญ่ "M") | 
| rem | ขนาดแบบอักษรขององค์ประกอบรูท (ค่าเริ่มต้นคือ 16px) | 
| ex | วิธีการหาค่าประมาณเพื่อพิจารณาว่าจะใช้ความสูงของ x, อักษร "x" หรือ .5emในขนาดแบบอักษรที่คำนวณในปัจจุบันขององค์ประกอบหรือไม่ | 
| rex | ค่า exขององค์ประกอบรูท | 
| cap | ความสูงของตัวอักษรตัวพิมพ์ใหญ่ในขนาดแบบอักษรที่คำนวณในปัจจุบันขององค์ประกอบ | 
| rcap | ค่า capขององค์ประกอบรูท | 
| ch | ระยะห่างระหว่างอักขระโดยเฉลี่ยของสัญลักษณ์แคบในแบบอักษรขององค์ประกอบ (แสดงด้วยสัญลักษณ์ "0") | 
| rch | ค่า chขององค์ประกอบรูท | 
| ic | การเลื่อนอักขระโดยเฉลี่ยของสัญลักษณ์แบบเต็มความกว้างในแบบอักษรขององค์ประกอบ ตามที่แสดงโดยสัญลักษณ์ "水" (รูปอักษร CJK สำหรับน้ำ, U+6C34) | 
| ric | ค่า icขององค์ประกอบรูท | 
| lh | ความสูงของบรรทัดขององค์ประกอบ | 
| rlh | ค่าบรรทัด lhขององค์ประกอบรูท | 
หน่วยที่สัมพันธ์กับวิวพอร์ต
คุณสามารถใช้ขนาดของวิวพอร์ต (หน้าต่างเบราว์เซอร์) เป็นพื้นฐานแบบสัมพัทธ์ได้ หน่วยเหล่านี้จะแบ่งพื้นที่ในวิวพอร์ตที่มีอยู่
| หน่วย | เมื่อเทียบกับ | 
|---|---|
| vw | 1% ของความกว้างของวิวพอร์ต ผู้คนใช้หน่วยนี้เพื่อทริกเกอร์แบบอักษรเจ๋งๆ เช่น การปรับขนาดแบบอักษรส่วนหัวตามความกว้างของหน้าเว็บเพื่อให้แบบอักษรปรับขนาดด้วยเมื่อผู้ใช้ปรับขนาด | 
| vh | 1% ของความสูงของวิวพอร์ต คุณสามารถใช้คำสั่งนี้เพื่อจัดเรียงรายการใน UI ได้ เช่น หากคุณมีแถบเครื่องมือส่วนท้าย | 
| vi | 1% ของขนาดวิวพอร์ตในแกนแนวนอนขององค์ประกอบรูท แกนหมายถึงโหมดการเขียน ในโหมดการเขียนแนวนอน เช่น ภาษาอังกฤษ แกนในบรรทัดจะเป็นแนวนอน ในโหมดการเขียนแนวตั้ง เช่น ตัวพิมพ์ญี่ปุ่นบางแบบ แกนแนวนอนจะวิ่งจากบนลงล่าง | 
| vb | 1% ของขนาดวิวพอร์ตในแกนบล็อกขององค์ประกอบรูท สำหรับแกนบล็อก นี่เป็นทิศทางของภาษา ภาษาอย่างภาษาอังกฤษจะมีแกนบล็อกแนวตั้งเนื่องจากโปรแกรมอ่านภาษานี้จะแยกวิเคราะห์หน้าเว็บจากบนลงล่าง โหมดการเขียนแนวตั้งมีแกนบล็อกแนวนอน | 
| vmin | 1% ของขนาดที่เล็กกว่าของวิวพอร์ต | 
| vmax | 1% ของขนาดที่ใหญ่กว่าของวิวพอร์ต | 
div {
  width: 10vw;
}
p {
  max-width: 60ch;
}
ในตัวอย่างนี้ div จะเท่ากับ 10% ของความกว้างของวิวพอร์ต เนื่องจาก 1vw เท่ากับ 1% ของความกว้างของวิวพอร์ต
องค์ประกอบ p มี max-width เป็น 60ch
ซึ่งหมายความว่าต้องมีความกว้างไม่เกิน 60 อักขระ "0" ในแบบอักษรและขนาดที่คำนวณ
หน่วยสัมพัทธ์กับวิวพอร์ตทางเลือก
ค่าของหน่วยแบบสัมพันธ์กับวิวพอร์ตจะยังคงเหมือนเดิม ตราบใดที่ขนาดวิวพอร์ตไม่มีการเปลี่ยนแปลง อย่างไรก็ตาม เบราว์เซอร์ในอุปกรณ์เคลื่อนที่มักแสดงหรือซ่อนองค์ประกอบ UI เพื่อแสดงเนื้อหามากที่สุดบนหน้าจอขนาดเล็ก โดยไม่เปลี่ยนขนาดที่คำนวณไว้ของวิวพอร์ต คุณสามารถใช้หน่วยอื่นแทนหน่วยที่สัมพันธ์กับวิวพอร์ตเพื่อพิจารณาการเปลี่ยนแปลงเหล่านี้ในพื้นที่ที่มองเห็นได้
| หน่วย | เทียบเท่า | 
|---|---|
| lvw,lvh,lvi,lvb,lvmin,lvmax | หน่วยวิวพอร์ตขนาดใหญ่ซึ่งสัมพันธ์กับพื้นที่ที่มองเห็นได้ของวิวพอร์ต โดยซ่อนองค์ประกอบ UI ของเบราว์เซอร์ที่ไม่บังคับทั้งหมด เท่ากับหน่วยสัมพัทธ์กับวิวพอร์ตที่ไม่ใช่ตัวแปร จะไม่เปลี่ยนแปลงตราบใดที่ขนาดวิวพอร์ตไม่เปลี่ยนแปลง | 
| svw,svh,svi,svb,svmin,svmax | หน่วยวิวพอร์ตขนาดเล็กซึ่งสัมพันธ์กับพื้นที่ที่มองเห็นได้ของวิวพอร์ต โดยมีองค์ประกอบ UI ของเบราว์เซอร์ที่ไม่บังคับทั้งหมดแสดงอยู่ จะไม่เปลี่ยนแปลงตราบใดที่ขนาดวิวพอร์ตไม่มีการเปลี่ยนแปลง | 
| dvw,dvh,dvi,dvb,dvmin,dvmax | หน่วยวิวพอร์ตแบบไดนามิกซึ่งสัมพันธ์กับพื้นที่ที่มองเห็นได้ในปัจจุบันของวิวพอร์ต การเปลี่ยนแปลงเมื่อองค์ประกอบ UI ของเบราว์เซอร์แสดงหรือซ่อนอยู่ | 
หน่วยแบบสัมพัทธ์กับคอนเทนเนอร์
คุณสามารถใช้ขนาดของคอนเทนเนอร์ขององค์ประกอบเป็นพื้นฐานแบบสัมพัทธ์ได้ หน่วยเหล่านี้จะแบ่งพื้นที่คอนเทนเนอร์ที่มีอยู่ ซึ่งมีประโยชน์ภายในการค้นหาคอนเทนเนอร์เพื่อกำหนดขนาดแบบอักษรตามพื้นที่ว่างที่มีอยู่
| หน่วย | เมื่อเทียบกับ | 
|---|---|
| cqw | 1% ของความกว้างของคอนเทนเนอร์ | 
| cqh | 1% ของความสูงของคอนเทนเนอร์ | 
| cqi | 1% ของขนาดในบรรทัดของคอนเทนเนอร์ | 
| cqb | 1% ของขนาดบล็อกของคอนเทนเนอร์ | 
| cqmin | 1% ของมิติข้อมูลขนาดเล็กกว่าของคอนเทนเนอร์ | 
| cqmax | 1% ของมิติข้อมูลของคอนเทนเนอร์ที่ใหญ่กว่า | 
หน่วยอื่นๆ
นอกจากนี้ยังมีหน่วยอื่นๆ อีกที่กำหนดไว้เพื่อจัดการกับค่าบางประเภท
หน่วยของมุม
ในโมดูลสี เราได้ดูหน่วยมุม ซึ่งมีประโยชน์ในการกำหนดค่าองศา เช่น เฉดสีใน hsl
นอกจากนี้ ยังมีประโยชน์ในการหมุนองค์ประกอบภายในฟังก์ชันการเปลี่ยนรูปแบบด้วย
div {
  width: 150px;
  height: 150px;
  transform: rotate(60deg);
}
เมื่อใช้หน่วยมุม deg คุณจะหมุน div ได้ 90° ตามแกนกลาง
div {
  background-image: url('a-low-resolution-image.jpg');
}
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  div {
    background-image: url('a-high-resolution-image.jpg');
  }
}
หน่วยความละเอียด
ในตัวอย่างก่อนหน้านี้ ค่าของ min-resolution คือ 192dpi
หน่วย dpi หมายถึงจุดต่อนิ้ว
บริบทที่มีประโยชน์สําหรับกรณีนี้คือการตรวจหาหน้าจอที่มีความละเอียดสูงมาก เช่น จอแสดงผล Retina ในคําค้นหาสื่อและแสดงรูปภาพที่มีความละเอียดสูงขึ้น
ทดสอบความเข้าใจ
ทดสอบความรู้เรื่องขนาด
มิติข้อมูลใดต่อไปนี้ถูกต้อง
หน่วยสัมบูรณ์และหน่วยสัมพัทธ์แตกต่างกันอย่างไร
หน่วยวิวพอร์ตเป็นแบบสัมบูรณ์