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