Đơn vị dp (pixel độc lập với mật độ) với CSS là gì?


90

Đối với Android, mọi người khuyên bạn nên sử dụng các phép đo dp (pixel độc lập với mật độ) cho các phần tử giao diện người dùng và có các quy ước tồn tại như sử dụng 48dpcho chiều cao của nút, v.v.

Tôi đang làm việc trên một ứng dụng web và tôi nhận được rất nhiều lời chỉ trích về thiết kế giao diện người dùng nói rằng nó không phù hợp với các tiêu chuẩn thiết kế Android. Rõ ràng, ứng dụng của tôi sẽ trông khác vì nó đang sử dụng CSS và HTML thay vì chủ đề Android Holo, nhưng tôi vẫn muốn làm cho nó phù hợp nhất có thể. Tuy nhiên CSS không cho phép các phép đo độc lập về mật độ.

Khi tôi kiểm tra ứng dụng của mình trên các độ phân giải và mật độ pixel khác nhau, nó trông không đẹp và đôi khi, nó không đúng tỷ lệ nên thậm chí không hoạt động được. CSS không có các đơn vị dp như Android native development, nhưng tôi đã tự hỏi một số lựa chọn thay thế là gì.

Bằng cách nào đó, tôi có thể lấy mật độ pixel bằng cách sử dụng Javascript và chia tỷ lệ mọi thứ theo cách thủ công không? Cách tốt nhất để tạo một ứng dụng web có giao diện và hoạt động tốt trên tất cả các độ phân giải / mật độ là gì?


Câu trả lời:


24

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

Đơn vị gần nhất có sẵn trong CSS là đơn vị phần trăm khung nhìn.

  • vw - Bằng 1% chiều rộng của khối chứa ban đầu.
  • vh - Bằng 1% chiều cao của khối chứa ban đầu.
  • vmin - Bằng nhỏ hơn của vw hoặc vh.
  • vmax - Bằng lớn hơn của vw hoặc vh.

Trình duyệt di động duy nhất cần biết không hỗ trợ các đơn vị này là Opera. http://caniuse.com/#feat=viewport-units


Các đơn vị đó có được hiển thị đúng khi triển khai trong iOS không?
jmhostalet

@jmhostalet Không, nó khiến trình duyệt đi vào một loại vòng lặp vô hạn vì chiều cao khung nhìn là động.
tân binh1024

6
câu trả lời này không chính xác, bởi vì pxđơn vị trong css là (phản trực giác) thực sự đã độc lập với mật độ pixel - "pixel css không phải là pixel", có rất nhiều bài báo về điều này
ChaseMoskal 16/1218

178

Tôi không đồng ý với câu trả lời hiện đang được chấp nhận. Như uber5001 gợi ý, a pxlà một đơn vị cố định và theo tinh thần tương tự như những nỗ lực của Android-specifc dp.

Per Material's spec :

Khi viết CSS, hãy sử dụng px ở bất cứ nơi nào có ghi dp hoặc sp. Dp chỉ cần được sử dụng để phát triển cho Android.

Ngoài ra

Khi thiết kế cho web, hãy thay thế dp bằng px (cho pixel).


25
Đây là câu trả lời. +1 để trích dẫn thông số Vật liệu.
Qix - MONICA ĐƯỢC HỖN HỢP THÁNG

2
Từ MDN: "Đơn vị in không đại diện cho một inch vật lý trên màn hình, nhưng đại diện cho 96px. Điều đó có nghĩa là bất kể mật độ pixel trên màn hình thực là gì, nó được giả định là 96dpi. Trên các thiết bị có mật độ pixel lớn hơn, 1in sẽ là nhỏ hơn 1 inch vật lý. Tương tự như vậy mm, cm và pt không phải là độ dài tuyệt đối. " developer.mozilla.org/en/docs/Web/CSS/…
Maciej Krawczyk

1
CSS inch và inch vật lý là 2 thứ khác nhau. 1 inch CSS luôn là 96px, bất kể mật độ màn hình. Vì vậy, chỉ trên màn hình 96 dpi mới có thể coi là inch CSS và inch vật lý bằng nhau.
Maciej Krawczyk

1
@MaciejKrawczyk Tôi hiểu cơ sở tranh cãi của bạn về sự chênh lệch tỷ lệ trên px. Tôi có thể tranh luận về việc px thực sự là một đơn vị cố định như thế nào và tỷ lệ bạn liên quan không thay đổi sự thật cơ sở này, nhưng đó là một con cá trích đỏ. Thực tế là thông số Vật liệu trực tiếp tuyên bố sử dụng px bất cứ nơi nào dp được đề xuất. Khi Brad hỏi về các tiêu chuẩn thiết kế Android, tôi đã cung cấp câu trả lời chuẩn và do đó chính xác.
Tohuw

2
Bản cập nhật gần đây (tháng 5 năm 2018) đối với thiết kế material design giải thích Mật độ điểm ảnh sâu hơn về material.io/design/layout/#pixel-density
Squiggle

17

Sử dụng rem.

Đây là kích thước phông chữ của phần tử gốc và một đơn vị cơ sở rất tốt cho kích thước của các phần tử giao diện người dùng khác.

Nếu một người sử dụng cùng một kích thước tuyệt đối (tính bằng cm), văn bản và các yếu tố khác sẽ quá lớn trên thiết bị di động hoặc quá nhỏ trên máy tính để bàn.

Nếu một người sử dụng cùng một lượng pixel, văn bản và các yếu tố khác sẽ quá nhỏ trên thiết bị di động hoặc quá lớn trên máy tính để bàn.

Các remđơn vị là tại chỗ vì nó nói "Này, đây là lớn như thế nào bằng cách thông thường nên được." Dựa trên kích thước của các phần tử giao diện người dùng khác trên đây là một lựa chọn khá hợp lý.


16

Trong CSS3, có thể chính xác hơn khi nói rằng web không có Android px. Thông số cho CSS3'spx cho biết điều này:

điểm ảnh; 1px bằng 1/96 của 1in

px có thể là phép đo bạn muốn, trong tương lai.


2
Tôi không thể thấy quá trình chuyển đổi này sẽ diễn ra như thế nào nếu không phá vỡ mọi thứ. Và việc sử dụng cùng một kích thước tuyệt đối (tính bằng cm) cho văn bản trên thiết bị di động và máy tính để bàn không phải là một mô hình tốt.
Konstantin Schubert,

Và 1in được định nghĩa là 96px. Các đơn vị CSS như in, mm phụ thuộc vào mật độ pixel.
Maciej Krawczyk

yo Siempre sử dụng px en vez de dp y va bien
Ivan Paredes

Tâm trí thổi bùng: OOOO
dwjohnston 21/09/18

12

Kể từ CSS3, không có đơn vị CSS nào thực sự độc lập với thiết bị. Xem thông số kỹ thuật W3C về độ dài tuyệt đối . Đặc biệt, các đơn vị tuyệt đối có thể không khớp với các phép đo vật lý của chúng.

Nếu các đơn vị vật lý đúng với mục đích của chúng, bạn có thể sử dụng một số thứ như điểm; điểm đủ gần với dps:

1 in = 72 pt
1 in = 160 dp

1 dp = 72 / 160 pt

Nếu bạn sử dụng SCSS, bạn có thể viết một hàm để trả về trong pts:

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

Và sử dụng nó:

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

10

Điều gì về một giao diện dựa trên các đơn vị rem?

Tôi không đủ kinh nghiệm về vấn đề này để xác nhận, nhưng tôi nghĩ bạn có thể thực hiện một số phép toán dựa trên kích thước khung nhìn để áp dụng kích thước phông chữ trong phần tử gốc và toàn bộ giao diện sẽ điều chỉnh cho phù hợp. Công cụ này là một chút phù thủy đối với tôi.


Bạn không cần đặt kích thước phông chữ. Kích thước phông chữ mặc định của phần tử gốc thường là một lựa chọn khá hợp lý cho thiết bị trong tầm tay.
Konstantin Schubert

1

Tại sao không sử dụng điểm, nó là một kích thước nhất quán trên các thiết bị. Và có liên quan đến kích thước màn hình. Hầu hết không quen thuộc với nó vì nó xuất phát từ xuất bản truyền thống.


0

Còn về việc sử dụng một số kết hợp giữa vw (chiều rộng màn hình cho bất kỳ thiết bị nào) và em? Ở đây, kích thước phông chữ sẽ tự động thay đổi, tùy thuộc vào chiều rộng màn hình thiết bị của bạn. Sử dụng trong tệp CSS chính của bạn quy tắc tiếp theo:

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

(chiều rộng cho iPhone 6/7/8 là 375px, thay đổi thành 320px (iPhone5) và v.v.)

Trong mọi trường hợp, nó hoạt động hoàn hảo. Chỉ có một điểm trừ. Nếu mục tiêu của bạn là "pixel hoàn hảo", thì bạn cần sử dụng các số lớn sau dấu chấm.

Ví dụ: mục tiêu của bạn là cỡ chữ h5: 18px trên tất cả các màn hình.

Khi đó "em" hoàn hảo của bạn sẽ là:

h5 { 
 font-size: 1.79904em;
 }

không có sự hoàn hảo sử dụng 18/10:

h5 { 
 font-size: 1.8em;
 }

Theo Google Chrome, bạn nhận được 18,0096px;

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.