Die Schriftgrößen-Einheit rem ähnelt em, nur dass sie anstatt zu kaskadieren immer relativ zum Root (html)-Element ist (weitere Informationen). Dies wird von modernen Browsern recht gut unterstützt, nur für IE 8 und älter müssen wir px-Fallbacks bereitstellen.
Anstatt uns überall zu wiederholen, können wir LESS- oder SASS-Mixins verwenden, um es sauber zu halten. Diese Mixins gehen davon aus,
html {
font-size: 62.5%; /* Sets up the Base 10 stuff */
}
.font-size(@sizeValue) {
@remValue: @sizeValue;
@pxValue: (@sizeValue * 10);
font-size: ~"@{pxValue}px";
font-size: ~"@{remValue}rem";
}
@mixin font-size($sizeValue: 1.6) {
font-size: ($sizeValue * 10) + px;
font-size: $sizeValue + rem;
}
Verwendung
p {
.font-size(13);
}
p {
@include font-size(13);
}
(Danke Gabe Luethje)
Ein weiteres SCSS-Beispiel mit einem anderen Ansatz von Karl Merkli
@function strip-unit($num) {
@return $num / ($num * 0 + 1);
}
@mixin rem-fallback($property, $values...) {
$max: length($values);
$pxValues: '';
$remValues: '';
@for $i from 1 through $max {
$value: strip-unit(nth($values, $i));
$pxValues: #{$pxValues + $value*16}px;
@if $i < $max {
$pxValues: #{$pxValues + " "};
}
}
@for $i from 1 through $max {
$value: strip-unit(nth($values, $i));
$remValues: #{$remValues + $value}rem;
@if $i < $max {
$remValues: #{$remValues + " "};
}
}
#{$property}: $pxValues;
#{$property}: $remValues;
}
Man kann also machen
@include rem-fallback(margin, 10, 20, 30, 40);
und erhält
body {
margin: 160px 320px 480px 640px;
margin: 10rem 20rem 30rem 40rem;
}
Ich finde LESS-Escaping hässlich, daher verwende ich in solchen Fällen
font-size: @pxValue*1px;Wenn sowohl der px-Wert als auch der rem-Wert definiert werden, zeigt der Browser dann beide an oder verwirft er den, den er nicht benötigt.
Auch, wenn der Browser sowohl rem als auch Pixel unterstützt, welchen würde er in diesem Fall verwenden?
Vielen Dank,
Raj
Er würde die zuletzt deklarierte Schriftgröße in Ihrer CSS-Regel verwenden. Deshalb ist es immer gut, die Deklaration der Schriftgröße in px, dann rem anzuordnen.
Auf diese Weise, wenn rem unterstützt wird, überschreibt es px.
und wenn Sie wirklich, wirklich faul sind (wie ich), fügen Sie ein wenig Liebe für die Zeilenhöhe hinzu und verwenden Sie einen grundlegenden Multiplikator von 1,5
SASS ist einfach genial
ein kleiner Hinweis, denken Sie daran, den Wert einzugeben, da es sich um em und nicht um px handelt ;)
.foo{ @include fontsize:(1.5, 2);
Ha! Ich wusste, dass es nur eine Frage der Zeit ist, bis wir hier Präprozessor-Code sehen würden.
Danke Chris und Gabe.
Für robustere Größenanpassungen verwende ich diese Mixins
Rem von bitmanic und in extremen Fällen benutze ich Scale von mrdanadams.
Weiter so.
Vergessen Sie nicht Stylus!
Mixin
Verwendung
*Korrektur
Tabulator-Abstand-Problem.
*eine transparentere Methode unten
Verwendung
ergibt
Vielen Dank dafür!
Seltsamerweise wurden höhere Werte ausgegeben (240px / 24rem statt 24px / 2,4rem), daher habe ich es für meine Zwecke leicht modifiziert
Überrascht, dass niemand kommentiert hat, als Sie die Mathematik korrigiert haben.
Ich habe rems bisher etwas willkürlich verwendet, versuche aber jetzt, sie vor meinem nächsten Update richtig zu implementieren.
Ist der Wert im oberen Beispiel falsch?
Wenn $sizeValue: 1,6, dann sollte der Wert font-size(1,3) und nicht font-size(13) sein. Das würde Jonahs Problem erklären.
SASS-Neuling, also Entschuldigung, wenn ich komplett falsch liege.
Zeilenhöhe sollte am besten einheitenlos angewendet werden, oder?
Sollte der Mixin nicht eher so aussehen
@mixin font-size($sizeValue: 1.6){
font-size: ($sizeValue) + px;
font-size: ($sizeValue/10) + rem;
}
Hallo.
Ich habe den Mixin wie Sie ihn geschrieben haben hinzugefügt, aber im ausgegebenen Code erscheint nur
Sollte es nicht sein
?
Mein Mixin
Und der eingefügte Schnipsel.
Wo liegt der Fehler?
Ich habe gerade eine Sammlung von {less}-Mixins erstellt, um Ihnen bei der Umrechnung von Pixelwerten in Rem zu helfen. Die Sammlung unterstützt Schrift-, Margin-, Padding- und Positionseigenschaften. Ich habe sie erstellt, weil es nichts Ähnliches zu geben scheint, das Coder wie mich unterstützt, die Rem-Einheiten intensiv nutzen. Mehr erfahren unter: https://github.com/christopher-ramirez/remixings
Für Sass-Benutzer habe ich vor einiger Zeit einen Mixin geschrieben (ursprünglich eine Abspaltung von @bitmanics), um Rem-Konvertierungen zu handhaben. Ich bin auf diesen Beitrag gestoßen, während ich nach etwas anderem gesucht habe, aber dachte, andere könnten ihn nützlich finden.
Schöner Mixin Ryan. Habe ihn gerade zum ersten Mal ausprobiert und er funktioniert sehr gut. Besonders gefällt mir die Tatsache, dass er sowohl rem als auch Pixel als Argumente akzeptiert. Vielen Dank.
Gibt es Neuigkeiten, wann dies in Compass integriert wird?
Hallo,
Ich habe mich gefragt, ob es nicht besser wäre, Ihre Lösung umzukehren, um
Ich gehe davon aus, dass die meisten von uns in Pixeln denken und arbeiten (besonders mit Photoshop), daher könnte es intuitiver sein, den Pixelwert anzugeben und dann das Rem zu berechnen, anstatt umgekehrt.
Es ist natürlich eine Frage der Vorliebe. Vielleicht denke ich, wenn ich so fortgeschritten bin wie Sie, in Rem? :) (Binär, jemand?)
Hallo,
Ich frage mich nur, ob jemand diesen Code in Stylus konvertiert hat. Ich habe es versucht und keine Erfolge erzielt.
Danke
Hallo allerseits!
Was ist mit einem Mixin mit einer Körper-Schriftgröße von 100%?
Würde man einfach durch 16 teilen?
Entschuldigung, aber kein Mathe-Ass
Hey Leute,
Gibt es Überlegungen,
emanstelle vonpxals Fallback zu verwenden und dann zwei separate Mixins zu verwenden? Viele meiner Website-Arbeiten verwenden jetzt nur nochems undpxin seltenen Fällen, daher denke ich über einen Mixin wie diesen nach.font-size(@sizeValue, @baseFontSize: 16){
@remValue: @sizeValue;
@pxValue: (@sizeValue * 10);
@emValue:((@pxValue / @baseFontSize));
font-size: ~"@{emValue}em";
font-size: ~"@{remValue}rem";
}
@Sean Der einzige Vorteil von rem gegenüber em ist, dass es vorhersagbarer ist, da es sich auf die Schriftgröße von statt auf die Schriftgröße des aktuellen Elements bezieht. Wenn Sie sich ohnehin mit ems beschäftigen, verwenden Sie einfach ems allein. Der Grund für Fallbacks für rem ist, dass rem von älteren Browsern nicht gut unterstützt wird. Derzeit ist es eine Frage der Wahl: Verwenden Sie rem für Vorhersagbarkeit und Wartbarkeit des Codes, müssen aber Fallbacks in px bereitstellen, oder entscheiden Sie sich einfach für ems und achten Sie auf Ihre Schriftgrößen.
Gah, Tags gestrippt. Das sollte heißen: "em ist, dass es vorhersagbarer ist, da es sich auf die Schriftgröße von html und nicht auf die Schriftgröße des aktuellen Elements bezieht."
Ich bin ein Neuling in Sass und habe nicht viel mehr als die grundlegende Funktionalität von Mixins und Variablen implementiert. Dies ist eine fantastische/effiziente Verwendung, um meinen Rem-Fallback für die Schriftgröße zu schreiben, aber hat jemand Vorschläge, wie ich etwas Universelleres erstellen kann? D.h., ich möchte Rem verwenden (mit einer Basisschriftgröße wie oben gezeigt / wie in http://snook.ca/archives/html_and_css/font-size-with-rem) und nicht für Dinge wie Zeilenhöhe, Padding, Margin, Text-Einzug usw. einen Fallback schreiben müssen?
@Peter Marty Ich habe einen Sass-Mixin für diesen allgemeinen Gebrauch geschrieben: https://github.com/ry5n/rem.
Ich habe eine Lösung zum Ausgeben von Rems mit einem px-Fallback für jede Eigenschaft
https://gist.github.com/4153104/a5f13471af86e9835f18beda817ed772fcd9973a
Einer der Vorteile von rem ist, dass man den gesamten Stil durch Ändern der Basisgröße von html neu skalieren kann. Bei Verwendung dieses Mixins würden jedoch die px-Werte verloren gehen.
Nach einigem Nachdenken habe ich dieses Stück Code entwickelt, das es Ihnen ermöglicht, Schriftgrößen relativ zur Basisschriftgröße hinzuzufügen und diese Basis bei Bedarf zu ändern (entweder mit einem Redesign oder bei Verwendung unterschiedlicher Schriftgrößen für verschiedene Medientypen)
@basefont: 16; html { font-size : ((@basefont * 100) / 16) + 0%; } .font-size (@size) { font-size: (@size * @basefont) + 0px; font-size: @size + 0rem; }Etwas spät, aber ich habe das gerade gelesen und etwas für Sass erstellt, das gut mit den vertikalen Rhythmus-Tools von Compass zusammenarbeitet.
https://gist.github.com/4526784
Es enthält auch eine
rel()-Funktion zur Berechnung von px zu em für alles andere.. .. Ich fühle mich auch mit dem 62,5%-Wert nicht wohl ... der Browser ist standardmäßig auf 100% eingestellt, also warum ihn nicht so lassen und einfach den Divisor auf 16 ändern, wenn das Ergebnis dasselbe ist .... :)
Ich habe festgestellt, dass Funktionen die Stile lesbarer halten als Mixins, also habe ich ein paar geschrieben und bin ziemlich zufrieden mit den Ergebnissen. Unitize ist ein SASS-Partial, das
in
Mir gefällt die Idee dieses Mixins, aber ich stelle fest, dass dies die Verwendung von Kurzschriften ausschließt.
font: italic 100 2rem/2 $font;Wie können wir diese Technik anwenden, ohne die Kurzschriften davon zu undoen
font-size: 2rem;font-size: 20px;
font-weight: 100;
line-height: 2;
font-family: $font;
usw.
Ich stimme zu, Mixins sollen Zeit sparen. Ich denke, die beste Lösung ist, einfach für alles Rem zu verwenden und dieses Rem-Polyfill zu nutzen.
Was ich für px2em verwende (kann mich nicht mehr erinnern, wem ich dafür Credits geben soll) ist
$font-size: 1em !default;
@function em($pxval, $base: 16px) {
@return ($pxval / $base) * $font-size;
}
p { font-size: em(22px) }
Für Stylus-Fans habe ich ein kleines Skript erstellt, das auf Karl Merklis Arbeit basiert. Skript
// Lizenz MIT
// Autor: Jorge Avila jorge.e.avila@gmail.com
Ich habe einen grundlegenden Stylus REM Mixin entwickelt
Auf GitHub ansehen: https://gist.github.com/yoshuawuyts/5693656
Habe vergessen, das Ergebnis hinzuzufügen, hier ist es
Danke für den Beitrag. Dies inspirierte den folgenden Mixin, der eine Liste von beliebigen Eigenschaften mit einem rem/em-Wert nimmt und einen px-Fallback erstellt.
Verwendung
Andere
Beachten Sie die " * 16px " im Mixin? Wenn Ihre Basis-em-Einheit nicht 16px ist, ändern Sie diese.
Wenn jemand nach einer umfassenderen / refaktorierten Version meines obigen Mixins sucht, hoffe ich, dass die folgende für Sie nützlich ist. Sie enthält eine strip-unit()-Funktion, eine rem()-Funktion und einen ähnlichen Rem-Mixin wie oben.
Verwendung
Ausgabe
Entschuldigung, Mathematikfehler. Zeile 8 von @function rem sollte sein...
Für Interessierte habe ich eine Familie von Funktionen zur Berechnung von Dimensionen erstellt. Die Rem-Funktion und der Mixin sind enthalten.
Sehen Sie hier: sass-dimension
Eine Handvoll nützlicher Funktionen, die eine gemeinsame, praktische Schnittstelle für Dimensionsberechnungen bieten.
Ich habe auch mit einem Grid-System begonnen, da es ein guter Testfall für die Dimensionsfunktionen zu sein schien. Ich muss zugeben, dass ich nicht genug andere Grids verwendet habe, um alle ihre Vorzüge zu kennen oder ob meines besser ist, aber ich beginne, es Susy oder Foundation vorzuziehen (obwohl es sicherlich nicht produktionsreif ist).
Kann mir jemand bitte sagen, was die folgende Codezeile macht?
Meine vorherige Frage zurücknehmen. Habe gerade verstanden, was die strip-unit-Funktion macht.
Für mich ist es einfacher, einen pixelbasierten Parameter zu übergeben und Sass ihn in Rem umwandeln zu lassen.
Ich kann immer noch in Pixel denken, aber mein Code gibt Rems aus.
Dies sollte zurückgeben
Wenn px-Fallbacks für die Website, auf der Sie arbeiten, nicht benötigt werden, kann Karls Mixin gekürzt werden auf
Es gibt eine ähnliche emCalc-Funktion in Zurb's Foundation, aber diese ist weitaus leistungsfähiger!
Genau das macht die von mir gepostete Bibliothek, außer dass Sie jede Art von Einheit an den Mixin übergeben können und er einen px-Fallback mit einem ebenfalls gesetzten Rem-Wert ausgibt.
Mit anderen Worten, wenn 1rem = 1em = 16px…
würde ausgeben
Beachten Sie, dass px, rem und em Einheiten an den Mixin übergeben werden, aber nur px-Fallbacks und rem-Dimensionen erstellt werden.
Ich habe die Bibliothek sass-dimension tatsächlich in sass-unity umbenannt, weil es darum geht, eine gemeinsame Schnittstelle für die Berechnung/Konvertierung von Einheiten zu haben. Sie hat eine "unity"-Funktion, die eine Liste von Einheiten normalisiert
Ich weiß, es ist im Moment einfacher, in Pixeln zu denken, weil wir das schon so lange tun, aber wir sollten vielleicht vom Beginn des Codes an in Skalen denken. Wir sollten vielleicht denken: "Diese Box sollte das 4-fache einer variablen Basislinie (16) sein, nicht immer 64 (4x16)."
Es war für mich schwierig zu wissen, was die Geräte von uns erwarten werden. DPI ist einer der Marketingkämpfe, und Lesbarkeit ist etwas wichtig, daher denke ich, dass selbst diejenigen von uns, die noch nicht konvertiert haben, einen heimlichen Verdacht haben, dass Pixel etwas zu starr sind; ich bin jedoch auch der Meinung, dass ems zu instabil sind, um sie für Dimensionen (hauptsächlich Höhe und Breite) zu verwenden. Mit Rem können wir einen Dreh- und Angelpunkt haben, anstatt Bindungen (px) oder unvorhersehbares (em).
Basierend auf dem Ansatz von Karl Merkli oben, ermöglicht dieses kleine Schmuckstück Basis-10-Berechnungen unter Beibehaltung der Standard-Schriftgröße des Browsers (der angenommenen 16 Pixel-Standard)... denn Mathematik ist Mist. Es erfordert auch keine "strip-unit"-Direktive.
Siehe das Gist.
Sie sollten den einheitenlosen Wert mit 1 Einheit multiplizieren, anstatt die Einheit direkt anzuhängen, was zu einem String führt.
Ich habe heute einen kurzen Blogbeitrag darüber geschrieben.
Chris, ich glaube, in der Verwendung gibt es einen Fehler, oder? Sollte es nicht sein
.font-size(1.3);
anstelle von
.font-size(13);
Nicht wahr?
Weil es auf meiner Website riesig aussieht, wenn es 13 ist. Und der Mixin multipliziert mit 10...
Oder übersehe ich hier etwas! :D
@migswd: Um .font-size(13) zu verwenden, müssen Sie die Mixins anpassen auf
Hey Leute! Ich fand den Rem-Fallback-Mixin wirklich großartig, aber er handhabte keine Werte wie "auto", wandelte "em"-Werte in "rem"s um, und ich habe keine Ahnung, wie er einen Prozentsatz behandeln würde. Um dies auszugleichen, habe ich den Mixin modifiziert und etwas kürzer gestaltet. Hoffe, es hilft anderen Leuten!
Hey – Korrigieren Sie mich, wenn ich falsch liege. Aber sollte der Beispiel-LESS-Mixin nicht
und
Das Beispiel verwendet px, aber der Mixin multipliziert den Wert anstatt ihn zu dividieren.
Victor – richtig für den LESS-Mixin.
Aber WARUM setzen wir html auf 62,5%? Ich könnte es verstehen, wenn wir Berechnungen auf Papier oder mit einem Taschenrechner durchführen müssten – wir führen keine Berechnungen durch – LESS, SASS oder Stylus erledigen die Arbeit.
Wir müssen uns nur daran erinnern, dass unabhängig davon, wie wir unser HTML einstellen, der Pixelwert 1 Rem entspricht.
16px (100% auf html) bedeutet 16px = 1 rem
Daher wird unser Mixin (für LESS) zu
Müssen wir die Dinge so kompliziert machen? Oder verpasse ich hier völlig den Punkt?
Mein Versuch, einen LESS-Mixin mit einigen Variablen zu erstellen.
Altes Thema, aber vielleicht nützlich für jemanden anderes
@mixin px-to-rem($org) { font-size: $org + px; font-size: ($org/16) + rem; } p { @include px-to-rem(15); } /* Compiled output */ p { font-size: 15px; font-size: 0.9375rem; }@mixin rempx($value){
font-size: $value + px;
font-size:($value / 10) + rem;
}
p{
@include rempx(16);
}
Die Beispiele gehen also davon aus, dass Sie die Absatzschriftgröße auf 130px einstellen möchten?
Großartige Arbeit hier, wie immer, und danke für Ihre ständige Inspiration! Ich habe eine Frage zur responsiven Entwicklung mit rem
Snooks berühmter Artikel zeigt die Änderung der Root-Schriftgröße an jedem Breakpoint, aber eine Funktion wie diese müsste jedes Mal angepasst werden, da sie 1,6 als Basis verwendet, richtig? Wie können wir etwas wie dieses erstellen, das auch die Änderung der Root-Schriftgröße bei verschiedenen Auflösungen ermöglicht?
Ich denke, Sie können Media Queries verwenden, um die Root-Schriftgröße einfach anzupassen.
Hallo Jungs, ich wollte nur eure Meinung zu diesem Sass-Mixin hören, damit muss man die html-Schriftgröße nicht auf 62,5% setzen
Danke. Ergibt vollkommen Sinn. Großartig
Der SCSS-Include hat bei mir nicht funktioniert. Aber dieser hier schon
@include font-size(1.4);
Was ist los?
Die Beispiel-@include ist falsch, die Mixin-Funktion im Beispiel geht davon aus, dass Sie einen Rem-Wert eingeben, nicht einen px-Wert (wie das Beispiel @include getan hat). Um px in Ihrer @include-Anweisung zu verwenden, müssen Sie den Basiswert von 1,6 auf 16 ändern, Rem durch 16 teilen und den Teil * 10 für die px entfernen. ^^
Hallo,
Ich habe einen SCSS-Code im Web gefunden und ihn angepasst.
Zuerst
Mit dem Mixin können wir dies konvertieren
Zu
Aber ich habe einige Funktionen hinzugefügt.
1. Nur in Pixel umwandeln.
Zu
Nur in Rem umwandeln
In Pixel und Rem umwandeln.
Aber wenn ich jeder Variablen den Wert 'false' gebe, erhalte ich einen Fehler (auf codepen.io).
Es ist vielleicht nicht die am meisten gewünschte Funktion, aber es ist für ein CSS-Framework. Und es ist vielleicht nützlich für andere oder zum Erlernen von SCSS (wie man if-else-Anweisungen verwendet, um erweiterte SCSS-Mixins zu erstellen).
~ Entschuldigung für mein schlechtes Englisch.
Entschuldigung, habe vergessen, den Codepen-Link einzufügen.
http://codepen.io/cyrildewit/pen/YwvErx
Sass-Version von px zu rem…
Sass-Version
LESS-Version
Der LESS-Mixin hat meine Schriften riesig gemacht, also habe ich ihn umgebaut.
Von diesem:
@remValue: @sizeValue;
@pxValue: (@sizeValue * 10);
Zu diesem:
@remValue: @sizeValue / 10;
@pxValue: (@sizeValue);
Und den Rest so gelassen.
Hallo, Ihr Mixin ist nützlich, aber ich benutze meinen eigenen.
Mein Mixin kann perfekte Zeilenhöhe und maximale Breite, berechnet nach unterschiedlicher Schriftgröße, einstellen. Es ist wirklich nützlich und einfach für die Entwicklung, denn um eine Option zu aktivieren, müssen wir 1 oder ja schreiben :)
Ich denke, das ist mein bester Mixin.
Hallo zusammen,
Ich benutze Karl Merklis Ansatz.
Ich habe eine Frage: Wenn meine 16px-Schriftgröße auf mobilen Geräten 14px wird, wie kann ich das Rem auf 14px berechnen?
Danke
Max