Правильної відповіді немає, насправді є дві:
- Рекомендовано Google (наприклад, у курсі Udacity з матеріалів дизайну): Використовуйте просту конверсію, яка у багатьох випадках становить 1: 1, як у бібліотеці Polymer. Наприклад, для відображення сітківки неправильно , тому замість 1: 1 використовуйте коефіцієнт щільності, наведений у таблиці пристроїв, в офіційному Посібнику з проектування матеріалів ( таблиця із співвідношеннями та конкретними показниками для деяких популярних пристроїв ) та надайте відповідні запити @media для пороги та активи роздільної здатності , припускаючи, що 1dp дорівнює 1px для дисплея mdpi (160dpi / ppi) .
Примітка: загальна ідея: внизу сторінки: Масштабування зображення з деяким зображенням для візуалізації співвідношень для кількох порогів роздільної здатності екрана (зображення точки перерви)
- якщо ви хочете надмірно узгоджувати свою конструкцію для певних пристроїв , вам слід зробити ще кілька досліджень та розрахунків, а що важливіше - купу більше @media запитів, щоб підтримувати стільки пристроїв, скільки ви хочете, і забезпечити резервний запас (за допомогою метод, згаданий на 1-му місці) для тих, кого ти так не хвилюєш.
Ось більш детальна інформація для тих, хто хоче більше зануритися в цю тему, але це пояснення та логіка, вищезазначене є повною відповіддю :
Вся справа в тому, що "щільність пікселів", згідно з офіційним керівництвом Material Design (Макет> Одиниці та вимірювання), є:
кількість пікселів, що вміщуються в дюйм.
Отже, в основному щільність пікселів - це нова назва для значення ppi або оскільки багато людей не визнають це окремою річчю, значення dpi.
Визначення 1dp відповідно до цього ж посібника:
Дп дорівнює одному фізичному пікселю на екрані з щільністю 160 . Для обчислення dp:
dp = (ширина в пікселях * 160) / щільність екрана
При написанні CSS використовуйте px там, де вказано dp або sp. Dp потрібно використовувати лише при розробці для Android.
Основним принципом проектування матеріалів є підтримка послідовних фізичних розмірів на різних платформах, що спричиняє проблему роздільної здатності робочого столу, ppi (/ dpi) та пікселя css, і в цьому випадку слід дотримуватися обчислення dp так само, як у випадку з Android пристроїв, і це неправда, що більшість екранів мають 96ppi (це припущення, що важливо для CSS), значна частина з них має трохи вищий ppi, і якщо врахувати не тільки традиційний робочий стіл, але і звичайні ноутбуки або планшети, або такі «конвертовані», як Surface, необхідні для конвертації: вони зазвичай коливаються від 100-130 ppi, тож сказано, що я зараз використовую 127ppi:
100% = 160ppi -> фізична ширина 1 пікселя = 1dp -> прямокутник 100x100px = 100x100dp
79% = 127ppi -> фізична ширина 1 пікселя = ca. 0,8dp -> прямокутник 100x100px = 80x80dp
Хоча dp є чистою та новою одиницею лише для Android, вам слід зробити кілька розрахунків для адаптації макетів MD, які входять у dp. Якщо ви хочете мати більше уявлення про те, наскільки великим буде конкретний елемент у фізичному сенсі, найбільш корисним для цілей питання є ідеальне значення діапазону сенсорного розміру, наведене в інструкціях щодо матеріального дизайну для конкретних пристроїв ** Нижче значення dp фізичний. ** Значення dp змінюється, але фізичне залишається таким же.
Проблема, чому потрібно обчислювати одиниці, детальніше пояснюється в посібнику для Android API (Перетворення dp-одиниць у піксельні одиниці), і воно все ще стосується елементів, стилізованих за допомогою CSS:
У деяких випадках вам потрібно буде виразити розміри в dp, а потім перетворити їх> у пікселі.
Уявіть програму, в якій жест прокрутки чи перекидання розпізнається після переміщення пальцем користувача принаймні на 16 пікселів. На базовому екрані користувач повинен рухатись на 16 пікселів / 160 точок на дюйм, що дорівнює 1/10 дюйма (або 2,5 мм) до того, як жест розпізнається. На пристрої з дисплеєм високої щільності (240 dpi) користувач повинен рухатись на 16 пікселів / 240 dpi, що дорівнює 1/15 дюйма (або 1,7 мм). Відстань значно коротша, і програма, таким чином, видається більш чутливою до користувача.
Раніше згадане перетворення полімеру 1: 1, ймовірно, пов'язане з тим, що щільність 96dpi, або навіть та, яку я дав, знаходиться десь із низькою або навіть (як у випадку 96dpi) групою, навіть нижче її. Беручи до уваги, що значення dp не є css прийнятим, простіше припустити, що коефіцієнт щільності (0,75 - для низьких, 1,0 середній тощо) - це той, який слід використовувати для спрощення та кратного розміру підтримка екранів, яка показана в таблиці пристроїв для згаданого раніше проектування матеріалів. Він навіть згадується як один з найкращих практик у цитованому вище розділі посібника з API API. І ось де перетворення полімерів 1: 1 може бути хорошим, оскільки багато пристроїв мають коефіцієнт щільності на рівні 1.
Повернення до останньої дилеми: css px, якщо ви вирішили зануритися в тонкі нюанси різних пристроїв. Якщо ви не такий цікавий, просто дотримуйтесь коефіцієнт щільності з таблиці MD. Але якщо ви перфекціоніст, це суть пікселів і фізичних розмірів пікселів CSS має ідеальне (і досить просте пояснення) у Рекомендації кандидата W3C:
В абсолютних одиницях довжин фіксуються по відношенню один до одного і прикріплені до деякого фізичного виміру. Вони в основному корисні, коли відоме вихідне середовище. Абсолютні одиниці складаються з фізичних одиниць ('in', 'cm', 'mm', 'pt', 'pc', 'q') та одиниці візуального кута ('px') :
Для читання на відстані руки 1px таким чином відповідає приблизно 0,26 мм (1/96 дюйма).
Примітка. Зауважте, що це визначення піксельної одиниці та фізичних одиниць відрізняється від попередніх версій CSS. Зокрема, у попередніх версіях CSS піксельна одиниця та фізичні одиниці не були пов’язані між собою фіксованим співвідношенням: фізичні одиниці завжди були прив'язані до своїх фізичних вимірювань, тоді як піксельна одиниця буде змінюватись, щоб найбільш точно відповідати опорному пікселю. (Ця зміна була внесена через те, що занадто багато існуючого контенту покладається на припущення 96dpi, а порушення цього припущення порушує вміст.)
Це нове визначення px (з урахуванням фізичних розмірів) заповнює проміжок між CSS-пікселями та dps і дозволяє переконатися, що за допомогою простих обчислень вимірювання так зване вихідне середовище, яке в даному випадку є послідовним (у фізичному сенсі ) Макет MD , залишається однаковим на різних пристроях та платформах. Більше того, і Керівні принципи W3C, і MD використовують зображення пристроїв із низькою та високою роздільною здатністю, щоб проілюструвати основну ідею покриття пікселів / крапок - більше пікселів пристрою (крапок) потрібно для покриття області 1 пікселем на 1 пікс на пристрої з високою роздільною здатністю, ніж на низькій роздільній здатності, це означає, що широко використовувані в CSS запити для відображення сітківки - це те саме, що вам потрібно надати (але з більшою кількістю порогових значень) для Material Design та всіх мобільних пристроїв.
Підсумовуючи, або використовуйте коефіцієнт щільності MD, який найкраще рекомендує Google , або якщо ви чітко визначені, або ваш дизайн повинен бути абсолютно узгоджений щодо фізичних розмірів: використовуйте точне перетворення, використовуючи значення ppi / dpi для конкретних або загальних пристроїв (що досить божевільно), що ви можете легко перевірити на веб-інструменті Google resizer, оскільки вони в першу чергу поважають загальні пороги, запропоновані в MD Guide, та правила поділу щодо співвідношення та відповідних назв типів відображення (xlarge, medium та ін. ) реалізовані в ньому.
Тож дотримуйтесь співвідношень MD з таблиці, пам’ятаючи, що довідковий dp, розмір пікселя, дорівнює роздільній здатності mdpi (160), і ви будете хороші.
em/rem
s звідусіль, а потім просто масштабувати базовий розмір шрифту для кожної роздільної здатності.