Я создаю новый веб-сайт и хочу, чтобы он был совместим с как можно большим количеством браузеров и настройками браузера. Я пытаюсь решить, какую единицу измерения я должен использовать для размеров моих шрифтов и элементов, но не могу найти окончательный ответ.
Мой вопрос: я должен использовать px
или rem
в моем CSS?
- До сих пор я знаю, что использование
px
не совместимо с пользователями, которые настраивают свой базовый размер шрифта в своем браузере. - Я проигнорировал
em
s, потому что они более трудны для поддержания, по сравнению сrem
s, поскольку они каскадные. - Некоторые говорят, что
rem
s не зависят от разрешения и поэтому более желательны. Но другие говорят, что большинство современных браузеров в любом случае одинаково масштабируют все элементы одинаково, поэтому использованиеpx
не является проблемой.
Я спрашиваю об этом, потому что есть много разных мнений относительно того, что является наиболее желательной мерой расстояния в CSS, и я не уверен, что лучше.
html
css
distance
units-of-measurement
TylerH
источник
источник
Ответы:
TL; DR: использовать
px
.Факты
Во-первых, очень важно знать, что согласно спецификации
px
единица CSS не равна одному физическому пикселю дисплея. Это всегда было правдой - даже в спецификации CSS 1 в 1996 году .CSS определяет эталонный пиксель , который измеряет размер пикселя на дисплее с разрешением 96 точек на дюйм. На дисплее с dpi, существенно отличающимся от 96 dpi (как на дисплеях Retina), пользовательский агент изменяет размеры
px
модуля так, чтобы его размер соответствовал размеру эталонного пикселя. Другими словами, именно это изменение масштаба является именно тем, почему 1 пиксель CSS равен 2 физическим пикселям дисплея Retina.Тем не менее, вплоть до 2010 года (и несмотря на ситуацию с мобильным зумом), они
px
почти всегда равнялись одному физическому пикселю, поскольку все широко доступные дисплеи имели разрешение около 96 точек на дюйм.Размеры, указанные в
em
s, относятся к родительскому элементу . Это приводит кem
«проблеме составления», когда вложенные элементы постепенно увеличиваются или уменьшаются. Например:Дает нам:
CSS3
rem
, который всегда относится только к корневомуhtml
элементу, теперь поддерживается в 96% всех используемых браузеров .Мнение
Я думаю, что все согласны с тем, что было бы хорошо, чтобы ваши страницы были удобными для всех и учитывали слабовидящих. Одно из таких соображений (но не единственное!) Позволяет пользователям сделать текст вашего сайта больше, чтобы его было легче читать.
Вначале единственный способ предоставить пользователям способ масштабирования размера текста - использование относительных единиц размера (например,
em
s). Это потому, что меню размера шрифта браузера просто изменило размер корневого шрифта. Таким образом, если вы указали размеры шрифтаpx
, они не будут масштабироваться при изменении параметра размера шрифта в браузере.Современные браузеры (и даже не очень современный IE7) все изменили метод масштабирования по умолчанию, чтобы просто увеличивать все, включая изображения и размеры блоков. По сути, они делают опорный пиксель больше или меньше.
Да, кто - то еще могут изменить свой браузер стили по умолчанию для настройки размера шрифта по умолчанию (эквивалент варианта размера шрифта старого стиля), но это очень эзотерический способ идти об этом , и я бы пари , никто - не делает. (В Chrome он скрыт под расширенными настройками, веб-контентом, размерами шрифта. В IE9 он еще более скрыт. Вы должны нажать Alt и перейти к View, Text Size.) Гораздо проще выбрать опцию Zoom в главное меню браузера (или используйте Ctrl+ +/ -/ колесо мыши).
1 - в пределах статистической погрешности, естественно
Если предположить, что большинство пользователей масштабируют страницы с помощью опции масштабирования, я нахожу относительные единицы большей частью неактуальными. Разработать вашу страницу намного проще, когда все указано в одном блоке (все изображения обрабатываются в пикселях), и вам не нужно беспокоиться о компоновке. ( «Мне сказали, что математики не будет» - нужно вычислить, к чему на самом деле работает 1.5em.)
Еще одна потенциальная проблема использования только относительных единиц для размеров шрифта состоит в том, что измененные пользователем шрифты могут нарушить предположения, которые делает ваш макет. Например, это может привести к тому, что текст обрезается или выполняется слишком долго. Если вы используете абсолютные единицы, вам не нужно беспокоиться о неожиданных размерах шрифта, которые могут нарушить ваш макет.
Поэтому мой ответ - использовать пиксельные единицы. Я использую
px
для всего. Конечно, ваша ситуация может отличаться, и если вы должны поддерживать IE6 (пусть боги RFC помилуют вас), вам всеem
равно придется использовать s.источник
Я хотел бы похвалить ответ Джош3736 за предоставление превосходного исторического контекста. Несмотря на то, что он четко сформулирован, ландшафт CSS изменился почти за пять лет, с тех пор как был задан этот вопрос. Когда был задан этот вопрос,
px
был правильный ответ, но сегодня это уже не так.тл; др: использовать
rem
Обзор объекта
Исторически
px
единицы обычно представляли собой один пиксель устройства. Для устройств с более высокой и более высокой плотностью пикселей это больше не распространяется на многие устройства, например на Retina Display от Apple.rem
единицы представляют собой г OOT эм размера. Этоfont-size
из всех совпадений:root
. В случае с HTML это<html>
элемент; для SVG это<svg>
элемент. По умолчаниюfont-size
в каждом браузере *16px
.На момент написания статьи
rem
поддерживается примерно 98% пользователей . Если вы беспокоитесь о других 2%, я напомню вам, что медиа-запросы также поддерживаются примерно 98% пользователей .По использованию
px
Большинство примеров CSS в Интернете используют
px
значения, потому что они были стандартом де-факто.pt
,in
А также ряд других подразделений могли быть использованы в теории, но они не обрабатывать небольшие значения хорошо , как вы бы быстро нужно прибегать к фракциям, которые были больше к типу, и труднее рассуждать о.Если вы хотите тонкую границу,
px
вы можете использовать1px
, сpt
чтобы использовать ее0.75pt
для получения стабильных результатов, а это не очень удобно.По использованию
rem
rem
Значение по умолчанию16px
не очень сильный аргумент для его использования. Письмо0.0625rem
это хуже , чем письма0.75pt
, так почему бы кто - нибудь использоватьrem
?Есть две части
rem
преимущество перед другими подразделениями.px
значениеrem
на то, что вы хотитеУважение предпочтений пользователя
Масштаб браузера сильно изменился за эти годы. Исторически многие браузеры только
font-size
расширялись, но это изменилось довольно быстро, когда веб-сайты поняли, что их прекрасные пиксельные дизайны ломаются всякий раз, когда кто-то увеличивает или уменьшает масштаб. На этом этапе браузеры масштабируют всю страницу, поэтому масштабирование на основе шрифта не входит в изображение.Уважение пожеланий пользователя не исключено. То, что браузер настроен
16px
по умолчанию, не означает, что ни один пользователь не может изменить свои предпочтения24px
или32px
исправить слабое зрение или плохую видимость (например, блики на экране). Если вы основываете свои единицы измеренияrem
, любой пользователь с более высоким размером шрифта увидит пропорционально больший сайт. Границы будут больше, отступы будут больше, поля будут больше, все будет плавно увеличиваться.Если вы основываете свои медиазапросы
rem
, вы также можете убедиться, что сайт, который видят ваши пользователи, соответствует их экрану. Пользователь сfont-size
набором для32px
на640px
широкий браузер, будет эффективно видеть ваш сайт , как показано пользователю в16px
на320px
широком браузере. Там нет абсолютно никаких потерь для RWD в использованииrem
.Изменение видимого
px
значенияПоскольку
rem
основан наfont-size
на:root
узле, если вы хотите , чтобы изменить то , что1rem
представляет собой, все , что вам нужно сделать , это изменитьfont-size
:Что бы вы ни делали, не установить
:root
элементfont-size
кpx
значению.Если установить
font-size
наhtml
к аpx
значению, вы сдуваетесь предпочтениями пользователя без пути , чтобы получить их обратно.Если вы хотите изменить кажущееся значение
rem
, используйте%
единицы измерения.Математика для этого достаточно проста.
Кажущийся размер шрифта
:root
равен16px
, но допустим, мы хотим изменить его на20px
. Все, что нам нужно сделать, это умножить16
на некоторое значение, чтобы получить20
.Настройте свое уравнение:
И решить для
X
:Делать все кратно
20
не так уж и здорово, но общее предложение - сделать видимый размерrem
равным10px
. Магическое число для того,10/16
что есть0.625
, или62.5%
.Сейчас проблема заключается в том , что используемое по умолчанию
font-size
для остальной части страницы набора слишком малы, но есть простое исправление для этого: Установитьfont-size
наbody
использованииrem
:Важно отметить, что с этой корректировкой очевидное значение
rem
-10px
это означает, что любое значение, в которое вы могли записать,px
может быть преобразовано непосредственноrem
путем увеличения десятичного разряда.превращается в
Выбранный вами размер шрифта зависит от вас, поэтому, если вы хотите, нет никаких причин, по которым вы не можете использовать:
и имеют
1rem
равные1px
.Таким образом, у вас есть простое решение, которое учитывает пожелания пользователя и позволяет избежать чрезмерного усложнения вашего CSS.
Подожди, так в чем подвох?
Я боялся, что ты спросишь это. Как бы мне ни хотелось притворяться, что
rem
это магия и решает все, есть еще некоторые вопросы, на которые стоит обратить внимание. На мой взгляд , ничего страшного , но я собираюсь их вызвать, так что вы не можете сказать, что я вас не предупреждал.Медиа-запросы (использование
em
)Одна из первых проблем, с которой вы столкнетесь,
rem
связана с медиа-запросами. Рассмотрим следующий код:Здесь значение
rem
меняется в зависимости от того, применяется ли медиа-запрос, а медиа-запрос зависит от значенияrem
, так что же происходит?rem
в запросах медиа использует начальное значениеfont-size
и не должны (смотрите раздел Safari) принимать во внимание любые изменения , которые могут произойти сfont-size
из:root
элемента. Другими словами, это очевидная ценность всегда16px
.Это немного раздражает, потому что это означает, что вам нужно выполнить некоторые дробные вычисления, но я обнаружил, что большинство распространенных медиа-запросов уже используют значения, кратные 16.
Кроме того, если вы используете препроцессор CSS, вы можете использовать миксины или переменные для управления медиазапросами, что полностью замаскирует проблему.
СафариК сожалению, в Safari есть известная ошибка, из-за которой изменение
:root
размера шрифта действительно изменяет вычисленныеrem
значения для диапазонов медиазапроса. Это может вызвать очень странное поведение, если размер шрифта:root
элемента изменяется в медиа-запросе. К счастью, решение простое: используйтеem
единицы для медиазапросов .Переключение контекста
Если вы переключаетесь между проектами между различными проектами, вполне возможно, что кажущийся размер шрифта
rem
будет иметь разные значения. В одном проекте вы можете использовать очевидный размер, а10px
в другом - очевидный размер1px
. Это может привести к путанице и вызвать проблемы.Моя единственная рекомендация здесь - придерживаться
62.5%
конвертированияrem
в видимый размер10px
, потому что в моем опыте это встречалось чаще.Общие CSS библиотеки
Если вы пишете CSS, который будет использоваться на сайте, который вы не контролируете, например, для встроенного виджета, на самом деле нет хорошего способа узнать, какой
rem
будет видимый размер . Если это так, не стесняйтесь продолжать использоватьpx
.Однако, если вы все еще хотите использовать
rem
, рассмотрите возможность выпуска Sass или LESS версии таблицы стилей с переменной, чтобы переопределить масштабирование для видимого размераrem
.* Я не хочу отговаривать кого-либо от использования
rem
, но я не смог официально подтвердить, что каждый браузер использует16px
по умолчанию. Видите ли, есть много браузеров, и для одного браузера было бы не так уж и сложно отклониться, скажем,15px
или18px
. Однако при тестировании я не видел ни одного примера, в котором браузер, использующий настройки по умолчанию, в системе, использующей настройки по умолчанию, имел какое-либо значение, кроме16px
. Если вы найдете такой пример, пожалуйста, поделитесь им со мной.источник
matrix()
javascript, который используют значения для матричного переводаpx
(поправьте меня, если я ошибаюсь), и я так запутался с ним ,getComputedStyle()
но результат всегда на пикселе, поэтому я должен разделить результат наrem
значение (например, 16). CMIIWrem
значение, если у вас уже есть правильноеpx
значение, нет необходимости переключаться наrem
единицы для вещей, которые уже вычислены для данного контекста.В данной статье описывается довольно хорошо плюсы и минусы
px
,em
иrem
.В конце концов автор приходит к выводу, что лучший метод, вероятно, состоит в том, чтобы использовать и то,
px
и другоеrem
,px
сначала объявив для старых браузеров, и повторно объявивrem
для новых браузеров:источник
px
. Что касается юнитов для элементов, то придерживатьсяpx
будет лучше, так как вы обычно хотите точно определить размер элементов.px
- включить изменение размера. Теперь, если мы используемrem
, мы все равно должны предоставитьpx
запасной вариант (в старых браузерах). По сути, это означает, чтоpx
изменение размера поддержки лучше, чемrem
. Новые браузеры поддерживаютpx
изменение размера и для старых браузеров любой способ, которым мы будем использовать запасной вариантpx
. Теперь, основываясь на свете этого вывода, мне очень интересно узнать, зачем использоватьrem
? Если я могу увидеть свет в конце туннеля.В качестве рефлексивного ответа я бы порекомендовал использовать rem, поскольку он позволяет при необходимости изменять «уровень масштабирования» всего документа сразу. В некоторых случаях, когда вы хотите, чтобы размер был относительно родительского элемента, используйте em.
Но поддержка rem нечеткая, IE8 нуждается в полифилле, а Webkit демонстрирует ошибку. Кроме того, вычисление субпикселя может привести к тому, что такие вещи, как строки в один пиксель, иногда исчезают. Средство защиты заключается в кодировании в пикселях для таких очень маленьких элементов. Это вносит еще большую сложность.
Итак, в целом, спросите себя, стоит ли оно того - насколько важно и вероятно, что вы изменили «уровень масштабирования» всего документа в CSS?
В некоторых случаях это да, в некоторых случаях это будет нет.
Таким образом, это зависит от ваших потребностей, и вам нужно взвесить все за и против, потому что использование rem и em вносит некоторые дополнительные соображения по сравнению с «обычным» основанным на пикселях рабочим процессом.
Имейте в виду, что легко переключить (или, скорее, преобразовать) ваш CSS из px в rem (JavaScript - это другая история), потому что следующие два блока кода CSS будут давать тот же результат:
источник
Да, REM и PX являются относительными, но другие ответы предлагают использовать REM вместо PX, я также хотел бы подтвердить это на примере доступности.
Когда пользователь устанавливает другой размер шрифта в браузере, REM автоматически масштабирует элементы веб-страницы, такие как шрифты, изображения и т. Д., Чего не происходит с PX.
В приведенном ниже gif текст левой части задается с использованием REM-единицы размера шрифта, а шрифт правой стороны задается единицей PX.
По умолчанию размер шрифта веб-страницы составляет 16px, что равно 1 rem (только для html-страницы по умолчанию
html{font-size:100%}
, т. Е.), Поэтому 1,25rem равно 20px.PS: кто еще использует REM? CSS Frameworks! как Bootstrap 4, Bulma CSS и т. д., так что лучше ужиться с этим.
источник
Ответ Джоша 3736 хороший, но для контрапункта через 3 года:
Я рекомендую использовать
rem
единицы измерения для шрифтов, хотя бы потому, что вам , разработчику, легче менять размеры. Это правда, что пользователи очень редко меняют размер шрифта по умолчанию в своих браузерах, и что современное масштабирование браузера будет увеличиватьpx
единицы измерения. Но что если ваш начальник придет к вам и скажет: «Не увеличивайте изображения или значки, а делайте все шрифты больше». Гораздо проще просто изменить размер корневого шрифта и позволить масштабировать все остальные шрифты относительно этого, а затем изменитьpx
размеры в десятках или сотнях правил CSS.Я думаю, что все еще имеет смысл использовать
px
единицы для некоторых изображений или для определенных элементов макета, которые всегда должны быть одинакового размера, независимо от масштаба дизайна.Caniuse.com, возможно, сказал, что только 75% браузеров, когда josh3736 опубликовал свой ответ в 2012 году, но по состоянию на 27 марта заявили, что поддерживают 93,78% . Только IE8 не поддерживает его среди браузеров, которые они отслеживают.
источник
Only IE8 doesn't support it among the browsers they track.
А? На связанной странице указано, что «IE9 и IE10 не поддерживают rem-единицы, когда они используются в свойстве сокращенного шрифта или при использовании псевдоэлементов. IE9, 10 и 11 не поддерживают rem-единицы при использовании в свойстве line-height при использовании в псевдоэлементах: before и: after. Границы с размером rem исчезают при уменьшении страницы в Chrome. Не работает в браузере Samsung Note II Android 4.3 и Samsung Galaxy Tab 2 в Android 4.2. Chrome 31-34 и Android на базе Chrome (например, 4.4) имеют ошибку размера шрифта, возникающую, когда корневой элемент имеет размер в процентах ».as of March 27 they claim 93.78% support.
На момент написания этого комментария, caniuse показывает только 91,79% полной поддержки браузера. Глядя на ваш процент, я почти уверен, что вы также включили поддержку глючного браузера (в настоящее время 2,8%, что может быть истолковано как оптимистичное покрытие в 94,6%, но факт в том, что эти 2,8% идут с ошибками, неполным или даже полным). отказ в поддержке… как отмечалось в моем предыдущем комментарии: каждая ошибка является результатом разных версий браузера и комбинаций операционной системы.) Вы можете исправить свой ответ соответствующим образом…Я обнаружил, что лучший способ запрограммировать размеры шрифтов на сайте - это определить базовый размер шрифта для,
body
а затем использовать em (или rem) для каждого другого, которыйfont-size
я объявляю после этого. Полагаю, это личное предпочтение, но оно хорошо мне помогло, а также позволило легко внедрить более отзывчивый дизайн .Что касается использования модулей rem, я думаю, что было бы хорошо найти баланс между прогрессивностью в вашем коде, но также предлагать поддержку старых браузеров. Перейдите по этой ссылке о поддержке браузером блоков rem , которые должны помочь вам в вашем решении.
источник
body
размер шрифта, и все изменится вместе с ним.pt
похоже на тоrem
, что он является относительно фиксированным, но почти всегда независимым от DPI, даже если несовместимые браузеры работаютpx
в зависимости от устройства.rem
зависит от размера шрифта корневого элемента, но вы можете использовать что-то вроде Sass / Compass, чтобы сделать это автоматическиpt
.Если у вас было это:
тогда
1rem
всегда будет12pt
.rem
иem
являются такими же независимыми от устройства, как и элементы, на которые они опираются; некоторые браузеры не ведут себя в соответствии со спецификацией и трактуютpx
буквально. Даже в старые времена Интернета 1 точка всегда считалась 1/72 дюйма, то есть 72 дюйма на дюйм.Если у вас старый, несовместимый браузер, и у вас есть:
затем
1rem
будет зависеть от устройства. Для элементов, которые наследуются отhtml
по умолчанию,1em
также будет зависеть от устройства.12pt
будет надежным гарантированным независимым от устройства эквивалентом:,16px / 96px * 72pt = 12pt
где96px = 72pt = 1in
.Это может быть довольно сложно сделать математику, если вы хотите придерживаться определенных единиц. Например
.75em of html = .75rem = 9pt
, и.66em of .75em of html = .5rem = 6pt
. Хорошее правило:pt
для абсолютных размеров. Если вам действительно нужно, чтобы это было динамически относительно корневого элемента, вы слишком много просите о CSS; вам нужен язык, который компилируется в CSS, например, Sass / SCSS.em
для относительных размеров. Очень удобно иметь возможность сказать: «Я хочу, чтобы поле слева было около максимальной ширины буквы» или «Сделайте текст этого элемента чуть больше, чем его окружение».<h1>
является хорошим элементом для использования размера шрифта в ems, поскольку он может появляться в разных местах, но всегда должен быть больше, чем текст рядом. Таким образом, вам не нужно иметь отдельный размер шрифта для каждого применяемого классаh1
: размер шрифта будет адаптироваться автоматически.px
для очень маленьких размеров. В очень маленьких размерах,pt
в некоторых браузерах с разрешением 96 точек на дюйм может получиться размытым,pt
иpx
они не совсем совпадают. Если вы просто хотите создать тонкую однопиксельную рамку, скажем так. Если у вас дисплей с высоким разрешением, это не будет очевидно для вас во время тестирования, поэтому обязательно протестируйте его на обычном дисплее с 96 DPI.источник
Половина (но только половина) язвительного ответа (другая половина - горькое презрение к реальности бюрократии):
Используйте VH
Все всегда соответствует размеру окна браузера.
Всегда позволяйте прокручивать вниз, а не в сторону.
Установите ширину тела равной 50vh, и ничто не всплывает и не вырывается из родительского элемента div. И стиль только с использованием таблиц, так что все жестко удерживается на месте, как и ожидалось. Включите функцию javascript, чтобы отменить любое действие ctrl +/-, которое может выполнять пользователь.
Все будут ненавидеть вас, кроме людей, которые говорят вам, чтобы все соответствовало их макету, и они будут в восторге. И все знают, что их мнение является единственным, которое имеет значение.
источник
Да. Вернее нет.
Я имею в виду, это не имеет значения. Используйте тот, который имеет смысл для вашего конкретного проекта. PX и EM или оба одинаково действительны, но будут вести себя немного по-разному в зависимости от общей архитектуры CSS вашей страницы.
ОБНОВИТЬ:
Чтобы уточнить, я утверждаю, что обычно не имеет значения, какой вы используете. Время от времени, вы можете специально хотеть выбрать один по другому. ЭМ хороши, если вы можете начать с нуля и захотите использовать базовый размер шрифта и сделать все относительно этого.
PX часто нужны, когда вы перестраиваете редизайн на существующую кодовую базу и нуждаетесь в специфике px, чтобы избежать проблем с вложением.
источник
Это путь вперед, не только для шрифтов, но вы также можете использовать их с полями, толщиной линии и прочим, почему?
Проще говоря, единственные, которые масштабируются в унисон с клавишами alt + и alt- в браузере для масштабирования.
Другие измерения масштабируются, но не так чисто, как em.
Кроме того, если вам нужно лучшее масштабирование, также конвертируйте свою графику в векторную SVG, где это возможно, так как они также будут чисто масштабироваться с коэффициентом масштабирования в браузерах.
источник
EM - ЕДИНСТВЕННАЯ вещь, которая масштабируется для медиа-запросов, которые обрабатывают +/- масштабирование, что делают люди постоянно, а не только слепые люди. Вот еще один очень хорошо написано профессиональная демонстрация того, почему это важно.
Кстати, именно поэтому Zurb Foundation использует ems , в то время как нижняя Bootstrap 3 по-прежнему использует пиксели.
источник