บางสิ่งที่ฉันสงสัยในขณะทำการออกแบบ CSS
มีการวางตำแหน่งทศนิยมในความกว้างของ CSS หรือไม่ หรือว่าพวกเขาถูกปัดเศษ?
.percentage {
width: 49.5%;
}
หรือ
.pixel {
width: 122.5px;
}
บางสิ่งที่ฉันสงสัยในขณะทำการออกแบบ CSS
มีการวางตำแหน่งทศนิยมในความกว้างของ CSS หรือไม่ หรือว่าพวกเขาถูกปัดเศษ?
.percentage {
width: 49.5%;
}
หรือ
.pixel {
width: 122.5px;
}
คำตอบ:
ถ้ามันเป็นความกว้างร้อยละแล้วใช่มันเป็นที่เคารพนับถือ อย่างที่มาร์ตินชี้ให้เห็นสิ่งต่าง ๆ พังทลายลงเมื่อคุณได้รับพิกเซลเศษส่วน แต่ถ้าค่าเปอร์เซ็นต์ของคุณให้ค่าพิกเซลจำนวนเต็ม (เช่นในตัวอย่าง 50.5% ของ 200px) คุณจะมีพฤติกรรมที่เหมาะสมและคาดหวัง
แก้ไข:ฉันได้อัปเดตตัวอย่างเพื่อแสดงสิ่งที่เกิดขึ้นกับพิกเซลเศษส่วน (ใน Chrome ค่าจะถูกตัดทอนดังนั้น 50, 50.5 และ 50.6 ทั้งหมดแสดงความกว้างเท่ากัน)
แม้ว่าหมายเลขจะถูกปัดเศษเมื่อหน้าถูกวาดค่าเต็มจะถูกเก็บไว้ในหน่วยความจำและใช้สำหรับการคำนวณลูกที่ตามมา ตัวอย่างเช่นหากกล่อง 100.4999px ของคุณมีสีถึง 100px เด็กที่มีความกว้าง 50% จะถูกคำนวณเป็น. 5 * 100.4999 แทนที่จะเป็น. 5 * 100 และในระดับที่ลึกลงไป
ฉันได้สร้างระบบโครงร่างแบบกริดที่ซ้อนกันอย่างลึกล้ำที่ความกว้างของผู้ปกครองคือ EMS และเด็ก ๆ คิดเป็นร้อยละและการรวมทศนิยมมากถึงสี่จุดขึ้นไปทางต้นน้ำก็มีผลกระทบที่เห็นได้ชัดเจน
กรณีขอบแน่นอน แต่สิ่งที่ต้องจำไว้
แม้ว่าพิกเซลเศษส่วนอาจปรากฏขึ้นรอบขึ้นในแต่ละองค์ประกอบ (ตาม@SkillDrickแสดงให้เห็นเป็นอย่างดี) มันเป็นสิ่งสำคัญที่จะรู้ว่าพิกเซลเศษส่วนมีความเคารพนับถือจริงในรูปแบบกล่องที่เกิดขึ้นจริง
สิ่งนี้สามารถเห็นได้ดีที่สุดเมื่อองค์ประกอบถูกซ้อนกันถัดจาก (หรือด้านบน) ซึ่งกันและกัน กล่าวอีกนัยหนึ่งถ้าฉันวาง 400 0.5 พิกเซล divs เคียงข้างกันพวกเขาจะมีความกว้างเท่ากับ div 200 พิกเซลเดียว หากพวกเขาทั้งหมดจริงปัดเศษขึ้น 1px (ในขณะที่กำลังมองหาที่แต่ละองค์ประกอบจะบ่งบอก) เราคาดหวัง 200px div จะเป็นครึ่งหนึ่งเป็นเวลานาน
สามารถเห็นได้ในตัวอย่างโค้ดที่รันได้นี้:
body {
color: white;
font-family: sans-serif;
font-weight: bold;
background-color: #334;
}
.div_house div {
height: 10px;
background-color: orange;
display: inline-block;
}
div#small_divs div {
width: 0.5px;
}
div#large_div div {
width: 200px;
}
<div class="div_house" id="small_divs">
<p>0.5px div x 400</p>
<div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div>
</div>
<br>
<div class="div_house" id="large_div">
<p>200px div x 1</p>
<div></div>
</div>
:nth-child(even)
หรือ:nth-child(odd)
คุณสังเกตเห็นว่าสิ่งทั้งหมดเป็นสีส้มหรือสีทั้งหมดเป็นสีน้ำเงินไม่ใช่ส่วนผสมของสีน้ำเงินและสีส้ม
ความกว้างจะถูกปัดเศษให้เต็มจำนวนพิกเซล
ฉันไม่รู้ว่าเบราว์เซอร์ทุกตัวจะปัดเศษในลักษณะเดียวกัน พวกเขาดูเหมือนจะมีกลยุทธ์ที่แตกต่างกันเมื่อปัดเศษเปอร์เซ็นต์ของพิกเซลย่อย หากคุณสนใจในรายละเอียดของพิกเซลย่อยปัดเศษในเบราว์เซอร์ที่แตกต่างกันมีบทความที่ดีใน ElastiCSS
แก้ไข : ฉันทดสอบการสาธิตของ @ Skilldrick ในบางเบราว์เซอร์เพื่อความอยากรู้อยากเห็น เมื่อใช้ค่าพิกเซลเศษส่วน(ไม่ใช่เปอร์เซ็นต์จะทำงานตามที่แนะนำในบทความที่ฉันเชื่อมโยง) IE9p7 และ FF4b7 ดูเหมือนจะปัดเป็นพิกเซลที่ใกล้ที่สุดขณะที่ Opera 11b, Chrome 9.0.587.0 และ Safari 5.0.3 ตัดทศนิยมตำแหน่ง ไม่ใช่ว่าฉันหวังว่าพวกเขาจะมีอะไรที่เหมือนกันหลังจากทั้งหมด ...
พวกเขาดูเหมือนจะปัดเศษค่าเป็นจำนวนเต็มที่ใกล้เคียงที่สุด แต่เอี่ยมก็เห็นความไม่สอดคล้องกันในโครเมี่ยมซาฟารีและ Firefox
เช่นถ้า 33.3% แปลงเป็น 420.945px
chrome และ firexfox แสดงเป็น 421px ในขณะที่ซาฟารีแสดง 420px
ดูเหมือนว่าโครเมี่ยมและ Firefox ตามพื้นและเพดานตรรกะในขณะที่ซาฟารีไม่ได้ หน้านี้ดูเหมือนจะพูดถึงปัญหาเดียวกัน
องค์ประกอบต่าง ๆ ต้องทาสีให้เป็นจำนวนเต็มพิกเซลและในขณะที่คำตอบอื่น ๆ ที่ครอบคลุมนั้นจะมีการเคารพเปอร์เซ็นต์
หมายเหตุสำคัญคือพิกเซลในกรณีนี้หมายถึงพิกเซล cssไม่ใช่พิกเซลหน้าจอดังนั้นคอนเทนเนอร์ 200px ที่มีลูก 50.7499% จะถูกปัดเศษเป็นพิกเซล css 101px จากนั้นแสดงบน 202px บนหน้าจอเรตินาและไม่ใช่ 400 * 507499 ~ = 203px
ความหนาแน่นของหน้าจอถูกละเว้นในการคำนวณนี้และไม่มีวิธีการทาสี * องค์ประกอบของขนาดพิกเซลย่อยเรตินาที่เฉพาะเจาะจง คุณไม่สามารถมีพื้นหลังหรือเส้นขอบขององค์ประกอบที่ขนาดพิกเซลน้อยกว่า 1 cssถึงแม้ว่าขนาดขององค์ประกอบจริงอาจน้อยกว่า 1 css พิกเซลตามที่ Sandy Gifford แสดง
[*] คุณสามารถใช้เทคนิคบางอย่างเช่น 0.5 offset box-shadow ฯลฯ แต่คุณสมบัติของโมเดลกล่องจริงจะทาสีให้กับพิกเซล CSS แบบเต็ม