Qu'est-ce que les unités dp (pixels indépendants de la densité) avec CSS?

90

Pour Android, les gens recommandent d'utiliser des mesures dp (pixels indépendants de la densité) pour les éléments de l'interface utilisateur, et il existe des conventions telles que l'utilisation 48dpde la hauteur d'un bouton, etc.

Je travaille sur une application Web et je reçois beaucoup de critiques sur la conception de l'interface utilisateur, disant qu'elle n'est pas conforme aux normes de conception Android. Évidemment, mon application aura un aspect différent car elle utilise CSS et HTML au lieu du thème Android Holo, mais j'aimerais toujours la rendre conforme autant que possible. Cependant, CSS n'autorise pas les mesures indépendantes de la densité.

Lorsque je teste mon application sur différentes résolutions et densités de pixels, elle n'a pas l'air bien et parfois, elle est disproportionnée, donc elle n'est même pas fonctionnelle. CSS n'a pas d'unités dp comme le développement natif Android, mais je me demandais quelles sont certaines alternatives.

Puis-je obtenir la densité de pixels en utilisant Javascript et mettre à l'échelle manuellement tout de manière appropriée? Quelle est la meilleure façon de créer une application Web qui ressemble et fonctionne bien sur toutes les résolutions / densités?

Brad
la source
2
Les CSS pxsont les mêmes que dpsur Android. Selon la spécification CSS3. sur les unités et les valeurs .
omninonsense

Réponses:

24

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

L'unité la plus proche disponible dans CSS sont les unités de pourcentage de la fenêtre.

  • vw - Égal à 1% de la largeur du bloc contenant initial.
  • vh - Égal à 1% de la hauteur du bloc contenant initial.
  • vmin - Égal au plus petit de vw ou vh.
  • vmax - Égal au plus grand de vw ou vh.

Le seul navigateur mobile qui ne prend pas en charge ces unités est Opera. http://caniuse.com/#feat=viewport-units

Cimmanon
la source
Ces unités s'affichent-elles correctement lors du déploiement dans iOS?
jmhostalet
@jmhostalet Non, cela amène le navigateur à entrer dans une sorte de boucle infinie puisque la hauteur de la fenêtre est dynamique.
rookie1024
6
cette réponse est incorrecte, car l' pxunité en css est (contre-intuitivement) en fait déjà indépendante de la densité de pixels - "un pixel css n'est pas un pixel", il y a beaucoup d'articles à ce sujet
ChaseMoskal
178

Je ne suis pas d'accord avec la réponse actuellement acceptée. Comme le suggère uber5001, a pxest une unité fixe, et dans un esprit similaire aux efforts de l'Android-specifc dp.

Par spécification du matériau :

Lorsque vous écrivez du CSS, utilisez px partout où dp ou sp est indiqué. Dp ne doit être utilisé que dans le développement pour Android.

aditionellement

Lors de la conception pour le Web, remplacez dp par px (pour pixel).

Tohuw
la source
25
Ceci est la réponse. +1 pour citer la spécification du matériau.
Qix - MONICA a été égaré le
2
De MDN: "L'unité ne représente pas un pouce physique à l'écran, mais représente 96 pixels. Cela signifie que quelle que soit la densité de pixels réelle de l'écran, elle est supposée être de 96 dpi. Sur les appareils avec une densité de pixels plus élevée, 1 pouce sera inférieur à 1 pouce physique. De même, mm, cm et pt ne sont pas des longueurs absolues. " developer.mozilla.org/en/docs/Web/CSS/…
Maciej Krawczyk
1
Le pouce CSS et le pouce physique sont deux choses différentes. 1 pouce CSS est toujours de 96 pixels, quelle que soit la densité de l'écran. Ainsi, ce n'est que sur un moniteur 96 dpi que le pouce CSS et le pouce physique peuvent être considérés comme égaux.
Maciej Krawczyk
1
@MaciejKrawczyk Je comprends la base de votre affirmation sur la disparité d'échelle sur px. Je pourrais discuter de la façon dont un px est en effet une unité fixe, et l'échelle que vous impliquez ne change pas cette vérité de base, mais c'est un hareng rouge. La réalité est que la spécification du matériau indique directement d'utiliser px partout où dp est suggéré. Étant donné que Brad a posé des questions sur les normes de conception Android, j'ai fourni la réponse canonique, et donc correcte.
Tohuw
2
La récente mise à jour (mai 2018) de la conception matérielle explique la densité de pixels de manière plus approfondie material.io/design/layout/#pixel-density
Squiggle
17

Utilisez rem.

C'est la taille de la police de l'élément racine et une très bonne unité de base pour la taille des autres éléments de l'interface utilisateur.

Si l'on utilisait la même taille absolue (en centimètres), le texte et les autres éléments seraient beaucoup trop gros sur mobile ou beaucoup trop petits sur bureau.

Si l'on utilisait la même quantité de pixels, le texte et les autres éléments seraient beaucoup trop petits sur mobile ou beaucoup trop gros sur bureau.

L' remunité est sur place car elle dit "Hé, voici la taille du texte normal." Baser la taille des autres éléments de l'interface utilisateur sur ce point est un choix assez raisonnable.

Konstantin Schubert
la source
16

Dans CSS3, il peut être plus précis de dire que le Web n'a pas d'Android px. La spécification pour CSS3px dit ceci:

pixels; 1px est égal à 1 / 96e de 1in

px pourrait être la mesure que vous souhaitez, à l'avenir.

uber5001
la source
2
Je ne vois pas comment cette transition se produira sans tout casser. Et utiliser la même taille absolue (en cm) pour, par exemple, du texte sur mobile et ordinateur de bureau n'est pas un bon paradigme.
Konstantin Schubert
Et 1in est défini comme 96px. Les unités CSS comme dans, mm dépendent de la densité de pixels.
Maciej Krawczyk
yo siempre use px en vez de dp y va bien
Ivan Paredes
Mind blown: OOOO
dwjohnston
12

À partir de CSS3, aucune unité CSS n'est vraiment indépendante du périphérique. Voir les spécifications du W3C sur les longueurs absolues . En particulier, les unités absolues peuvent ne pas correspondre à leurs mesures physiques.

Si les unités physiques étaient fidèles à leur objectif, vous pourriez utiliser quelque chose comme des points; les points sont suffisamment proches de dps:

1 in = 72 pt
1 in = 160 dp

1 dp = 72 / 160 pt

Si vous utilisez SCSS, vous pouvez écrire une fonction à renvoyer en pts:

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

Et utilisez-le:

.shadow-2 {
  height: dp(2);
}
Mihai Danila
la source
10

Qu'en est-il d'une interface basée sur des unités rem?

Je ne suis pas assez expérimenté en la matière pour confirmer, mais je pense que vous pourriez faire des calculs en fonction de la taille de la fenêtre pour appliquer une taille de police dans l'élément racine et toute l'interface s'ajusterait en conséquence. Ce truc est encore un peu sorcier pour moi.

Darlan Alves
la source
Vous n'avez pas besoin de définir la taille de la police. La taille de police par défaut de l'élément racine est généralement un choix assez raisonnable pour l'appareil concerné.
Konstantin Schubert
1

Pourquoi ne pas utiliser des points, c'est une taille cohérente sur tous les appareils. Et est relatif à la taille de l'écran. La plupart ne le connaissent pas car il provient de l'édition traditionnelle.

Franklin Mayfield
la source
0

Qu'en est-il d'utiliser un mélange entre vw (largeur d'écran pour n'importe quel appareil) et em? Ici, la taille de la police change dynamiquement, en fonction de la largeur de l'écran de votre appareil. Utilisez la règle suivante dans votre fichier CSS principal:

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

(la largeur pour l'iPhone 6/7/8 est de 375px, changez-la en 320px (iPhone5) et etc.)

Dans tous les cas, cela fonctionne parfaitement. Il n'y a qu'un seul moins. Si votre objectif est "pixel parfait", vous devez utiliser de grands nombres après le point.

Exemple: votre objectif est la taille de la police h5: 18px sur tous les écrans.

Alors votre "em" parfait sera:

h5 { 
 font-size: 1.79904em;
 }

sans perfection utiliser 18/10:

h5 { 
 font-size: 1.8em;
 }

Selon Google Chrome, vous obtenez 18,0096px;

Yuriy Ivanochko
la source