Wir haben hier schon mal über „Warum Ems?“ gesprochen.
Für Neulinge bei em-Werten erklärt Das Mozilla Developer Network ems hervorragend
…ein em entspricht der Schriftgröße, die auf das übergeordnete Element des betreffenden Elements angewendet wird. Wenn Sie die Schriftgröße auf der Seite nirgendwo festgelegt haben, dann ist es die Standardeinstellung des Browsers, die wahrscheinlich 16px beträgt. Standardmäßig ist also 1em = 16px und 2em = 32px.
Wenn Sie immer noch lieber in px denken, aber die Vorteile von em mögen, brauchen Sie keinen Taschenrechner zur Hand zu haben, Sie können Sass die Arbeit für Sie erledigen lassen. Es gibt eine Vielzahl von Möglichkeiten, ems mit Sass zu berechnen.
Inline-Mathematik
h1 {
font-size: (32 / 16) * 1em;
}
p {
font-size: (14 / 16) + 0em;
}
Hinweis: Wir brauchen das „* 1em“ dort, damit Sass den Einheitenwert korrekt anhängt. Sie können auch „+ 0em“ für denselben Zweck verwenden.
Ergebnis
h1 {
font-size: 2em;
}
p {
font-size: 0.875em;
}
Das funktioniert, aber wir können es einfacher machen.
Die em()-Sass-Funktion
Es gibt ziemlich viele verschiedene Möglichkeiten, diese Funktion zu schreiben, diese hier aus einem Web Design Weekly-Artikel
$browser-context: 16; // Default
@function em($pixels, $context: $browser-context) {
@return #{$pixels/$context}em;
}
Super clever! Diese Funktion verwendet die String-Interpolation von Sass, um em an den Wert anzuhängen. Beachten Sie, dass der $context-Parameter einen Standardwert von $browser-context hat (also, was auch immer Sie diese Variable setzen). Das bedeutet, dass Sie beim Aufruf der Funktion in Ihrem Sass nur den $pixels-Wert angeben müssen und die Berechnung relativ zu $browser-context erfolgt – in diesem Fall 16px.
Beispielhafte Verwendung
h1 {
font-size: em(32);
}
p {
font-size: em(14);
}
Ergebnis
h1 {
font-size: 2em;
}
p {
font-size: 0.875em;
}
Eine ähnliche Funktion, die Mathematik anstelle von String-Interpolation verwendet, aus The Sass Way, kann leicht modifiziert werden, um Variablen wie unsere String-Interpolationsfunktion zu akzeptieren
//un-modified
@function calc-em($target-px, $context) {
@return ($target-px / $context) * 1em;
}
// and modified to accept a base context variable
$browser-context: 16;
@function em($pixels, $context: $browser-context) {
@return ($pixels / $context) * 1em;
}
Eine weitere, die die unitless()-Methode von Sass verwendet
$browser-context: 16;
@function em($pixels, $context: $browser-context) {
@if (unitless($pixels)) {
$pixels: $pixels * 1px;
}
@if (unitless($context)) {
$context: $context * 1px;
}
@return $pixels / $context * 1em;
}
Dies erlaubt uns, die px-Einheit entweder im Funktionsaufruf einzuschließen oder nicht.
h1 {
font-size: em(32);
}
// is the same as:
h1 {
font-size: em(32px);
}
Wäre es nicht viel einfacher, wenn man eine Basisschriftgröße von 10px auf dem oder einem Root-Element festlegt und 1em immer 10px ist? Und man würde nur mit em arbeiten. So wäre es sehr einfach, px zu berechnen. (32px = 3,2em).
Es wird hier nicht klar erwähnt, aber em sucht im DOM-Baum nach der ersten Schriftgröße.
Warum sollte man seine gesamte Schriftstruktur auf einer so kleinen Schriftgröße basieren? 10px würde erfordern, dass Sie Ihre Schriftgröße bei fast jedem Element auf der Seite ändern, nur um sich selbst ein wenig Mathematik zu sparen?
Was meinen Sie mit dem Ändern der Schriftgröße bei jedem Element?
Wenn Sie „elastische“ oder responsive Schriftgröße wünschen, müssen Sie diese ohnehin für jede Komponente deklarieren, genau wie dieser Artikel zeigt.
Nehmen Sie sich einfach 5 Minuten Zeit und vergleichen Sie die 2 Ansätze. Es geht nicht darum, Mathematik zu vermeiden, sondern darum, die Entwicklung für Ihr Team zu erleichtern.
Sass ist der Hammer!!
besonders wenn man einige Programmierkonzepte wie Funktionen, Variablen, if-Bedingungen usw. kennt.
Ich habe mich nicht viel damit beschäftigt, aber es scheint lebensrettend zu sein.
bezüglich Jesses Kommentar
Jesse hat Recht, dass die Festlegung einer Basisschriftgröße von 10 bei vielen Elementen mehr Anpassungen der Schriftgröße erfordern würde, als notwendig wären, wenn Ihre natürliche Schriftgröße > 10 ist. Es ist falsch zu sagen, dass Sie für eine responsive Website bei jedem Element font-size festlegen müssten.
Betrachten Sie den folgenden Ausschnitt
… Setzen Sie nun die Schriftgröße auf 13px (oder was auch immer Ihre Basisgröße ist)
Wenn Sie die Basisschrift auf 10 setzen (was ziemlich klein ist!), würden Sie am Ende die Schriftgröße für die Klassen rot und blau angeben, wenn Sie möchten, dass sie dem Äquivalent einer Basisgröße außer 10 für normalen Text entsprechen. Das ist zu viel Arbeit im Vergleich zur Verwendung einer Funktion zur Anpassung der Schriftgröße.
Hallo Chris,
Ich liebe dieses Mixin, aber ich frage mich, wie ich es so machen kann, dass es Kurzschriften akzeptiert.
Ich würde es gerne für jede Eigenschaftsmessung verwenden können – z. B. padding: em(10 20 15 0);
Ich glaube, Bourbon und Compass haben das eingebaut, aber ich ziehe es vor, sie nicht zu verwenden, wenn möglich.
Ich frage mich auch, ob es einen Wert hat, in REM statt EM zu konvertieren.
Danke für alles, was Sie tun!
Hallo Travis,
Ich habe den Artikel für Chris geschrieben. Entschuldigung, dass ich das erst jetzt sehe, während ich die Kommentare lese. Dies sind Sass-Funktionen, die etwas weniger flexibel sind als Mixins.
Sie könnten dies derzeit so für Kurzschriften verwenden:
padding: em(10) em(20);, was nicht ganz dem entspricht, wonach Sie fragen, aber die einzige Möglichkeit ist, dies mit den oben genannten Funktionen zu tun. Ich werde sehen, ob ich ein Mixin mit diesen Funktionen ausarbeiten kann und melde mich hier bei Ihnen.Danke!
Und ich habe eine Ihrer Fragen übersehen.
Für ein großartiges REM-Mixin werfen Sie einen Blick auf diesen großartigen Artikel von Hugo Giraudel
Danke, das hilft sehr im Prozess, anstatt ständig einen Taschenrechner benutzen zu müssen!
Hallo Sean/Chris
Wirklich gut gefallen haben mir die Lösungen mit der unitless-Funktion von Sass, aber ich habe festgestellt, dass, wenn der Kontext ein em-Wert ist, immer noch ein px-Wert zurückgegeben wird, anstatt ein em-Wert.
Ich habe das für mich behoben, indem ich zuerst auf die em-Einheit für den Kontext geprüft habe, dann die Einheiten vor der Berechnung entfernt habe und dann das Endergebnis in em umgewandelt habe.
Hier ist ein Pen, um den Unterschied zu veranschaulichen
http://codepen.io/aljaydavids/pen/YwWNGb
Hallo Jero, ich habe deinen Kommentar gelesen und wollte sichergehen, dass ich das von dir beschriebene Problem vermeide, war mir aber nicht sicher, wie ich es reproduzieren kann.
Ich habe versucht, deinem Beispiel zu folgen, war aber immer noch verwirrt.
Kannst du mir helfen zu verstehen, warum in manchen Fällen px zurückgegeben wurden?
Beim Versuch, dies in eine Bootstrap-Vorlage zu implementieren, stieß ich auf dieses Problem: Fehler: Undefinierte Operation: „1rem mal 1.25“.
Hier ist der Code, der das Problem ausgelöst hat
$font-size-context: 15;
$font-size-base: rem($font-size-context);
Als Lösung habe ich diese überarbeitete Version der Funktion gefunden, die es behebt
@function rem( $pixels, $context: $font-size-context ) {
@return ($pixels/$context)*1rem;
}
Nur ein Hinweis an alle anderen, die vielleicht dieses Problem haben, da ich eine Weile den Kopf an die Wand geschlagen habe, um herauszufinden, was los war. Danke für die em()-Idee!
Hier ist die Funktion für rem
Hallo! Ich habe einen großen Zweifel
funktioniert das beim Skalieren von Schriftarten in verschiedenen Ansichten?
da wir die Standardeinstellung immer auf 16px setzen
danke :)
Ich habe gerade :root konfiguriert und die Größen-Props dort gesetzt
Hallo, gibt es eine Möglichkeit, den em()-Wert zu multiplizieren?
Beispiel
$padding: em(10);
Wenn ich em(20) brauche, möchte ich diese Variable multiplizieren.
$padding*2, aber es funktioniert nicht
Vielleicht missverstehe ich etwas, aber widerspricht das nicht dem Zweck der Verwendung von em-Einheiten?
Wenn wir einen statischen $context-Wert festlegen, erbt unser Ziel nicht die Schriftgröße von seinem Vorfahren, wie es „em“-Einheiten tun sollten.
Genauso hier.
Ich vermute, wir sprechen hier über
rem, nicht überem?