ฉันอยากจะชื่นชมคำตอบของ josh3736 ที่ให้บริบททางประวัติศาสตร์ที่ยอดเยี่ยม ในขณะที่มันพูดชัดแจ้งได้ดีแนว CSS มีการเปลี่ยนแปลงในเกือบห้าปีนับตั้งแต่คำถามนี้ถูกถาม เมื่อถูกถามคำถามนี้px เป็นคำตอบที่ถูกต้อง แต่ไม่เป็นจริงอีกต่อไปในวันนี้
tl; dr:ใช้rem
ภาพรวมหน่วย
pxหน่วยในอดีตมักแสดงถึงหนึ่งพิกเซลของอุปกรณ์ ด้วยอุปกรณ์ที่มีความหนาแน่นของพิกเซลสูงกว่าและสูงกว่าจึงไม่สามารถใช้กับอุปกรณ์ได้หลายชนิดเช่นจอแสดงผล Retina ของ Apple
remหน่วยแสดงขนาดr oot em มันเป็นสิ่งที่ตรงกับfont-size :rootในกรณีของ HTML มันเป็น<html>องค์ประกอบ สำหรับ SVG เป็น<svg>องค์ประกอบ เริ่มต้นfont-sizeในเบราว์เซอร์ทุก * 16pxคือ
ในขณะที่เขียนที่remได้รับการสนับสนุนโดยประมาณ 98% ของผู้ใช้ หากคุณกำลังกังวลเกี่ยวกับที่อื่น ๆ 2% ผมจะเตือนคุณว่าคำสั่งสื่อจะยังได้รับการสนับสนุนโดยประมาณ 98% ของผู้ใช้
เกี่ยวกับการใช้ px
ตัวอย่าง CSS ส่วนใหญ่บนอินเทอร์เน็ตใช้pxค่าเพราะเป็นมาตรฐานจริง pt, inและความหลากหลายของหน่วยงานอื่น ๆจะถูกนำมาใช้ในทางทฤษฎี แต่พวกเขาไม่ได้จัดการกับค่าเล็ก ๆ เดียวกับคุณได้อย่างรวดเร็วจะต้องรีสอร์ทเพื่อเศษส่วนซึ่งเป็นอีกต่อไปที่ชนิดและยากที่จะเหตุผลเกี่ยวกับ
หากคุณต้องการเส้นขอบแบบบางpxคุณสามารถใช้1pxโดยptคุณต้องใช้0.75ptเพื่อผลลัพธ์ที่สอดคล้องกันและนั่นก็ไม่สะดวก
เกี่ยวกับการใช้ rem
remค่าเริ่มต้นของ16pxไม่ใช่ข้อโต้แย้งที่แข็งแกร่งมากสำหรับการใช้งาน เขียน0.0625remเป็นที่เลวร้ายยิ่งกว่าการเขียน0.75ptดังนั้นทำไมจะใช้ใครrem?
มีประโยชน์สองส่วนremเหนือหน่วยอื่น ๆ
- ความพึงพอใจของผู้ใช้เป็นที่เคารพนับถือ
- คุณสามารถเปลี่ยน
pxค่าที่ชัดเจนของremสิ่งที่คุณต้องการ
เคารพการตั้งค่าของผู้ใช้
การซูมเบราว์เซอร์เปลี่ยนไปมากในช่วงหลายปีที่ผ่านมา เบราว์เซอร์จำนวนมากในอดีตจะขยายขนาดเท่านั้นfont-sizeแต่มันเปลี่ยนไปอย่างรวดเร็วเมื่อเว็บไซต์ต่างๆรู้ว่าการออกแบบพิกเซลที่สมบูรณ์แบบของพวกเขานั้นแตกสลายเมื่อใดก็ตามที่มีคนซูมเข้าหรือออก เมื่อถึงจุดนี้เบราว์เซอร์จะขยายขนาดหน้าทั้งหมดดังนั้นการซูมด้วยตัวอักษรจึงไม่อยู่ในภาพ
การเคารพความปรารถนาของผู้ใช้นั้นไม่อยู่ในภาพ เพียงเพราะเบราว์เซอร์ถูกตั้งค่าเป็นค่า16pxเริ่มต้นไม่ได้หมายความว่าผู้ใช้จะไม่สามารถเปลี่ยนการตั้งค่าของพวกเขาเป็น24pxหรือ32pxเพื่อแก้ไขการมองเห็นต่ำหรือทัศนวิสัยไม่ดี หากคุณแยกหน่วยออกจากฐานremผู้ใช้ที่มีขนาดตัวอักษรสูงกว่าจะเห็นไซต์ที่มีขนาดใหญ่ขึ้นตามสัดส่วน เส้นขอบจะใหญ่ขึ้นช่องว่างภายในจะใหญ่ขึ้นขอบจะใหญ่ขึ้นทุกอย่างจะขยายเพิ่มขึ้นอย่างราบรื่น
หากคุณยึดการสืบค้นสื่อของremคุณเป็นหลักคุณสามารถตรวจสอบให้แน่ใจว่าเว็บไซต์ที่ผู้ใช้เห็นเหมาะกับหน้าจอ ผู้ใช้ที่มีfont-sizeชุด32pxบน640pxเบราว์เซอร์กว้างได้อย่างมีประสิทธิภาพจะเห็นเว็บไซต์ของคุณเป็นแสดงให้เห็นว่าผู้ใช้ที่16pxอยู่บน320pxเบราว์เซอร์กว้าง อย่างมีการสูญเสีย RWD remในการใช้ไม่ได้
การเปลี่ยนpxค่าที่ชัดเจน
เพราะremอยู่บนพื้นฐานfont-sizeของ:rootโหนดถ้าคุณต้องการที่จะเปลี่ยนสิ่งที่1remแสดงให้เห็นถึงสิ่งที่คุณต้องทำคือการเปลี่ยนfont-size:
:root {
font-size: 100px;
}
body {
font-size: 1rem;
}
<p>Don't ever actually do this, please</p>
ไม่ว่าคุณจะทำอะไรอย่าตั้งค่า:rootองค์ประกอบfont-sizeเป็นpxค่า
ถ้าคุณตั้งค่าfont-sizeบนhtmlกับpxค่าที่คุณได้ปลิวไปตั้งค่าของผู้ใช้โดยไม่ต้องวิธีที่จะได้รับพวกเขากลับมา
หากคุณต้องการเปลี่ยนค่าที่ชัดเจนของremให้ใช้%หน่วย
คณิตศาสตร์สำหรับเรื่องนี้ค่อนข้างตรงไปตรงมา
ชัดเจน font-size ของ:rootเป็นแต่ให้บอกว่าเราต้องการที่จะเปลี่ยนไป16px 20pxทั้งหมดที่เราต้องทำคือการคูณด้วยค่าที่จะได้รับ1620
ตั้งค่าสมการของคุณ:
16 * X = 20
และแก้ปัญหาสำหรับX:
X = 20 / 16
X = 1.25
X = 125%
:root {
font-size: 125%;
}
<p>If you're using the default font-size, I'm 20px tall.</p>
การทำทุกอย่างเป็นทวีคูณ20ไม่ใช่สิ่งที่ยอดเยี่ยม แต่คำแนะนำทั่วไปก็คือทำให้ขนาดremเท่ากัน10pxชัดเจน จำนวนมายากลที่10/16ซึ่งเป็นหรือ0.62562.5%
:root {
font-size: 62.5%;
}
<p>If you're using the default font-size, I'm 10px tall.</p>
ปัญหาที่เกิดขึ้นในขณะนี้คือการที่เริ่มต้นของคุณfont-sizeสำหรับส่วนที่เหลือของหน้าเป็นวิธีชุดเล็กเกินไป แต่มีการแก้ไขที่ง่ายสำหรับการที่: ตั้งค่าfont-sizeในbodyการใช้rem:
:root {
font-size: 62.5%;
}
body {
font-size: 1.6rem;
}
<p>I'm the default font-size</p>
สิ่งสำคัญที่ควรทราบคือเมื่อมีการปรับค่านี้ค่าที่ชัดเจนremคือ10pxซึ่งหมายความว่าค่าใด ๆ ที่คุณอาจเขียนpxสามารถแปลงได้โดยตรงremโดยการชนทศนิยม
padding: 20px;
กลายเป็น
padding: 2rem;
ขนาดตัวอักษรที่ชัดเจนที่คุณเลือกนั้นขึ้นอยู่กับคุณดังนั้นหากคุณต้องการไม่มีเหตุผลคุณไม่สามารถใช้:
:root {
font-size: 6.25%;
}
body {
font-size: 16rem;
}
และมีความเท่าเทียมกัน1rem1px
ดังนั้นคุณมีมันเป็นทางออกที่ง่ายในการเคารพความต้องการของผู้ใช้ในขณะที่ยังหลีกเลี่ยงความซับซ้อนของ CSS
เดี๋ยวก่อนแล้วอะไรที่จับได้?
ฉันเกรงว่าคุณอาจถามว่า เท่าที่ฉันอยากจะเสแสร้งว่าremเป็นเวทมนตร์และแก้ปัญหาทุกอย่างยังมีเรื่องของการบันทึก ไม่มีอะไรที่ทำลายความคิดของฉันแต่ฉันจะเรียกพวกเขาออกดังนั้นคุณไม่สามารถพูดได้ว่าฉันไม่ได้เตือนคุณ
Media Queries (ใช้em)
หนึ่งในปัญหาแรกที่คุณจะพบโดยremเกี่ยวข้องกับการสืบค้นสื่อ พิจารณารหัสต่อไปนี้:
:root {
font-size: 1000px;
}
@media (min-width: 1rem) {
:root {
font-size: 1px;
}
}
ค่าของremการเปลี่ยนแปลงขึ้นอยู่กับว่าการสืบค้นสื่อใช้หรือไม่และการสืบค้นสื่อขึ้นอยู่กับมูลค่าของremสิ่งที่เกิดขึ้นบนโลก
remในคำสั่งสื่อใช้ค่าเริ่มต้นของfont-sizeและไม่ควร (ดูส่วน Safari) คำนึงถึงการเปลี่ยนแปลงใด ๆ ที่อาจเกิดขึ้นกับfont-sizeของ:rootองค์ประกอบ ในคำอื่น ๆ ก็คุ้มค่าที่เห็นได้ชัดคือเสมอ 16px
นี้เป็นบิตที่น่ารำคาญเพราะมันหมายความว่าคุณต้องทำบางคำนวณเศษส่วน แต่ฉันได้พบว่าที่พบมากที่สุดคำสั่งสื่อแล้วใช้ค่าที่มีหลายรายการที่ 16
| px | rem |
+------+-----+
| 320 | 20 |
| 480 | 30 |
| 768 | 48 |
| 1024 | 64 |
| 1200 | 75 |
| 1600 | 100 |
นอกจากนี้หากคุณใช้ตัวประมวลผลล่วงหน้า CSS คุณสามารถใช้มิกซ์อินหรือตัวแปรเพื่อจัดการคิวรีสื่อบันทึกของคุณซึ่งจะปกปิดปัญหาทั้งหมด
การแข่งรถวิบาก
น่าเสียดายที่มีข้อผิดพลาดที่รู้จักกับ Safari ซึ่งการเปลี่ยนแปลง:rootขนาดตัวอักษรจะเปลี่ยนremค่าที่คำนวณได้สำหรับช่วงแบบสอบถามสื่อ สิ่งนี้อาจทำให้เกิดพฤติกรรมที่แปลกประหลาดบางอย่างถ้าขนาดตัวอักษรของ:rootองค์ประกอบเปลี่ยนไปในเคียวรีสื่อบันทึก โชคดีที่การแก้ไขง่ายๆคือ: การใช้emหน่วยคำสั่งสื่อ
การสลับบริบท
หากคุณสลับระหว่างโครงการต่าง ๆ โครงการต่าง ๆ เป็นไปได้ค่อนข้างที่ขนาดตัวอักษรที่ชัดเจนremจะมีค่าแตกต่างกัน ในโครงการหนึ่งคุณอาจจะใช้ขนาดที่ชัดเจนของที่อยู่ในโครงการอื่นที่มีขนาดที่ชัดเจนอาจจะมี10px 1pxสิ่งนี้อาจสร้างความสับสนและทำให้เกิดปัญหา
คำแนะนำเดียวของฉันที่นี่คือการยึดติดกับ62.5%การแปลงremเป็นขนาดที่ชัดเจน10pxเพราะนั่นเป็นเรื่องธรรมดาในประสบการณ์ของฉัน
ไลบรารี CSS ที่ใช้ร่วมกัน
หากคุณกำลังเขียน CSS ที่จะถูกใช้บนไซต์ที่คุณไม่ได้ควบคุมเช่นสำหรับวิดเจ็ตที่ฝังอยู่จะไม่มีวิธีที่ดีที่จะทราบว่าขนาดที่ชัดเจนremจะมีอะไร หากเป็นกรณีนี้โปรดใช้pxต่อไป
หากคุณยังคงต้องการที่จะใช้remแต่พิจารณาปล่อย Sass remหรือน้อยกว่ารุ่นของสไตล์กับตัวแปรที่จะแทนที่การปรับสำหรับขนาดที่ชัดเจนของ
* ฉันไม่ต้องการหลอกใครให้ใช้remแต่ฉันไม่สามารถยืนยันได้อย่างเป็นทางการว่าเบราว์เซอร์ทุกตัวใช้เป็น16pxค่าเริ่มต้น คุณจะเห็นว่ามีจำนวนมากของเบราว์เซอร์และมันจะไม่เป็นสิ่งที่ยากสำหรับเบราว์เซอร์ที่จะต้องแยกออกเคยดังนั้นเล็กน้อยที่จะพูดหรือ15px 18pxในการทดสอบอย่างไรก็ตามฉันไม่เคยเห็นตัวอย่างเดียวที่เบราว์เซอร์ที่ใช้การตั้งค่าเริ่มต้นในระบบที่ใช้การตั้งค่าเริ่มต้นมีค่าอื่นใดนอกเหนือจาก16pxนี้ หากคุณพบตัวอย่างเช่นโปรดแบ่งปันกับฉัน