CSS ile dp (yoğunluktan bağımsız pikseller) birimleri nedir?


91

Android için, kullanıcılar UI öğeleri için dp (yoğunluktan bağımsız pikseller) ölçümlerinin kullanılmasını önermektedir ve 48dpbir düğme yüksekliği için kullanmak gibi mevcut kurallar vardır .

Bir web uygulaması üzerinde çalışıyorum ve UI tasarımı hakkında Android tasarım standartlarına uymadığını söyleyen çok eleştiri alıyorum. Açıkçası, uygulamam Android Holo teması yerine CSS ve HTML kullandığından farklı görünecek, ancak yine de mümkün olduğu kadar uyumlu hale getirmek istiyorum. Ancak CSS, yoğunluktan bağımsız ölçümlere izin vermez.

Uygulamamı farklı çözünürlükler ve piksel yoğunluklarında test ettiğimde iyi görünmüyor ve bazen orantısız olduğu için işlevsel bile değil. CSS, Android yerel geliştirme gibi dp birimlerine sahip değil, ancak bazı alternatiflerin ne olduğunu merak ediyordum.

Javascript kullanarak piksel yoğunluğunu bir şekilde alabilir ve her şeyi manuel olarak uygun şekilde ölçekleyebilir miyim? Tüm çözünürlüklerde / yoğunluklarda güzel görünen ve çalışan bir web uygulaması yapmanın en iyi yolu nedir?


2
CSS'ler Android'deki ile pxaynıdır dp. CSS3 spesifikasyonuna göre. birimler ve değerler üzerine .
omninonsense

Yanıtlar:


24

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

CSS'de bulunan en yakın birim, görüntü alanı-yüzde birimleridir.

  • vw - İlk içeren bloğun genişliğinin% 1'ine eşittir.
  • vh - İlk içeren bloğun yüksekliğinin% 1'ine eşittir.
  • vmin - vw veya vh'nin küçüğüne eşittir.
  • vmax - vw veya vh'nin büyük olanına eşittir.

Bu birimleri desteklemediğinin farkında olan tek mobil tarayıcı Opera'dır. http://caniuse.com/#feat=viewport-units


İOS'ta dağıtılırken bu birimler düzgün görüntüleniyor mu?
jmhostalet

@jmhostalet Hayır, görüntü alanı yüksekliği dinamik olduğundan tarayıcının bir tür sonsuz döngüye girmesine neden olur.
çaylak1024

6
bu cevap yanlış, çünkü pxcss'deki birim (sezgisel olarak) aslında zaten piksel yoğunluğundan bağımsızdır - "bir css pikseli bir piksel değildir", bununla ilgili pek çok makale var
ChaseMoskal

181

Şu anda kabul edilen cevaba katılmıyorum. Uber5001'in önerdiği gibi px, a sabit bir birimdir ve Android'e özgü çabalara benzer bir ruh halindedir dp.

Başına Malzeme spec :

CSS yazarken, dp veya sp belirtilen her yerde px kullanın. Dp'nin yalnızca Android için geliştirmede kullanılması gerekir.

bunlara ek olarak

Web için tasarım yaparken dp'yi px (piksel için) ile değiştirin.


25
Cevap budur. Malzeme spesifikasyonundan alıntı yapmak için +1.
Qix - MONICA

2
MDN'den: "Giriş birimi ekranda fiziksel bir inç değil, 96px'i temsil ediyor. Bu, gerçek ekran piksel yoğunluğu ne olursa olsun, 96 dpi olduğu varsayılır. Daha büyük piksel yoğunluğuna sahip cihazlarda 1 inç 1 fiziksel inçten daha küçük. Benzer şekilde mm, cm ve pt mutlak uzunluk değildir. " developer.mozilla.org/en/docs/Web/CSS/…
Maciej Krawczyk

1
CSS inç ve fiziksel inç 2 farklı şeydir. 1 CSS inç, ekran yoğunluğundan bağımsız olarak her zaman 96 pikseldir. Yani yalnızca 96 dpi bir monitörde CSS inç ve fiziksel inç eşit kabul edilebilir.
Maciej Krawczyk

1
@MaciejKrawczyk px ölçeğindeki eşitsizlikle ilgili çekişmenizin temelini anlıyorum. Bir pikselin aslında nasıl sabit bir birim olduğunu tartışabilirim ve dahil ettiğiniz ölçek bu temel gerçeği değiştirmez, ama bu bir kırmızı ringa balığı. Gerçek şu ki, Malzeme spesifikasyonu, dp'nin önerildiği her yerde px kullanmayı doğrudan belirtir. Brad'in Android tasarım standartlarını sorması üzerine, kanonik ve dolayısıyla doğru cevabı verdim.
Tohuw

2
Materyal tasarıma yapılan son güncelleme (Mayıs 2018), Pixel Density'yi daha derinlemesine açıklıyor material.io/design/layout/#pixel-density
Squiggle

18

Kullanın rem.

Kök öğenin yazı tipi boyutu ve diğer UI öğelerinin boyutu için çok iyi bir temel birimdir.

Aynı mutlak boyutu (santimetre cinsinden) kullanırsanız, metin ve diğer öğeler mobil cihazlarda çok büyük veya masaüstünde çok küçük olur.

Aynı miktarda piksel kullanılırsa, metin ve diğer öğeler mobil cihazlarda çok küçük veya masaüstünde çok büyük olacaktır.

remDiyor çünkü birim yerinde olduğunu "Hey, normal bir metin nasıl olması gerektiğini büyüktür." Diğer UI öğelerinin boyutunu buna dayandırmak oldukça makul bir seçimdir.


16

CSS3'te, web'de Android'in olmadığını söylemek daha doğru olabilir px. CSS3'ün özelliği şunupx söylüyor:

pikseller; 1px, 1in'in 1 / 96'sına eşittir

px gelecekte istediğiniz ölçüm olabilir.


2
Her şeyi bozmadan bu geçişin nasıl olacağını göremiyorum. Ve mesela mobil ve masaüstünde metin için aynı mutlak boyutu (cm cinsinden) kullanmak iyi bir paradigma değildir.
Konstantin Schubert

Ve 1in 96px olarak tanımlanır. İnç, mm gibi CSS birimleri piksel yoğunluğuna bağlıdır.
Maciej Krawczyk

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

Mind blown: OOOO
dwjohnston

12

CSS3'ten itibaren, gerçekten cihazdan bağımsız olan CSS birimleri yoktur. Mutlak uzunluklar için W3C spesifikasyonuna bakın . Özellikle, mutlak birimler fiziksel ölçümleriyle eşleşmeyebilir.

Fiziksel birimler amacına sadık olsaydı, puan gibi bir şey kullanabilirsiniz; noktalar dps'ye yeterince yakın:

1 in = 72 pt
1 in = 160 dp

1 dp = 72 / 160 pt

SCSS kullanıyorsanız, pts cinsinden dönmek için bir işlev yazabilirsiniz:

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

Ve onu kullanın:

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

10

Rem birimlerine dayalı bir arayüz ne olacak?

Konuyla ilgili onaylayacak kadar tecrübeli değilim, ancak görüntü alanı boyutuna göre kök öğeye bir yazı tipi boyutu uygulamak için biraz matematik yapabilirsiniz ve tüm arayüz buna göre ayarlanır. Bu şeyler henüz benim için biraz büyücülük.


Yazı tipi boyutunu ayarlamanıza gerek yoktur. Kök öğenin varsayılan yazı tipi boyutu, genellikle eldeki aygıt için oldukça makul bir seçimdir.
Konstantin Schubert

1

Neden puan kullanmıyorsunuz, cihazlar arasında tutarlı bir boyuttadır. Ve ekran boyutuna bağlıdır. Geleneksel yayıncılıktan geldiği için çoğu buna aşina değil.


0

Vw (herhangi bir cihaz için ekran genişliği) ve em arasında biraz karışım kullanmaya ne dersiniz? Burada yazı tipi boyutu, cihazınızın ekran genişliğine bağlı olarak dinamik olarak değişiyor. Sonraki kuralı ana CSS dosyanızda kullanın:

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

(iPhone 6/7/8 için genişlik 375 pikseldir, 320 piksele (iPhone5) vb. değiştirin)

Her durumda mükemmel çalışıyor. Sadece bir eksi var. Hedefiniz "piksel mükemmel" ise, o zaman noktadan sonra büyük sayılar kullanmanız gerekir.

Örnek: hedefiniz tüm ekranlarda yazı tipi boyutu h5: 18 pikseldir.

O zaman mükemmel "em" iniz:

h5 { 
 font-size: 1.79904em;
 }

mükemmellik olmadan 18/10 kullanın:

h5 { 
 font-size: 1.8em;
 }

Google Chrome'a ​​göre 18.0096px alırsınız;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.