なぜpxではなくemですか?


766

ピクセルではなくemを使用してスタイルシートでサイズと距離を定義する必要があると聞きました。問題は、CSSでスタイルを定義するときにpxではなくemを使用する必要があるのはなぜですか?これを説明する良い例はありますか?


価値のあるものとして、CSSのさまざまなユニットの定義を以下に示します:w3.org/TR/css3-values/#lengths
Ryan

回答:


554

一方が他方よりも良い選択であると言うのは間違っています(または両方が仕様で独自の目的を与えられなかったでしょう)。StackOverflowがpxユニットを広範囲に使用していることは注目に値するかもしれません。スポークがそうだったと言われたのは悪い選択ではありません。

単位の定義

  • PXは、(のような測定の絶対的な単位であるにおいてPT、またはセンチメートルもの1/96であることを起こること)単位(なぜ後でより)。これは絶対的な測定であるため、ブラウザウィンドウのサイズやフォントサイズなどに比例するのではなく、何かを特定のサイズに定義したいときにいつでも使用できます。

    他のすべての絶対単位と同様に、px単位はブラウザーウィンドウの幅に合わせてスケーリングされません。したがって、ページデザイン全体がではなくpxなどの絶対単位を使用する場合、ブラウザの幅に適応しません。これは本質的に良いことでも悪いことでもありません。正確なサイズを守ることと、伸縮に対して柔軟性がないが、正確なサイズを守らないプロセスでは、デザイナーが選択する必要があるだけです。サイトでは、固定サイズと柔軟なサイズのオブジェクトが混在しているのが一般的です。

    多くの場合、広告バナー、ロゴ、アイコンなどの固定サイズの要素をページに組み込む必要があります。これにより、ほとんどの場合、デザインで少なくともいくつかの pxベースの測定が必要になります。たとえば、画像は(デフォルトで)各ピクセルのサイズが1 * px *になるようにスケーリングされるため、画像を中心に設計する場合はpxユニットが必要になります。また、正確なフォントサイズ設定やボーダーの幅にも非常に役立ちます。丸めが原因で、大部分の画面でpx単位を使用するのが最も理にかなっています。

    すべての絶対測定値は互いに厳密に関連しています。つまり、1インチがある常に 96px同じように、1インチがある常に 72pt。(スクリーンベースのメディアについて話すとき、1inが実際に物理的なインチになることはほとんどないことに注意してください)。すべての絶対測定は96ppiの名目上の画面解像度とデスクトップモニタの公称視距離を想定し、そのような画面上の一のPXは 1つのに等しいであろう物理的な画面上の画素と一つ96物理ピクセルに等しくなります。ピクセル密度または表示距離のいずれかが大幅に異なる画面、またはユーザーがブラウザーのズーム機能を使用してページをズームした場合、pxは必ずしも物理ピクセルに関連付けられなくなります。

  • emは絶対単位ではありません-現在選択されているフォントサイズに関連する単位です。フォントサイズを絶対単位(pxptなど)で設定してフォントスタイルをオーバーライドしていない限り、ユーザーのブラウザまたはOSで選択したフォントによってフォントの選択が影響を受けるため、意味がありません。フォントサイズの拡大縮小に合わせて具体的に拡大縮小したい場合を除いて、emを一般的な長さの単位として使用します。

    特に何かのサイズを現在のフォントサイズに依存させる場合は、emを使用します。

  • は、この場合、親要素の高さまたは幅に対する相対的な単位でもあります。デザインが特定のピクセルサイズに依存してサイズを設定していない場合は、デザインの全幅などのピクセル単位の代替として適しています。

    デザインで単位を使用すると、デザインを画面/デバイスの幅に適合させることができますが、pxなどの絶対単位を使用すると適合しません。


27
そのコンテキストで「em」のサイズがピクセル単位であることがわからない限り、emsとピクセルの間で変換する方法はありません。これは、その要素の継承されたフォントサイズに依存する可能性があります。これは、ドキュメント全体のフォントサイズに依存する可能性があります。これは、ユーザーのブラウザやオペレーティングシステムのフォントサイズ設定に依存する可能性があります。特定のピクセルサイズを目指している場合は、ピクセル単位で指定します。つまり、990px​​が必要な場合は、990px​​を配置します。ピクセルがあなたが望むものであるならば、なぜそれらを使わないのですか?
thomasrutter 2009

7
えっ?それと矛盾することは何も言わなかった。pxユニットの用途とemユニットの用途を言っていました。pxユニットの使用は一般的に悪いことを暗示しているようです。ブラウザーのデフォルトのフォントサイズを調整したときにサイトが壊れた場合、障害はpx単位ではなく、誤った仮定です。明らかに、Webデザイナーはデフォルトのフォントサイズ(多くの場合は良いアイデア)に依存しており、固定サイズのグラフィック要素をテキストに揃えようとするなど、このフォントサイズに関する誤った仮定に基づいて残りのレイアウトを作成しました。要素のサイズは、1つのフォントサイズのテキストにのみ一致します。
thomasrutter-

3
それは間違っているわけでも、単純化しすぎているわけでもありません。明らかに、実際にfont-sizeを宣言している行でemを使用する場合、その行のemを、その要素のfont-size宣言の後に同じ要素のfont-sizeに対して相対的にすることは不可能です。まだわかっている-そのため、同じ要素のfont-sizeプロパティが宣言される前に、要素が持っていたであろうfont-sizeに相対的でなければならない。その他の動作は文字通り不可能であるため、そこにはあいまいさがありません。
thomasrutter 2013

3
@TalhaSayed、ピクセルをpxユニットと混同しています。それらは同じものではありません-CSS仕様を読んでください。px単位は、in単位、cm単位、またはpt単位と同じ意味の絶対単位です。
thomasrutter 2014年

7
@ thomasrutter、WOW!私はこれをググっただけで、はい、私は間違っていたと言わざるを得ません。これらすべての年と私は考えていませんでした。私は1ピクセル= 1 "画面上のドット"と考えていました。今日は何か新しいことを学んだと思います。
Talhaは2014年

143

高解像度の小さなラップトップを持っていて、Firefoxを120%のテキストズームで実行して、目を細めることなく読むことができます。

多くのサイトでこれに問題があります。レイアウトはすべて文字化けし、ボタンのテキストは半分にカットされるか、完全に消えます。stackoverflow.comでさえも問題があります:

120%テキストズームでのFirefoxのスクリーンショット

トップボタンとページタブがどのように重なっているかに注意してください。pxの代わりにem単位を使用していれば、問題はありませんでした。


15
[表示]-> [ズーム]-> [テキストのみズーム]で画像をズームせずに、Firefoxでテキストをズームした後、通常どおりズームすることもできます。
thomasrutter 2009年

4
+1良い点。ただし、大きな解像度については、標準の96解像度ではなく120 dpiでテキストを表示するように画面設定を設定することもできます
Spoike

5
@スポイケ:私はそうしますが、FirefoxはシステムのDPI設定を尊重しません。bugs.launchpad.net/ubuntu/+source/firefox/+bug/19524を
flodin

6
@フアン:ページ全体のスケーリングという最も単純なズーム方法を使用しているためです。ただし、150%のズームでは、幅が1000pxのページが幅が1500pxになります。これは、ウェブとブラウザの開発者がズームする最も簡単な方法です。残念ながら、それはあまりユーザーフレンドリーではありません。これが、他のブラウザーがレイアウトを変更せずにコンテンツのみを拡大するテキストズーム機能を備えている理由です。しかし、それは、Web開発者が基本的に多種多様なフォントサイズのレイアウトを設計する必要があることを意味し、設計ごとに実行できることを大幅に制限します。16ptフォントだけでなく48ptフォントでもサイトを美しく見せることは非常に困難です。
Lèseはmajesté

1
@Lesemajesteは、「ズーム」が実際にどうあるべきかをページ全体に拡大していません。開発者がニッチなユーザーに対処するか、アクセスしないように指示する必要があるのではないでしょうか?16ptと48ptのフォントを考慮して単一のページを作成することはありません。それは愚かで、あなたが指摘したように、レイアウトを非常に制限しています。FFがテキストだけに特別なズームをしたいのは素晴らしいことだと思いますが、それを念頭に置いてデザインするつもりはありません。
1934286

93

私がこの質問をした理由は、CSSでハッキングしていたときのようにemの使い方を忘れてしまったためです。フォント自体のサイズ変更について話していなかったため、一般的な質問を続けていることに人々は気づきませんでした。ページ上の特定のブロック要素にスタイルを定義する方法にもっと興味がありました。

以下のようヘンリク・ポールと他の人が指摘したEMは、要素に使用するフォントサイズに比例しています。pxでブロック要素のサイズを定義することは一般的な方法ですが、ブラウザーでフォントをサイズ変更すると、通常、このデザインが壊れます。フォントのサイズ変更は、通常、ショートカットキーCtrl+ +またはCtrl+で行い-ます。したがって、代わりにemを使用することをお勧めします。

pxを使用して幅を定義する

以下に例を示します。スタイリッシュな日付ボックスにしたいdivタグがあるとします。次のようなHTMLコードがあるとします。

<div class="date-box">
    <p class="month">July</p>
    <p class="day">4</p>
</div>

簡単な実装では、date-boxクラスの幅をpx で定義します。

* { margin: 0; padding: 0; }

p.month { font-size: 10pt; }

p.day { font-size: 24pt; font-weight: bold; }

div.date-box {
    background-color: #DD2222;
    font-family: Arial, sans-serif;
    color: white;
    width: 50px;
}

問題

ただし、ブラウザでテキストのサイズを大きくすると、デザインが壊れます。テキストはボックスの外にも流れます。これは、Flodinが指摘しているように、SOの設計で起こることとほとんど同じです。これは、ボックスがロックされたときと同じ幅のサイズのままであるため50pxです。

代わりにemを使用する

より賢い方法は、代わりにemsで幅を定義することです:

div.date-box {
    background-color: #DD2222;
    font-family: Arial, sans-serif;
    color: white;
    width: 2.5em;
}

* { margin: 0; padding: 0; font-size: 10pt; }

// Initial width of date-box = 10 pt x 2.5 em = 25 pt
// Will also work if you used px instead of pt

そうすることで、日付ボックスに滑らかなデザインができます。つまり、ボックスは、日付ボックスに定義されたフォントサイズに比例してテキストとともにサイズが大きくなります。この例では、font-sizeは*10ptとして定義されており、そのフォントサイズの2.5倍のサイズになります。したがって、ブラウザでフォントのサイズを変更する場合、ボックスのサイズはそのfont-sizeの2.5倍になります。


1
私は疑問に思います:幅のパーセンテージを使用してグリッドシステムにどのように調整しますか?contianingブロックに100%の幅が指定されている場合、それは壊れますか?
hugo der hungrige 2013

64
これは今日では真実ではありません。を押しCtrl+Ctrl-、最新のブラウザでピクセル値もスケーリングします。久しぶりです。
YemSalat 2014年

1
@YemSalatこれはOSのDPIの調整にも当てはまりますか?
Angularsen 2015

@anjdreas正直であるとは思いません。
YemSalat 2015年

4
@spoike、これはYemSalatのコメントで述べられているように明らかに正しくないため、これに反対投票
RayLoveless

60

ここでthomasrutterからのトップ投票の回答は、emについての彼の回答のとおりです。しかし、ピクセルのサイズについては非常に間違っています。ですから、古くてもさっぱりです。

コンピュータ画面は通常96dpiではありません!(または、あなたが徹底的になりたいならば、ppi。)


ピクセルの物理サイズは固定されていません。
(はい、それは1つの画面内でのみ修正されますが、次の画面では1ピクセルはおそらく大きいまたは小さい、そして確かに1/96インチではありません。)


プルーフ
960ピクセルの長さの線を描きます。物理的な定規でそれを測定します。10インチですか?番号..?
ラップトップをテレビに接続します。ラインは今10インチですか?まだありません?
iPhoneでラインを表示します。まだ同じサイズですか?何故なの?

一体一体誰が96dpiコンピュータスクリーンの神話を発明したのですか?
(一部の宗教は72dpiの神話で運営されていますが、同様に間違っています。)


4
> pxの外観を理解するには、1990年代のCRTコンピューターモニターを想像してください。表示できる最小のドットは、約100分の1インチ(0.25mm)またはそれ以上です。pxユニットは、それらの画面ピクセルから名前を取得しました。-W3C
Jay Zelenkov

4
すべての絶対測定値は互いに厳密に関連しています。つまり、1inは常に* 96px *であり、1inは常に* 72pt *です。(画面ベースのメディアについて話すとき、1inが実際に物理的なインチになることはほとんどないことに注意してください)私は、トップ投票の回答が物理的なインチについて話しているとは思いません。この関係は、inやptなどのさまざまな絶対サイズ設定スキームの間にあります。たとえば 1_in_の線を引いた場合、「証明」を延長するだけで物理的に1インチの寸法になりますか?
Saumitra R. Bhave

5
-1は、不適切で無関係な暴言を表します。ここにある画面上のピクセルではなく、参照ピクセルを基準にpxしたサイズです。あなたはそれが好きではないかもしれませんが、あなたの支配者を外に出すことはそれを事実の何より少なくするつもりもありませんし、それが質問に答えるのにも貢献しません。stackoverflow.com/questions/27382331/…– "The reference pixel is the visual angle of one pixel on a device with a pixel density of 96dpi and a distance from the reader of an arm's length. For a nominal arm's length of 28 inches, the visual angle is therefore about 0.0213 degrees."
underscore_d

52

フォントサイズに合わせて拡大縮小する必要があるすべてのものに役立ちます。

これは、フォントサイズを拡大縮小してズームを実装するブラウザで特に役立ちます。したがって、使用emするすべての要素のサイズを変更すると、それに応じてスケーリングされます。


97
現在、すべての最新のブラウザーは、フォントサイズだけをスケーリングするのではなく、すべての絶対単位を等しくスケーリングすることでズームを実装しています。この回答は2009年に書かれたものであり、現在よりも少なくなっていることに注意してください。
thomasrutter 2013年

22

em(http://en.wikipedia.org/wiki/Em_ ( typography))は、現在使用されているフォントサイズに直接比例するためです。フォントサイズがたとえば16ポイントの場合、1 emは16ポイントです。フォントサイズが16ピクセルの場合(:ポイントとは異なります)、1つのemは16ピクセルです。

これは2つの(関連する)事柄につながります。

  1. 後でCSSでフォントサイズを編集することを選択した場合、比率を維持するのは簡単です。
  2. 多くのブラウザはカスタムフォントサイズをサポートし、CSSをオーバーライドします。すべてをピクセルで設計すると、レイアウトが壊れる可能性があります。ただし、emsを使用する場合、これらのオーバーライドによりこれらの問題を軽減する必要があります。

私はちょうど計算式を探していた:-)多分次のように、同様に逆の例を追加して良かった2pxです0.125em16ピクセルフォントのため。
ウルフ

12

例:

コード:body {font-size:10px;} //すべてのサイズを10以下に保ち、この値を変更して、残りをたとえばこの値の1.4に変更します

1 {font-size:1.2em;} // 12px

2 {font-size:1.4em;} // 14px

3 {font-size:1.6em;} // 16px

4 {font-size:1.8em;} // 18ピクセル

5 {font-size:2em;} // 20px

1

2

4

5

本体の値を変更すると、残りは自動的に変更されて基本値の一種になります…

10×2 = 20 10×1.6 = 16など

あなたは8pxとしてベース値を持つことができます…それで8×2 = 16 8×1.6 = 12.8 //ブラウザによって丸められるかもしれません


3
効果を示す画像を追加することをお勧めします。
ウルフ

8

非常に実用的な理由は、pxを使用して指定されている場合、IE 6ではフォントのサイズを変更できないのに対し、emやパーセンテージなどの相対単位を使用している場合はそうです。ユーザーがフォントのサイズを変更できないようにすることは、アクセシビリティにとって非常に悪いことです。減少傾向にありますが、IE 6ユーザーはまだたくさんいます。


1
IE7とIE8 、ピクセル単位で指定されたフォントサイズ(〜Page > Text Size)でテキストのサイズを変更できないことに注意してください。ただし、IE7では、ページズーム(Page > Zoom)が追加され、テキストを含むページ全体が明らかにズームされます。
メルカトル

1
Page> Zoonよりも良いです。IE7+、Chrome、Firefoxでキーボードの[CTRL] + [-]または[+]キーを押してみてください。フォントサイズを変更しようとするときに発生するほとんどの問題なしに、ページ全体をズームできます。
Rich Turner、

1
2017年に世界中のほとんどすべてのコンピュータがIE6を使用
Michael

3
@MichaelMayそれで、なぜ2009年に回答と他のコメントが書かれたのか...笑
Chev

7

グラフィカル要素を正確に配置するには、pxを使用します。emを使用して、行の高さなどのテキスト要素の周りに配置および間隔を設定する必要がある測定に使用します。


それはWCAG 2.0最小要件に対応していませんが、w3.org / WAI / WCAG20 / quickref / Overview.php -1.4.4の十分なテクニック
meo

2

emまたはパーセンテージを使用する主な理由は、ユーザーがデザインを壊すことなくテキストサイズを変更できるようにするためです。pxで指定されたフォントを使用してデザインする場合、ユーザーがテキストサイズを選択しても、フォントは(IE 6などで)サイズを変更しません。これは視覚障害を持つユーザーにとっては非常に悪いことです。

このようなデザインのいくつかの例と記事(選択できるアイテムは無数にあります)については、A List Apart:Fluid Gridsの最新号、古い記事「CSSでテキストのサイズを設定する方法」またはDan Cederholmの防弾ウェブデザインを参照してください。

画像は引き続きpxサイズで表示されますが、一般的に、テキストのサイズをpxにすることは適切なフォームとは見なされません。

私が個人的にIE6を軽視しているのと同じくらい、それは現在、フォーチュン200の会社の大多数のユーザーに対して承認された唯一のブラウザーです。


1
+1の流体グリッドは、実際に質問したときに探していたものです。(また、あなたの会社はIE7にアップグレードすべきではありませんか?)
スポーク2009年

あなたが私に尋ねた場合、彼らはFirefoxを使うべきですが、彼らは実際に私に尋ねません。:-)(IE7は6より優れていますが、私は意思決定に関与しません)
Traingamer 2009年

2

pxを使用してフォントサイズを指定したいが、これをCSSファイルに配置することでemが提供する使いやすさを望む場合は、簡単な解決策があります。

body {
  font-size: 62.5%;
}

次に、次のようにp(およびその他の)タグを指定します。

p {
  font-size: 0.8em; /* This is equal to 8px */
  font-size: 1.0em; /* This is equal to 10px */
  font-size: 1.2em; /* This is equal to 12px */
  font-size: 2.0em; /* This is equal to 20px */
}

等々。


2
これは誰もブラウザのカスタムcss設定に触れないことに大きく依存していませんか?
スポーク

4
いや、あなただけを設定する必要がありますfont-size: 10pxcss-tricks.com/forums/discussion/1230/...
m33lky

font-size:100%のままにして、em値を
計算

0

(サイトから)IE6がなくなるまで、フォントサイズにemを使用することをお勧めします。Pxは、ページのズーム(テキストのズームではなく)が標準の動作になると問題ありません。

Traingamerはすでに必要なリンクを提供しています


0

ピクセルは絶対単位ですが、rem / emは相対単位です。詳細:https : //drafts.c​​sswg.org/css-values-3/

システムがfont-size値をHTML要素であるルート要素に提供するため、システムのフォントサイズに従ってfont-sizeを適応させる場合は、相対単位を使用する必要があります。

この場合、ウェブページがgoogle chromeで開かれている場合、HTML要素のfont-sizeはchromeによって設定されます。それを変更して、rem / emユニットのフォントを含むウェブページへの影響を確認してください。

ここに画像の説明を入力してください

pxフォントの単位として使用する場合、フォントはサイズ変更されませんが、rem/emは変更されませんが、システムのフォントサイズを変更するとサイズが変更されます。

したがってpx、サイズを固定したい場合はrem/ を使用emし、サイズをシステムのサイズに適応/動的にしたい場合は/ を使用します。


-1

一般的なコンセンサスは、ブラウザー/プラットフォーム間でより一貫しているため、フォントのサイズ変更にパーセンテージを使用することです。

面白いことに、私はいつもフォントのサイズ変更にptを使用しており、すべてのサイトがそれを使用すると想定していました。通常、他のアプリ(Wordなど)ではpxサイズを使用しません。それは印刷用だからだと思いますが、WebブラウザーでもWordと同じサイズです...


-2

計算された値を見つけやすくするために、emまたはpxがremを使用するのを避けてください。ただし、emとpxの間では、emはデバッグが難しいため、pxの方が適しています。


他の人がそれから学ぶことができるように、あなたの回答にさらに説明を追加してください-特にこれはすでにたくさんの賛成投票されている本当に古い質問です
ニコ・ハース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.