540 Stimmen

Sollte ich in meinem CSS px- oder rem-Wert-Einheiten verwenden?

Ich entwerfe eine neue Website und möchte, dass sie mit so vielen Browsern und Browsereinstellungen wie möglich kompatibel ist. Ich versuche zu entscheiden, welche Maßeinheit ich für die Größen meiner Schriftarten und Elemente verwenden soll, kann aber keine schlüssige Antwort finden.

Meine Frage ist: Sollte ich die px o rem in meinem CSS?

  • Bislang weiß ich, dass die Verwendung von px ist nicht kompatibel mit Nutzern, die die Grundschriftgröße in ihrem Browser einstellen.
  • Ich habe nicht beachtet, dass em s, weil sie im Vergleich zu anderen Systemen mehr Aufwand bei der Wartung verursachen. rem s, wenn sie kaskadieren.
  • Einige sagen, dass rem s sind unabhängig von der Auflösung und daher wünschenswerter. Andere wiederum sagen, dass die meisten modernen Browser ohnehin alle Elemente gleich stark zoomen, so dass die Verwendung von px ist kein Problem.

Ich frage das, weil es viele verschiedene Meinungen darüber gibt, was das wünschenswerteste Maß für die Entfernung in CSS ist, und ich bin mir nicht sicher, welches das beste ist.

577voto

josh3736 Punkte 130889

TL;DR: utilice px .

Die Fakten

  • Zunächst einmal ist es äußerst wichtig zu wissen, dass laut Spezifikation die CSS px 単位 nicht entsprechen einem physischen Anzeigepixel. Dies hat immer wahr - auch im Jahr 1996 CSS 1-Spezifikation .

    CSS definiert die Referenzpixel die die Größe eines Pixels auf einem Display mit 96 dpi misst. Auf einem Display, dessen dpi wesentlich von 96 dpi abweicht (z. B. Retina-Displays), skaliert der User Agent die px Einheit, so dass ihre Größe der eines Referenzpixels entspricht. Mit anderen Worten, diese Neuskalierung ist genau der Grund, warum 1 CSS-Pixel 2 physischen Retina-Display-Pixeln entspricht.

    Bis 2010 (und ungeachtet der Situation beim mobilen Zoom) war die px entsprach fast immer einem physischen Pixel, da alle weit verbreiteten Bildschirme eine Auflösung von 96 dpi aufwiesen.

  • Größenangaben in em s sind relativ zum übergeordneten Element . Dies führt zu der em Das "Compounding-Problem", bei dem verschachtelte Elemente nach und nach größer oder kleiner werden. Zum Beispiel:

      body { font-size:20px; } 
      div { font-size:0.5em; }

    Das gibt uns:

      <body> - 20px
          <div> - 10px
              <div> - 5px
                  <div> - 2.5px
                      <div> - 1.25px
  • Die CSS3 rem die sich immer nur auf die Wurzel bezieht html Element, wird jetzt unterstützt auf 99,67 % aller verwendeten Browser .

Die Stellungnahme

Ich denke, jeder ist sich einig, dass es gut ist, seine Seiten so zu gestalten, dass sie für alle zugänglich sind und Rücksicht auf Sehbehinderte nehmen. Eine solche Rücksichtnahme (aber nicht die einzige!) besteht darin, den Nutzern die Möglichkeit zu geben, den Text auf Ihrer Website größer zu machen, damit er leichter zu lesen ist.

Zu Beginn war die einzige Möglichkeit, den Benutzern eine Skalierung der Textgröße zu bieten, die Verwendung relativer Größeneinheiten (wie em s). Der Grund dafür ist, dass das Schriftgrößenmenü des Browsers einfach die Größe der Wurzelschrift ändert. Wenn Sie also die Schriftgrößen in px Wenn Sie die Schriftgröße im Browser ändern, werden sie nicht skaliert.

Moderne Browser (und sogar der nicht mehr ganz so moderne IE7) haben die Standard-Skalierungsmethode dahingehend geändert, dass alles vergrößert wird, auch Bilder und Rahmengrößen. Im Wesentlichen machen sie den Referenzpixel größer oder kleiner.

Ja, man könnte immer noch das Standard-Stylesheet des Browsers ändern, um die Standard-Schriftgröße zu verändern (das Äquivalent zur Schriftgrößenoption im alten Stil), aber das ist eine sehr esoterische Methode, und ich wette, dass niemand 1 tut es. (In Chrome ist sie unter den erweiterten Einstellungen, Webinhalt, Schriftgrößen vergraben. Im IE9 ist sie sogar noch versteckter. Sie müssen die Alt-Taste drücken und dann auf Ansicht, Textgröße gehen). Es ist viel einfacher, einfach die Option Zoom im Hauptmenü des Browsers zu wählen (oder die Option Ctrl + + / - /Mausrad).

1 - innerhalb des statistischen Fehlers, natürlich

Wenn wir davon ausgehen, dass die meisten Benutzer die Seiten mit der Zoom-Option skalieren, finde ich relative Einheiten meist irrelevant. Es ist viel einfacher, eine Seite zu entwickeln, wenn alles in der gleichen Einheit angegeben ist (Bilder werden alle in Pixeln behandelt), und man muss sich keine Gedanken über Compounding machen. ( "Mir wurde gesagt, dass es keine Mathematik geben würde" - man muss ausrechnen, was 1,5em tatsächlich ausmacht).

Ein weiteres potenzielles Problem bei der Verwendung von relativen Einheiten für Schriftgrößen ist, dass vom Benutzer angepasste Schriftgrößen die Annahmen Ihres Layouts verletzen können. Dies kann zum Beispiel dazu führen, dass Text abgeschnitten wird oder zu lang wird. Wenn Sie absolute Einheiten verwenden, müssen Sie sich keine Sorgen über unerwartete Schriftgrößen machen, die Ihr Layout zerstören.

Meine Antwort lautet also: Pixel-Einheiten verwenden. Ich verwende px für alles. Natürlich kann Ihre Situation unterschiedlich sein, und wenn Sie IE6 unterstützen müssen (mögen die Götter der RFCs Ihnen gnädig sein), müssen Sie Folgendes verwenden em s sowieso.

443voto

zzzzBov Punkte 166065

Ich möchte Folgendes loben <a href="https://stackoverflow.com/a/11803273/497418">josh3736's Antwort </a>für die Bereitstellung eines hervorragenden historischen Kontextes. Auch wenn die Frage gut formuliert ist, hat sich die CSS-Landschaft in den fast fünf Jahren, seit sie gestellt wurde, verändert. Als diese Frage gestellt wurde, <code>px</code> <em>war </em>die richtige Antwort, aber das ist heute nicht mehr der Fall.


tl;dr: utilice rem

Überblick über die Einheit

Historisch px Einheiten entsprachen in der Regel einem Gerätepixel. Mit Geräten, die eine immer höhere Pixeldichte aufweisen, gilt dies für viele Geräte nicht mehr, wie z. B. für das Retina-Display von Apple.

rem Einheiten stellen die r oot em Größe. Es ist die font-size von was auch immer passt :root . Im Fall von HTML ist es die <html> Element; für SVG ist es das <svg> Element. Der Standard font-size in jedem Browser* ist 16px .

Zur Verwendung px

Die Mehrzahl der CSS-Beispiele im Internet verwendet px Werte, weil sie der De-facto-Standard waren. pt , in und eine Vielzahl anderer Einheiten podría wurden in der Theorie verwendet, aber sie konnten mit kleinen Werten nicht gut umgehen, da man schnell auf Brüche zurückgreifen musste, die länger zu tippen und schwieriger zu erklären waren.

Wenn Sie einen dünnen Rand wünschen, mit px könnten Sie verwenden 1px , mit pt müssten Sie Folgendes verwenden 0.75pt für konsistente Ergebnisse, und das ist einfach nicht sehr praktisch.

Zur Verwendung rem

rem der Standardwert von 16px ist kein sehr starkes Argument für seine Verwendung. Schreiben 0.0625rem es schlechter als das Schreiben 0.75pt warum also sollte jemand die rem ?

Das Projekt besteht aus zwei Teilen rem den Vorteil gegenüber anderen Einheiten.

  • Benutzerpräferenzen werden respektiert
  • Sie können die scheinbare px Wert von rem auf was immer Sie möchten

Benutzerpräferenzen respektieren

Der Browser-Zoom hat sich im Laufe der Jahre stark verändert. In der Vergangenheit konnten viele Browser nur vergrößern font-size Das änderte sich jedoch ziemlich schnell, als Websites feststellten, dass ihr schönes, pixelgenaues Design bei jeder Vergrößerung oder Verkleinerung zerbrach. Heute skalieren die Browser die gesamte Seite, so dass ein schriftsatzbasiertes Zoomen nicht mehr möglich ist.

Die Wünsche der Nutzer zu respektieren, ist nicht unmöglich. Nur weil ein Browser so eingestellt ist 16px standardmäßig eingestellt ist, bedeutet das nicht, dass ein Benutzer seine Einstellungen nicht ändern kann, um 24px o 32px zur Korrektur von Sehschwächen oder schlechter Sicht (z. B. Blendung durch den Bildschirm). Wenn Sie Ihre Einheiten auf der Grundlage von rem Bei einer höheren Schriftgröße sieht der Benutzer eine proportional größere Seite. Die Ränder werden größer sein, die Polsterung wird größer sein, die Ränder werden größer sein, alles wird fließend skaliert werden.

Wenn Sie Ihre Medienabfragen auf der Grundlage von rem Sie können auch dafür sorgen, dass die Website, die Ihre Nutzer sehen, auf ihren Bildschirm passt. Ein Benutzer mit font-size eingestellt auf 32px in einem 640px breiten Browser, wird Ihre Website tatsächlich so gesehen, wie sie einem Nutzer auf 16px in einem 320px breiten Browser. Die Verwendung von responsive web design (RWD) ist absolut kein Verlust für rem .

Scheinbar ändern px Wert

Denn rem basiert auf dem font-size der :root Knoten, wenn Sie ändern möchten, was 1rem darstellt, müssen Sie lediglich die font-size :

:root {
  font-size: 100px;
}
body {
  font-size: 1rem;
}

<p>Don't ever actually do this, please</p>

Was auch immer Sie tun, stellen Sie nicht die :root Element font-size a un px Wert.

Wenn Sie die Einstellung font-size auf html a un px Wertes haben Sie die Präferenzen des Benutzers über den Haufen geworfen, ohne eine Möglichkeit, sie zurückzubekommen.

Wenn Sie die scheinbar Wert von rem verwenden % Einheiten.

Die Berechnungen hierfür sind relativ einfach.

Die offensichtliche Schriftgröße von :root es 16px aber sagen wir mal, wir wollen es ändern in 20px . Alles, was wir tun müssen, ist multiplizieren 16 durch einen Wert, um Folgendes zu erhalten 20 .

Stellen Sie Ihre Gleichung auf:

16 * X = 20

Und lösen Sie für 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>

Alles in Vielfachen von 20 ist nicht besonders groß, aber ein gängiger Vorschlag ist, die scheinbare Größe von rem gleich 10px . Die magische Zahl dafür lautet 10/16 das ist 0.625 , oder 62.5% .

:root {
  font-size: 62.5%;
}

<p>If you're using the default font-size, I'm 10px tall.</p>

Das Problem ist nun, dass Ihr Standard font-size für den Rest der Seite viel zu klein eingestellt ist, aber dafür gibt es eine einfache Lösung: Setzen Sie eine font-size auf body mit rem :

:root {
  font-size: 62.5%;
}

body {
  font-size: 1.6rem;
}

<p>I'm the default font-size</p>

Es ist wichtig zu beachten, dass mit dieser Anpassung der scheinbare Wert von rem es 10px was bedeutet, dass jeder Wert, den Sie in px kann direkt umgewandelt werden in rem durch Verschieben einer Dezimalstelle.

padding: 20px;

wird zu

padding: 2rem;

Die Schriftgröße, die Sie wählen, ist Ihnen überlassen, und wenn Sie wollen, gibt es keinen Grund, sie nicht zu verwenden:

:root {
  font-size: 6.25%;
}
body {
  font-size: 16rem;
}

und haben 1rem gleich 1px .

Das ist eine einfache Lösung, um die Wünsche der Benutzer zu respektieren und gleichzeitig zu vermeiden, dass Ihr CSS zu kompliziert wird.

Moment, wo ist der Haken?

Ich habe befürchtet, dass Sie das fragen würden. So gerne ich auch so tun würde, als ob rem magisch ist und alles löst, gibt es immer noch einige Probleme, die zu beachten sind. Nichts Weltbewegendes meiner Meinung nach aber ich werde sie ansprechen, damit Sie nicht sagen können, ich hätte Sie nicht gewarnt.

Medienabfragen (verwenden Sie em )

Eines der ersten Probleme, auf das Sie stoßen werden, ist rem beinhaltet Medienabfragen. Betrachten Sie den folgenden Code:

:root {
  font-size: 1000px;
}
@media (min-width: 1rem) {
  :root {
    font-size: 1px;
  }
}

Hier wird der Wert von rem ändert sich je nachdem, ob die Medienabfrage zutrifft, und die Medienabfrage hängt von dem Wert von rem Was um alles in der Welt ist hier los?

rem in Medienabfragen verwendet den Anfangswert von font-size y sollte nicht (siehe Abschnitt Safari) berücksichtigen alle Änderungen, die an der font-size der :root Element. Mit anderen Worten, sein offensichtlicher Wert ist immer 16px .

Das ist ein bisschen ärgerlich, denn es bedeutet, dass Sie Folgendes tun müssen einige Bruchrechnungen, aber ich habe festgestellt, dass die meisten gängigen Medienabfragen bereits Werte verwenden, die ein Vielfaches von 16 sind.

|   px | rem |
+------+-----+
|  320 |  20 |
|  480 |  30 |
|  768 |  48 |
| 1024 |  64 |
| 1200 |  75 |
| 1600 | 100 |

Wenn Sie einen CSS-Präprozessor verwenden, können Sie außerdem Mixins oder Variablen verwenden, um Ihre Media-Queries zu verwalten, was das Problem vollständig überdecken wird.

Safari

Leider gibt es einen bekannten Fehler in Safari, bei dem Änderungen an der :root Schriftgröße ändern tatsächlich die berechnete rem Werte für Medienabfragebereiche. Dies kann ein sehr seltsames Verhalten verursachen, wenn die Schriftgröße der :root Element innerhalb einer Medienabfrage geändert wird. Glücklicherweise ist die Lösung einfach: utilice em Einheiten für Medienabfragen .

Kontext-Umschaltung

Wenn Sie zwischen verschiedenen Projekten hin- und herwechseln, ist es durchaus möglich, dass die scheinbare Schriftgröße von rem werden unterschiedliche Werte haben. In einem Projekt könnten Sie eine scheinbare Größe von 10px wo bei einem anderen Projekt die scheinbare Größe sein könnte 1px . Dies kann verwirrend sein und Probleme verursachen.

Ich kann hier nur empfehlen, sich an 62.5% zu konvertieren rem auf eine scheinbare Größe von 10px weil dies meiner Erfahrung nach häufiger vorkommt.

Gemeinsame CSS-Bibliotheken

Wenn Sie CSS schreiben, das auf einer Website verwendet werden soll, die Sie nicht kontrollieren, z. B. für ein eingebettetes Widget, gibt es keine gute Möglichkeit zu wissen, welche scheinbare Größe rem haben wird. Wenn das der Fall ist, können Sie weiterhin die px .

Wenn Sie weiterhin die rem Sie sollten jedoch in Erwägung ziehen, eine Sass- oder LESS-Version des Stylesheets mit einer Variable zu veröffentlichen, die die Skalierung für die scheinbare Größe von rem .


* Ich möchte niemanden davon abhalten, die <code>rem</code> aber ich konnte das noch nicht offiziell bestätigen. <em>jede </em>Browser verwendet <code>16px</code> standardmäßig. Es gibt viele Browser, und es wäre nicht allzu schwer, wenn ein Browser ein wenig von der Standardeinstellung abweicht, zum Beispiel <code>15px</code> o <code>18px</code> . Bei meinen Tests habe ich jedoch kein einziges Beispiel gesehen, bei dem ein Browser mit Standardeinstellungen in einem System mit Standardeinstellungen einen anderen Wert als <code>16px</code> . Wenn Sie ein solches Beispiel finden, teilen Sie es mir bitte mit.

58voto

uzyn Punkte 6483

Dieser Artikel beschreibt ziemlich gut die Vor- und Nachteile von px , em und rem .

Der Autor kommt schließlich zu dem Schluss, dass die beste Methode wahrscheinlich darin besteht, beides zu verwenden px y rem und erklärt, dass px zunächst für ältere Browser und die Neuerklärung rem bei neueren Browsern:

html { font-size: 62.5%; } 
body { font-size: 14px; font-size: 1.4rem; } /* =14px */
h1   { font-size: 24px; font-size: 2.4rem; } /* =24px */

40voto

GorvGoyl Punkte 32029

Ja, REM und PX sind relativ Obwohl andere Antworten vorgeschlagen haben, REM gegenüber PX zu bevorzugen, möchte ich dies anhand eines Beispiels für Barrierefreiheit untermauern.
Wenn der Benutzer eine andere Schriftgröße im Browser einstellt, skaliert REM automatisch Elemente wie Schriftarten, Bilder usw. auf der Webseite nach oben oder unten, was bei PX nicht der Fall ist.


In der folgenden Grafik wird der Text auf der linken Seite mit der Schriftgröße REM und der Text auf der rechten Seite mit der Einheit PX eingestellt.

enter image description here

Wie Sie sehen können, skaliert REM automatisch nach oben/unten, wenn ich die Größe ändere die Standardschriftgröße der Webseite ändere (unten rechts)

Die Standardschriftgröße einer Webseite ist 16px, was 1 rem entspricht (nur für Standard-HTML-Seiten, d.h. html{font-size:100%} ), so dass 1,25rem gleich 20px ist.

P.S.: Wer benutzt noch REM? CSS-Frameworks! wie Bootstrap 4, Bulma CSS usw., so besser mit ihm auskommen.

10voto

Joshua Carmody Punkte 12990

Die Antwort von josh3736 ist gut, aber um 3 Jahre später einen Kontrapunkt zu setzen:

Ich empfehle die Verwendung von rem Einheiten für Schriftarten, und sei es nur, weil es dadurch einfacher für Sie den Entwickler, um die Größe zu ändern. Es stimmt, dass die Benutzer nur sehr selten die Standardschriftgröße in ihren Browsern ändern und dass moderne Browser die Schriftgröße vergrößern px Einheiten. Aber was ist, wenn Ihr Chef zu Ihnen kommt und sagt: "Vergrößern Sie nicht die Bilder oder Symbole, aber machen Sie alle Schriftarten größer". Es ist viel einfacher, nur die Grundschriftgröße zu ändern und alle anderen Schriftarten relativ dazu zu skalieren, als die px Größen in Dutzenden oder Hunderten von css-Regeln.

Ich denke, es ist immer noch sinnvoll, die px Einheiten für einige Bilder oder für bestimmte Layoutelemente, die unabhängig vom Maßstab des Designs immer die gleiche Größe haben sollten.

Caniuse.com mag gesagt haben, dass nur 75 % der Browser, wenn josh3736 seine Antwort im Jahr 2012 veröffentlicht, aber Stand 27. März: 93,78% Unterstützung . Nur der IE8 unterstützt diese Funktion nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X