หน่วย dp (พิกเซลอิสระหนาแน่น) ที่มี CSS คืออะไร


91

สำหรับ Android ผู้คนแนะนำให้ใช้การวัดค่า dp (พิกเซลที่เป็นอิสระจากความหนาแน่น) สำหรับองค์ประกอบ UI และมีข้อกำหนดที่มีอยู่เช่นการใช้48dpสำหรับความสูงของปุ่มเป็นต้น

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

เมื่อฉันทดสอบแอปพลิเคชันของฉันด้วยความละเอียดและความหนาแน่นของพิกเซลที่แตกต่างกันมันดูไม่ดีนักและบางครั้งมันก็ผิดสัดส่วนดังนั้นจึงไม่สามารถใช้งานได้ CSS ไม่มีหน่วย dp เหมือนกับการพัฒนาเนทีฟของ Android แต่ฉันสงสัยว่าทางเลือกอื่นคืออะไร

ฉันสามารถรับความหนาแน่นของพิกเซลโดยใช้ Javascript และปรับขนาดทุกอย่างให้เหมาะสมด้วยตนเองได้หรือไม่ วิธีใดเป็นวิธีที่ดีที่สุดในการสร้างเว็บแอปที่มีลักษณะและทำงานได้ดีกับความละเอียด / ความหนาแน่นทั้งหมด


2
CSS pxเหมือนกับdpบน Android ตามข้อกำหนด CSS3 หน่วยและค่านิยม
omninonsense

คำตอบ:


24

http://www.w3.org/TR/css3-values/#lengths

หน่วยที่ใกล้เคียงที่สุดที่มีอยู่ใน CSS คือหน่วยเปอร์เซ็นต์วิวพอร์ต

  • vw - เท่ากับ 1% ของความกว้างของบล็อกเริ่มต้นที่มี
  • vh - เท่ากับ 1% ของความสูงของบล็อกที่มีค่าเริ่มต้น
  • vmin - เท่ากับ vw หรือ vh ที่เล็กกว่า
  • vmax - เท่ากับ vw หรือ vh ที่ใหญ่กว่า

เบราว์เซอร์มือถือเพียงตัวเดียวที่ต้องระวังที่ไม่รองรับหน่วยเหล่านี้คือ Opera http://caniuse.com/#feat=viewport-units


หน่วยเหล่านั้นแสดงอย่างถูกต้องเมื่อปรับใช้ใน iOS หรือไม่
jmhostalet

@jmhostalet ไม่ใช่มันทำให้เบราว์เซอร์เข้าสู่การวนซ้ำแบบไม่สิ้นสุดเนื่องจากความสูงของวิวพอร์ตเป็นแบบไดนามิก
rookie1024

6
คำตอบนี้ไม่ถูกต้องเนื่องจากpxหน่วยใน css (โดยสังหรณ์ใจ) ความหนาแน่นของพิกเซลเป็นอิสระอยู่แล้ว - "พิกเซล css ไม่ใช่พิกเซล" มีบทความมากมายเกี่ยวกับเรื่องนี้
ChaseMoskal

181

ฉันไม่เห็นด้วยกับคำตอบที่ยอมรับในปัจจุบัน ในฐานะที่เป็น uber5001 แสดงให้เห็นเป็นpxเป็นหน่วยคงที่และในจิตวิญญาณที่คล้ายกับความพยายามของ dpAndroid

ต่อข้อมูลจำเพาะของวัสดุ :

เมื่อเขียน CSS ให้ใช้ px ทุกที่ที่ระบุ dp หรือ sp ต้องใช้ Dp ในการพัฒนาสำหรับ Android เท่านั้น

นอกจากนี้

เมื่อออกแบบเว็บให้แทนที่ dp ด้วย px (สำหรับพิกเซล)


25
นี่คือคำตอบ +1 สำหรับการอ้างอิงข้อมูลจำเพาะของวัสดุ
Qix - MONICA MISTREATED

2
จาก MDN: "หน่วยในไม่ได้แสดงถึงนิ้วจริงบนหน้าจอ แต่หมายถึง 96px ซึ่งหมายความว่าความหนาแน่นของพิกเซลหน้าจอจริงจะถือว่าเป็น 96dpi สำหรับอุปกรณ์ที่มีความหนาแน่นของพิกเซลมากกว่า 1 นิ้วจะเป็น เล็กกว่า 1 นิ้วในทำนองเดียวกัน mm, cm และ pt ไม่ใช่ความยาวสัมบูรณ์ " developer.mozilla.org/en/docs/Web/CSS/…
Maciej Krawczyk

1
CSS นิ้วและฟิสิคัลนิ้วเป็น 2 สิ่งที่แตกต่างกัน 1 CSS นิ้วคือ 96px เสมอโดยไม่คำนึงถึงความหนาแน่นของหน้าจอ ดังนั้นเฉพาะบนจอภาพ 96 dpi เท่านั้นที่สามารถพิจารณา CSS นิ้วและนิ้วทางกายภาพเท่ากันได้
Maciej Krawczyk

1
@MaciejKrawczyk ฉันเข้าใจฐานของความขัดแย้งของคุณเกี่ยวกับความแตกต่างในขนาดพิกเซล ฉันสามารถโต้แย้งว่า px เป็นหน่วยคงที่ได้อย่างไรและสเกลที่คุณเกี่ยวข้องไม่ได้เปลี่ยนความจริงพื้นฐานนี้ แต่นั่นคือปลาเฮอริ่งแดง ความจริงก็คือข้อมูลจำเพาะของวัสดุระบุโดยตรงให้ใช้ px ทุกที่ที่มีการแนะนำ dp เมื่อแบรดถามเกี่ยวกับมาตรฐานการออกแบบของ Android ฉันจึงให้คำตอบที่ถูกต้องและถูกต้อง
Tohuw

2
การอัปเดตล่าสุด (พฤษภาคม 2018) สำหรับการออกแบบวัสดุอธิบายถึงความหนาแน่นของพิกเซลในวัสดุที่มี
io/

18

ใช้rem.

เป็นขนาดตัวอักษรขององค์ประกอบรากและหน่วยฐานที่ดีมากสำหรับขนาดขององค์ประกอบ UI อื่น ๆ

หากใช้ขนาดสัมบูรณ์เท่ากัน (เป็นเซนติเมตร) ข้อความและองค์ประกอบอื่น ๆ จะใหญ่เกินไปบนอุปกรณ์เคลื่อนที่หรือบนเดสก์ท็อปมีขนาดเล็กเกินไป

หากใช้จำนวนพิกเซลเท่ากันข้อความและองค์ประกอบอื่น ๆ จะมีขนาดเล็กเกินไปบนอุปกรณ์เคลื่อนที่หรือใหญ่เกินไปบนเดสก์ท็อป

remหน่วยเป็นจุดเพราะมันพูดว่า "เฮ้นี้เป็นวิธีที่ใหญ่ข้อความปกติที่ควรจะเป็น." การกำหนดขนาดขององค์ประกอบ UI อื่น ๆ เป็นทางเลือกที่สมเหตุสมผล


16

ใน CSS3 pxมันอาจจะถูกต้องมากขึ้นที่จะบอกว่าเว็บไม่ได้มีของ Android ข้อมูลจำเพาะสำหรับ CSS3pxกล่าวว่า:

พิกเซล; 1px เท่ากับ 1/96 ของ 1in

px อาจเป็นการวัดผลที่คุณต้องการในอนาคต


2
ฉันมองไม่เห็นว่าการเปลี่ยนแปลงนี้จะเกิดขึ้นได้อย่างไรหากไม่ทำลายทุกสิ่งทุกอย่าง และการใช้ขนาดสัมบูรณ์เดียวกัน (หน่วยเป็นซม.) สำหรับการพูดว่าข้อความบนอุปกรณ์เคลื่อนที่และเดสก์ท็อปไม่ใช่กระบวนทัศน์ที่ดี
Konstantin Schubert

และ 1in ถูกกำหนดให้เป็น 96px หน่วย CSS เช่น in, mm ขึ้นอยู่กับความหนาแน่นของพิกเซล
Maciej Krawczyk

yo siempre use px en vez de dp y va bien
Ivan Paredes

ใจเป่า: OOOO
dwjohnston

12

ใน CSS3 ไม่มีหน่วย CSS ที่ไม่ขึ้นกับอุปกรณ์อย่างแท้จริง ดูข้อมูลจำเพาะของ W3C ในความยาวแน่นอน โดยเฉพาะอย่างยิ่งหน่วยสัมบูรณ์อาจไม่ตรงกับการวัดทางกายภาพ

หากหน่วยกายภาพเป็นจริงตามวัตถุประสงค์คุณสามารถใช้คะแนน จุดใกล้พอที่จะ dps:

1 in = 72 pt
1 in = 160 dp

1 dp = 72 / 160 pt

หากคุณใช้ SCSS คุณสามารถเขียนฟังก์ชันเพื่อส่งคืนใน pts:

@function dp($_dp) {
  @return (72 / 160) * $_dp + pt;
}

และใช้มัน:

.shadow-2 {
  height: dp(2);
}

10

แล้วอินเทอร์เฟซที่ใช้หน่วย Rem ล่ะ?

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


คุณไม่จำเป็นต้องกำหนดขนาดตัวอักษร ขนาดตัวอักษรเริ่มต้นขององค์ประกอบรูทมักเป็นตัวเลือกที่สมเหตุสมผลสำหรับอุปกรณ์ที่อยู่ในมือ
Konstantin Schubert

1

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


0

สิ่งที่เกี่ยวกับการใช้ผสมระหว่าง vw (ความกว้างของหน้าจอสำหรับอุปกรณ์ใด ๆ ) และ em? ขนาดแบบอักษรมีการเปลี่ยนแปลงแบบไดนามิกขึ้นอยู่กับความกว้างของหน้าจออุปกรณ์ของคุณ ใช้ในไฟล์ CSS หลักของคุณกฎถัดไป:

font-size: calc(100vw * 10 / 375);

(ความกว้างสำหรับ iPhone 6/7/8 คือ 375px เปลี่ยนเป็น 320px (iPhone5) และอื่น ๆ )

ในทุกกรณีมันจะทำงานได้อย่างสมบูรณ์แบบ มีเพียงหนึ่งลบ หากเป้าหมายของคุณคือ "พิกเซลสมบูรณ์แบบ" คุณจะต้องใช้ตัวเลขจำนวนมากหลังจุด

ตัวอย่าง: เป้าหมายของคุณคือ font-size h5: 18px ในทุกหน้าจอ

จากนั้น "em" ที่สมบูรณ์แบบของคุณจะเป็น:

h5 { 
 font-size: 1.79904em;
 }

ไม่มีความสมบูรณ์ใช้ 18/10:

h5 { 
 font-size: 1.8em;
 }

ตาม Google Chrome คุณจะได้รับ 18.0096px;

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.