Должен ли я использовать единицы измерения px или rem в моем CSS?
Я разрабатываю новый веб-сайт, и я хочу, чтобы он был совместим с как можно большим количеством браузеров и настроек браузера, насколько это возможно. Я пытаюсь решить, какую единицу измерения я должен использовать для размеров моих шрифтов и элементов, но не могу найти окончательного ответа.
мой вопрос: Должен ли я использовать px или rem в моем CSS?
- до сих пор я знаю, что с помощью
pxне совместим с пользователями, которые настраивают свой базовый размер шрифта в своем браузер. - я пренебрег
ems, потому что они больше хлопот в обслуживании, по сравнению сrems, как они каскадируют. - некоторые говорят, что
rems не зависят от разрешения и поэтому более желательны. Но другие говорят, что большинство современных браузеров масштабируют все элементы одинаково в любом случае, поэтому с помощьюpx- Это не проблема.
Я спрашиваю об этом, потому что есть много разных мнений о том, что является наиболее желательной мерой расстояния в CSS и я не уверен, что лучше.
11 ответов:
TL; DR: использовать
px.Факты
во-первых, это чрезвычайно важно знать, что согласно спецификации, CSS
pxunit не равный один физический пиксел дисплея. Это имеет всегда было правдой – даже в 1996 CSS 1 spec.CSS определяет ссылка пикселей, который измеряет размер пикселя на дисплее 96 dpi. На дисплей, который имеет dpi существенно отличается от 96dpi (например, Retina displays), агент пользователя масштабирует
pxединица измерения, чтобы ее размер соответствовал размеру опорного пикселя. Другими словами, это масштабирование-именно то, почему 1 пиксель CSS равен 2 физическим пикселям дисплея Retina.тем не менее, вплоть до 2010 года (и несмотря на ситуацию с мобильным зумом),
pxпочти всегда равен одному физическому пикселю, потому что все широко доступные дисплеи были вокруг 96 точек на дюйм.размеры, указанные в
ems относительны к родительскому элементу. Это приводит кem"проблема усугубления", где вложенные элементы становятся все больше или меньше. Например:body { font-size:20px; } div { font-size:0.5em; }дает нам:
<body> - 20px <div> - 10px <div> - 5px <div> - 2.5px <div> - 1.25pxтехнология CSS3
rem, который всегда относится только к корнюhtmlэлемент, слишком Новый, чтобы полагаться. По состоянию на июль 2012 года около 75% всех браузеров в используйте поддержкаrem.Мнение
Я думаю, что все согласны с тем, что хорошо создавать свои страницы, чтобы быть любезным для всех, и принимать во внимание слабовидящих. Одно такое соображение (но не единственное!) позволяет пользователям сделать текст вашего сайта больше, так что это легче читать.
в начале, единственный способ предоставить пользователям возможность масштабировать размер текста с помощью относительной размер единиц измерения (например,
ems). Это связано с тем, что меню размера шрифта браузера просто изменило размер корневого шрифта. Таким образом, если вы указали размеры шрифта вpx, они не будут масштабироваться при изменении параметра размера шрифта браузера.современные браузеры (и даже не очень современный IE7) все изменили метод масштабирования по умолчанию, чтобы просто масштабировать все, включая изображения и размеры коробки. По существу, они делают опорный пиксель больше или меньше.
Да, кто-то все еще может изменить свою таблицу стилей браузера по умолчанию, чтобы настроить размер шрифта по умолчанию (эквивалент опции размера шрифта старого стиля), но это очень эзотерический способ сделать это, и я бы поставил nobody1 это делает. (В Chrome он похоронен под расширенными настройками, веб-контентом, размерами шрифтов. В IE9 это еще более скрыто. Вы должны нажать Alt и перейти к просмотру, размер текста.) Гораздо проще просто выбрать опцию масштабирования в главном меню браузера (или использовать Ctrl++/ -/колесо мыши).
1 - в пределах статистической погрешности, естественно
если мы предполагаем, что большинство пользователей масштабируют страницы с помощью опции масштабирования, я нахожу относительные единицы в основном неуместными. Гораздо проще разработать свою страницу, когда все указано в одном блоке (все изображения обрабатываются в пикселях), и вам не нужно беспокоиться о компаундировании. ("мне сказали, что не будет математика" - там дело с тем, чтобы вычислить, что 1.5 em на самом деле работает.)
еще одна потенциальная проблема использования только относительных единиц для размеров шрифтов заключается в том, что шрифты с пользовательским размером могут нарушать предположения, которые делает ваш макет. Например, это может привести к тому, что текст будет обрезан или работать слишком долго. Если вы используете абсолютные единицы, вам не нужно беспокоиться о неожиданных размерах шрифта от нарушения вашего макета.
поэтому мой ответ - использовать пиксельные единицы. Я использую
pxза все. Конечно, ваша ситуация может измениться, и если вы должны поддерживать IE6 (пусть боги RFC помилуют вас), вам придется использоватьems в любом случае.
хотелось бы похвалить josh3736 ответ для обеспечения некоторого превосходного исторического контекста. Хотя он хорошо сформулирован, ландшафт CSS изменился почти за пять лет с тех пор, как был задан этот вопрос. Когда этот вопрос был задан,
pxбыл правильный ответ, но сегодня это уже не так.
tl; dr: использовать
remединица Обзор
исторически
pxединицы измерения обычно представляют один пиксель устройства. С устройствами, имеющими все более высокую плотность пикселей, это больше не относится ко многим устройствам, например, с дисплеем Retina от Apple.
remблоки представляют собой root ЭМ размер. Это же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, но это изменилось довольно быстро, когда веб-сайты поняли, что их красивые пиксельные идеальные проекты ломались каждый раз, когда кто-то увеличивал или уменьшал масштаб. На этом этапе браузеры масштабируют всю страницу, поэтому масштабирование на основе шрифтов не отображается.уважение пожеланий пользователя не выходит за рамки картины. Просто потому, что браузер установлен в
16pxby по умолчанию, это не означает, что ни один пользователь не может изменить свои предпочтения на24pxили32pxчтобы исправить плохое зрение. Если вы основываете свои подразделения отrem, любой пользователь с более высоким размером шрифта увидит пропорционально больший сайт. Границы будут больше, заполнение будет больше, поля будут больше, все будет увеличиваться плавно.если вы основываете свои медиа-запросы о
rem, вы также можете убедиться, что сайт, который видят ваши пользователи, соответствует их экрану. Пользователь сfont-sizeнабор в32pxна640pxширокий браузер, будет эффективно видеть ваш сайт, как показано пользователю на16pxна320pxширокий браузера. Там нет абсолютно никаких потерь для RWD в использованииrem.Изменение Кажущегося
pxстоимостью, потому что
remна основеfont-sizeна:rootузел, если вы хотите изменить то, что1remпредставляет, все, что вам нужно сделать, это изменитьfont-size::root { font-size: 100px; } body { font-size: 1rem; }<p>Don't ever actually do this, please</p>что бы вы ни делали, не устанавливайте
:rootэлементfont-sizeдоpxзначение.если вы выберите
font-sizeonhtmlдоpxзначение, вы сдули предпочтения пользователя без возможности их вернуть.если вы хотите изменить видимого стоимостью
remиспользуйте%единицы.математика для этого достаточно прямолинейна.
видимый размер шрифта
:rootи16px, но допустим, мы хотим изменить его на20px. Все, что нам нужно сделать, это умножить16по некоторому значению получить20.настройка уравнение:
16 * X = 20и решить для
X:X = 20 / 16 X = 1.25 X = 125%:root { font-size: 125%; }<p>If you're using the default font-size, I'm 20px tall.</p>делать все в кратных
20не все это здорово, но общее предложение состоит в том, чтобы сделать видимый размерremравна10px. Магическое число для этого10/16что это0.625или62.5%.:root { font-size: 62.5%; }<p>If you're using the default font-size, I'm 10px tall.</p>проблема теперь в том, что ваш по умолчанию
font-sizeдля остальной части страницы установлен слишком маленький, но есть простое исправление для этого: установитеfont-sizeonbodyиспользуяrem::root { font-size: 62.5%; } body { font-size: 1.6rem; }<p>I'm the default font-size</p>это важно отметить, что при такой корректировке видимое значение
remи10pxчто означает любое значение, вы могли бы написать вpxможет быть преобразован непосредственно вremнатыкаясь на десятичный знак.padding: 20px;превращается в
padding: 2rem;очевидный размер шрифта, который вы выбираете, зависит от вас, поэтому, если вы хотите, нет причин, по которым вы не можете использовать:
:root { font-size: 6.25%; } body { font-size: 16rem; }и
1remравной1px.так что у вас есть это, простое решение, чтобы уважать пожелания пользователей, а также избежать чрезмерного усложнения вашего CSS.
подождите, так в чем же подвох?
я боялся, что ты спросишь об этом. Как бы мне ни хотелось притвориться, что
remмагия и решает-все-все, есть еще некоторые вопросы Примечание. Ничего не нарушаяпо-моему, но я собираюсь вызвать их, так что вы не можете сказать, что я не предупреждал вас.Медиа-Запросы
один из первые проблемы, с которыми вы столкнетесь с
remвключает в себя медиа-запросы. Рассмотрим следующий код::root { font-size: 1000px; } @media (min-width: 1rem) { :root { font-size: 1px; } }здесь значение
remизменения в зависимости от того, применяется ли медиа-запрос, и медиа-запрос зависит от значенияrem, так что же происходит?
remв медиа запросах используется начальное значениеfont-sizeи не учитывает никаких изменений, которые могли произойти сfont-sizeна:rootэлемент. В другими словами, это очевидное значение всегда16px.это немного раздражает, потому что это означает, что вы должны сделать некоторые дробные вычисления, но я обнаружил, что большинство распространенных медиа-запросов уже используют значения, кратные 16.
| px | rem | +------+-----+ | 320 | 20 | | 480 | 30 | | 768 | 48 | | 1024 | 64 | | 1200 | 75 | | 1600 | 100 |кроме того, если вы используете препроцессор CSS, вы можете использовать mixins или переменные для управления запросами мультимедиа, которые будут маскировать проблему полностью.
Переключение Контекста
если вы переключаетесь между проектами различных различных проектов, вполне возможно, что кажущийся размер шрифта
remбудут иметь разные значения. В одном проекте вы можете использовать кажущийся размер10pxгде в другом проекте видимый размер может быть1px. Это может привести к путанице и вызвать проблемы.моя единственная рекомендация здесь придерживаться
62.5%преобразованиеremк явному размер10px, потому что это было более распространено в моем опыте.общие библиотеки CSS
если вы пишете CSS, который будет использоваться на сайте, который вы не контролируете, например, для встроенного виджета, на самом деле нет хорошего способа узнать, какой видимый размер
remбудет. Если это так, не стесняйтесь продолжать использоватьpx.если вы все еще хотите использовать
remхотя, подумайте о выпуске Sass или менее версии таблица стилей с переменной для переопределения масштабирования для кажущегося размераrem.
* я не хочу никого пугать от использования
rem, но я не смог официально подтвердить, что браузер использует16pxпо умолчанию. Вы видите, есть много браузеров, и это не было бы все, что трудно для одного браузера, чтобы разошлись так немного, скажем15pxили18px. В тестировании, однако я не видел ни одного пример, когда браузер, использующий настройки по умолчанию в системе, использующей настройки по умолчанию, имел любое значение, отличное от16px. Если вы найдете такой пример, пожалуйста, поделитесь им со мной.
в этой статье довольно хорошо описывает плюсы и минусы
px,emиrem.автор наконец приходит к выводу, что лучший метод, вероятно, использовать оба
pxиrem, объявивpxсначала для старых браузеров и повторного объявленияremдля новых браузеров:html { font-size: 62.5%; } body { font-size: 14px; font-size: 1.4rem; } /* =14px */ h1 { font-size: 24px; font-size: 2.4rem; } /* =24px */
в качестве рефлекторного ответа я бы рекомендовал использовать rem, потому что он позволяет вам изменить "уровень масштабирования" всего документа сразу, если это необходимо. В некоторых случаях, когда вы хотите, чтобы размер был относительно родительского элемента, а затем использовать em.
но поддержка rem пятнистая, IE8 нуждается в полифиле, а Webkit демонстрирует ошибку. Кроме того, субпиксельное вычисление может привести к тому, что такие вещи, как линии одного пикселя, иногда исчезают. Средство состоит в том, чтобы кодировать в пикселях для таких очень небольшой элемент. Это создает еще большую сложность.
Итак, в целом, спросите себя, стоит ли это - насколько важно и вероятно, что вы измените "уровень масштабирования" всего документа в CSS?
в некоторых случаях это да, в некоторых случаях это будет нет.
Итак, это зависит от ваших потребностей, и вам нужно взвесить плюсы и минусы, потому что использование rem и em вводит некоторые дополнительные соображения по сравнению с" нормальным " пиксельным рабочий процесс.
имейте в виду, что легко переключить (или, скорее, преобразовать) ваш CSS из px в rem (JavaScript-это другая история), потому что следующие два блока кода CSS дадут тот же результат:
html { } body { font-size:14px; } .someElement { width: 12px; }
html { font-size:1px; } body { font-size:14rem; } .someElement { width: 12rem; }
ответ josh3736 является хорошим, но чтобы обеспечить контрапункт 3 года спустя:
Я рекомендую использовать
remединицы для шрифтов, хотя бы потому, что это облегчает вы, застройщиком, чтобы изменить размеры. Это правда, что пользователи очень редко меняют размер шрифта по умолчанию в своих браузерах, и что современный масштаб браузера будет масштабироватьсяpxединицы измерения. Но что делать, если ваш босс приходит к вам и говорит: "не увеличивайте изображения или значки, но сделайте все шрифты больше". Это гораздо проще просто изменить размер корневого шрифта и пусть все остальные шрифты масштабируются относительно этого, а затем изменитьpxразмеры в десятках или сотнях правил css.Я думаю, что это все еще имеет смысл использовать
pxединицы измерения для некоторых изображений или для определенных элементов макета, которые всегда должны быть одинакового размера независимо от масштаба дизайна.Caniuse.com возможно, сказал, что только 75% браузеров, когда josh3736 опубликовал свой ответ в 2012 году, но по состоянию на 27 марта они претензии 93.78% поддержки. Только IE8 не поддерживает его среди браузеров, которые они отслеживают.
Я нашел лучший способ чтобы программа размеры шрифтов веб-сайта, чтобы определить базовый размер шрифта для
bodyа затем использовать em (или rem) для каждого другогоfont-sizeЯ объявляю после этого. Это личные предпочтения, я полагаю, но он служил мне хорошо, а также сделал его очень легко включить более адаптивный дизайн.что касается использования rem-модулей, я думаю, что хорошо найти баланс между прогрессивностью в вашем коде, но также предложить поддержку старые браузеры. проверьте эту ссылку о поддержке браузера для rem единиц, это должно помочь хорошую сумму на ваше решение.
ptпохож наrem, в том, что он относительно фиксированный, но почти всегда DPI-независимый, даже когда несовместимые браузеры обрабатываютpxв зависимости от устройства моды.remзависит от размера шрифта корневого элемента, но вы можете использовать что-то вроде Sass/Compass, чтобы сделать это автоматически сpt.если бы у вас было это:
html { font-size: 12pt; }затем
1remвсегда будет12pt.remиemтолько как прибор-независимый как элементы, на которые они полагаются; некоторые браузеры не ведут себя в соответствии со спецификацией, и лечитьpxбуквально. Даже в старые времена паутины, 1 пункт последовательно был сосчитан как 1/72 дюйма -- то есть, 72 пункта в дюйме.если у вас есть старый, несовместимый браузер, и у вас есть:
html { font-size: 16px; }затем
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-дюймовом дисплее в какой-то момент.- не сделка в субпикселей, чтобы сделать вещи фантазии на дисплеях с высоким разрешением. некоторые браузеры могут поддерживать его-особенно на дисплеях с высоким разрешением-но это нет-нет. Большинство пользователей предпочитают большие и понятные, хотя веб научил нас разработчиков иначе. Если вы хотите добавить расширенные сведения для своих пользователей с помощью современных экранов, вы можете использовать векторную графику (читай: SVG), которую вы должны делать в любом случае.
половина (но только половина) ехидного ответа (другая половина-горькое презрение к реальности бюрократии):
использовать vh
все всегда размер окна браузера.
всегда разрешайте прокрутку вниз, никогда в сторону.
установите ширину тела, чтобы быть статическим 50vh, и ничего не плавает или выходит из родительского div. И стиль только с использованием таблиц, так что все держится жестко на месте, как и ожидалось. Включите функцию javascript, чтобы отменить любую ctrl+/- активность, которую может выполнять пользователь.
все будут ненавидеть вас, кроме людей, которые говорят вам, чтобы сделать вещи соответствуют их макет, и они будут в восторге. И все знают, что их мнение-единственное, что имеет значение.
em-это путь вперед, а не только для шрифтов, но вы можете использовать их с коробками, толщиной линии и другими вещами тоже, почему?
проще говоря, em-это единственные, которые масштабируются в унисон с клавишами alt+ и alt в браузере для масштабирования.
другие шкалы измерения, но не так чисто, как их.
на боковой ноте если вы хотите лучшее в масштабировании, также преобразуйте свою графику в векторную SVG, где это возможно, так как они также будут чисто масштабироваться с помощью коэффициент масштабирования браузеров.
EMs-это единственное, что масштабируется для медиа-запросов, которые обрабатывают + / - масштабирование, которое люди делают все время, а не только слепые люди. Вот еще один очень хорошо написано профессиональная демонстрация того, почему это важно.
кстати, вот почему Zurb Foundation использует ems, в то время как нижняя Bootstrap 3 по-прежнему использует пиксели.