Ich dachte, ich wüsste das. Ich habe den sass
Schreibstil im Grunde schon früher beim Schreiben von Projekten in der Firma verwendet, was sehr flüssig war. Bis vor einiger Zeit wollte ich Element Plus
die Konstruktionsstruktur meiner eigenen Komponentenbibliothek anhand von Referenzen entwerfen, aber als ich Element Plus
diese eleganten sass
Verwendungen sah, begann ich mich für meine Oberflächlichkeit und Unwissenheit zu schämen. Dies fing an, systematisch zu studieren.Während sass
dieser Zeit wollte ich viele Male über Lernen und Teilen schreiben, aber alle endeten ohne Probleme aufgrund verschiedener Dinge. Heute habe ich endlich ein wenig Zeit aus meinem vollen Terminkalender herausgeschmuggelt, gerade rechtzeitig, um meine Ermutigung mit Ihnen zu teilen.
1. Einleitung
Als extrem ausgereifter css
Präprozessor verfügt er sass
über viele spezielle Funktionen, die uns helfen, eleganteren und prägnanteren Code zu schreiben. Es css
hat zuvor Style-Variablen eingeführt und unterstützt auch Funktionen wie Verschachtelung, Funktionen, Mischen und Befehlssteuerung, was das Style-Gameplay erheblich erweitert.
sass
Es gibt zwei Syntaxformen: SCSS
und Sass
.
Darunter ist es ein derzeit SCSS
weit verbreitetes Format, das sich nur auf der Grammatikbasis CSS3
von erweitert .Sass
CSS hacks
vendor-specific syntax
.scss
Es istSass
das früheste grammatikalische Format mit Einrückungen statt geschweiften Klammern und Zeilenumbrüchen statt Semikolons, das Format ist besonders prägnant und das Schreiben bequemer. Dieses Format unterstützt ebenfalls alle Funktionen, verwendet jedoch Sass
an einigen Stellen SCSS
einen anderen Ausdruck und seine Dateierweiterung heißt .sass
.
Beide Formate können zur Verwendung in eine Datei eines anderen Formats importiert (@import) und auch sass-convert
über ein Befehlszeilentool in ein anderes Format konvertiert werden.
# Sass转为SCSS
sass-convert style.sass style.scss
# SCSS转为Sass
sass-convert style.scss style.sass
Ich werde die Sass
Installation und Verwendung hier nicht vorstellen, schließlich werden die meisten Projekte jetzt webpack
mit anderen Konstruktionswerkzeugen gepackt und gebaut, ergänzt durch entsprechende und loader
andere Werkzeuge, die bei der Kompilierung helfen. Es sollte nur sehr wenige Projekte geben, die sass
Befehle auf der Befehlszeile verwenden müssen, um Stildateien zu kompilieren.
Erwähnenswert ist jedoch das Kodierungsformat . Wie bei CSS
können Sie verwenden @hcarset
, um ein bestimmtes Kodierungsformat zu deklarieren: Fügen Sie es am Anfang der Stildatei (am ersten Zeichen) @charset "encoding-name"
ein, und Sass
die Datei wird gemäß dem angegebenen Kodierungsformat kompiliert. Natürlich muss das verwendete Kodierungsformat in einen Unicode
Zeichensatz konvertierbar sein. Sass
Geben Sie die Datei in UTF-8
encoding aus und fügen Sie der Ausgabedatei eine Deklaration hinzu, CSS
wenn in der kompilierten Datei Nichtzeichen vorkommen .ASCII
@charset
2. Basisfunktionserweiterung
1. Verschachtelte RegelnNested Rules
Sass
Es unterstützt das CSS
Einbetten eines Satzes von Stilen in einen anderen Satz von CSS
Stilen, und der innere Stil verwendet den äußeren Selektor als übergeordneten Selektor.
#main p {
color: #00ff00;
width: 97%;
.redbox {
background-color: #ff0000;
color: #000000;}
}
Diese würde Sass
wie folgt zusammengestellt CSS
:
#main p {
color: #00ff00;
width: 97%;
}
#main p .redbox {
background-color: #ff0000;
color: #000000;
}
Die Verschachtelungsfunktion reduziert die Codemenge erheblich, wir müssen nicht mehr wiederholt umständliche Elternselektoren schreiben und sie ist einfach zu verwalten.
2. Elternauswahl &
( Referencing Parent Selectors: &
)
Wenn Sie beim Verschachteln auf den übergeordneten Selektor verweisen müssen, z. B. wenn Sie einen :hover
Stil für ein Element festlegen, oder wenn body
ein Element einen bestimmten Wert classname
hat, kann es &
verwendet werden, um auf den übergeordneten Selektor zu verweisen, dh seinen äußeren Selektor.
a {
font-weight: bold;
text-decoration: none;
// & 引用父元素&:hover { text-decoration: underline; }
// body.firefox 可以直接引用
body.firefox & { font-weight: normal; }
}
wird Sass
wie folgt zusammengestellt CSS
:
a {
font-weight: bold;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
body.firefox a {
font-weight: normal;
}
&
Muss das erste Zeichen eines Selektors sein, aber es können Suffixe folgen, um zusammengesetzte Selektoren zu generieren :
#main {
color: black;
// #main-sidebar 字符串拼接,这就有点好玩了&-sidebar { border: 1px solid; }
}
Dies würde kompiliert zu:
#main {
color: black;
}
#main-sidebar {
border: 1px solid;
}
3. Verschachtelung von AttributenNested Properties
Einige CSS
folgen demselben Namensraum ( namespace
), z. B. font-family, font-size, font-weight
haben beide font
Namensräume als Attribute. Derzeit dürfen Attribute zur Vereinfachung des Schreibens und zur bequemen Verwaltung Sass
in Namespaces verschachtelt werden:
.funky {
// 注意命名空间这里要加冒号
font: {
family: fantasy;
size: 30em;
weight: bold;}
}
kompiliert wie folgt CSS
:
.funky {
font-family: fantasy;
font-size: 30em;
font-weight: bold;
}
Darunter kann der Namensraum auch eigene Attributwerte enthalten:
.funky {
// font-size/line-height
font: 20px/24px {
family: fantasy;
weight: bold;}
}
kompiliert zu:
.funky {
/* font-size/line-height */
font: 20px/24px;
font-family: fantasy;
font-weight: bold;
}
4. Platzhalterauswahl %foo
( Placeholder Selectors
: %foo
)
Platzhalterselektoren ähneln id
Selektoren und class
Selektoren, außer dass das Symbol %
, ist und @extend
durch Anweisungen aufgerufen werden muss, andernfalls werden sie nicht an Sass
der Kompilierung teilnehmen.
5. NotizenComments
Sass
Es werden sowohl einzeilige als auch //
mehrzeilige Kommentare unterstützt /* */
. Mehrzeilige Kommentare werden vollständig in die kompilierte CSS
Datei ausgegeben . !
Wird das erste Zeichen eines mehrzeiligen Kommentars sein bedeutet , diesen Kommentar im komprimierten Ausgabemodus zu belassen und ihn in die Datei auszugeben, die normalerweise zum Hinzufügen von Copyright-Informationen verwendet wird. Interpolationsanweisungen ( ) können Variablenwerte in mehrzeiligen Kommentaren ausgeben. (Zur Interpolation verwenden.)CSS
interpolation
#{$val}
// Sass
$version: "1.2.3";
/* This CSS is generated by My Snazzy Framework version #{$version}. */
// 编译为CSS:
/* This CSS is generated by My Snazzy Framework version 1.2.3. */
3. Erweiterte Funktionserweiterung
1.SassScript
Sass
Bietet eine SassScript
leistungsstarke Funktion namens , die auf jedes Attribut angewendet werden kann und es Attributen ermöglicht, zusätzliche Funktionen wie Variablen und arithmetische Operationen zu verwenden.
1.1Interactive Shell
Interactive Shell
Funktionen , die auf der Befehlszeile getestet werden können SassScript
. Geben Sie in der Befehlszeile ein sass -i
und geben Sie dann ein, was Sie testen möchten, um SassScript
die Ausgabe anzuzeigen.
sass -i
>> "Hello, Sassy World!"
"Hello, Sassy World!"
>> 1px + 1px + 1px
3px
>> #777 + #777
#eeeeee
>> #777 + #888
white
1.2 Variablen$
Variables: $
Die Verwendung von Variablen ist sehr einfach:
// 声明变量
$width: 5em;
#main {// 使用变量
width: $width;
}
Variablen haben einen Gültigkeitsbereich auf Blockebene , und Variablen in verschachtelten Regeln sind lokale Variablen, die nur in verschachtelten Regeln verwendet werden können. Globale Variablen können überall verwendet werden. Das Hinzufügen !global
einer Deklaration verwandelt eine lokale Variable in eine globale Variable .
// Sass
#main {// !global声明,转换为全局变量
$width: 5em !global;
width: $width;
}
#sidebar {
// 使用全局变量
width: $width;
}
// 编译为CSS:
#main {
width: 5em;
}
#sidebar {
width: 5em;
}
1.3 DatentypenData Types
SassScript
7
Die wichtigsten Datentypen werden unterstützt :
- Zahlen, mit Einheiten
1, 2, 3, 6, 10px
usw.; - string (sowohl in Anführungszeichen als auch ohne Anführungszeichen werden unterstützt),
"foo", "bar", baz
; - Farbe
blue, #04a3f9, rgba(255,0,0,0.5)
usw.; - boolesch,
true, false
; - NULL,
null
; - Array (
list
), mit Leerzeichen oder Kommas als Trennzeichen,1.5em 1em 0 2em, Helvetica, Arial, sans-serif
; maps
, was äquivalent ist zuJS
woObject
,(key1: value1, key2: value2)
.
Darüber hinaus werden SassScript
auch andere CSS
Attributwerte wie Unicode
Zeichensätze oder !important
Deklarationen unterstützt, diese werden jedoch nicht gesondert behandelt, sondern als Zeichenfolgen ohne Anführungszeichen behandelt.
1.3.1 Saiten
SassScript
Sowohl Strings in Anführungszeichen ( ) als auch Strings ohne Anführungszeichen ( ) werdenquoted strings
unterstützt . Diese beiden Zeichenfolgen werden zur Kompilierzeit nicht ineinander konvertiert, außer in einem Fall: Bei Verwendung von ( ) wird die Zeichenfolge in Anführungszeichen in eine Zeichenfolge ohne Anführungszeichen kompiliert, was praktisch ist, um den Selektornamen in Anführungszeichen zu setzen.unquoted strings
#{}
interpolation
mixin
// Sass
@mixin firefox-message($selector) {
body.firefox #{$selector}:before {
content: "Hi, Firefox users!";}
}
@include firefox-message(".header");
// 编译为CSS
body.firefox .header:before {
content: "Hi, Firefox users!";
}
1.3.2 Array ( lists
)
Ein Array bezieht sich darauf, Sass
wie eine Reihe von Werten CSS
in margin: 10px 15px 0 0
oder font-face: Helvetica, Arial, sans-serif
durch Leerzeichen oder Kommas getrennt behandelt werden. Tatsächlich werden einzelne Werte auch als Arrays behandelt, die nur einen Wert enthalten.
Das Array selbst hat nicht viele Funktionen, aber Sass list functions
es bringt viele neue Funktionen in das Array: nth
Funktionen können direkt auf ein Element im Array zugreifen; join
Funktionen können mehrere Arrays miteinander verbinden; append
Funktionen können dem Array neue Werte hinzufügen; @each
Funktionen kann jedes Element im Array durchlaufen.
Arrays können Unter-Arrays enthalten: Beispielsweise 1px 2px, 5px 6px
ist , das zwei1px 2px
Arrays von und enthält. 5px 6px
Wenn die inneren und äußeren Arrays dieselbe Trennmethode verwenden, müssen Sie Klammern verwenden, um die innere Schicht zu umschließen, z . B. (1px 2px) (5px 6px)
. Klammern werden während der Kompilierung nicht beibehalten, egal wie sie geschrieben werden 1px 2px, 5px 6px
oder (1px 2px) (5px 6px)
das endgültige Kompilierungsergebnis ist dasselbe, aber sie Sass
haben unterschiedliche Bedeutungen in der Datei, ersteres bedeutet ein Array mit vier Werten und letzteres bedeutet ein Array enthält zwei Es kann gesagt werden, dass die Klammern das Konzept der "Gruppierung" betonen.
()
Wird zur Darstellung eines leeren Arrays verwendet und kann auch empty darstellen map
. Leere Arrays werden nicht direkt kompiliert CSS
, und wenn es leere Arrays oder Nullwerte im Array gibt, werden sie zur Kompilierzeit gelöscht. Wie 1px 2px () 3px
oder 1px 2px null 3px
. Kommagetrennte Arrays dürfen das abschließende Komma beibehalten, was die strukturelle Beziehung des Arrays hervorheben soll, insbesondere wenn es notwendig ist, ein Array zu deklarieren, das nur einen einzigen Wert enthält. (1,)
Stellt beispielsweise 1
ein Array dar, das nur .
1.3.3maps
map
ist eine Sammlung von Schlüssel-Wert-Paaren, key
und value
beide können beliebige SassScript
Objekte sein. Es und list
beide arbeiten mit Funktionen. Beispielsweise können map-get
Funktionen verwendet werden, um Schlüsselwerte nachzuschlagen, Funktionen können map-merge
verwendet werden, um neue Schlüsselwertpaare hinzuzufügen, und @each
Direktiven können verwendet werden, um Stile zu jedem Schlüsselwertpaar hinzuzufügen. map
Es kann überall verwendet werden, wo es verwendet werden kann list
, aber nicht umgekehrt. Wenn map
es list
in Funktionen verwendet wird, wird es als key1 value1, key2 value2
Array des Formulars behandelt.
1.3.4 Farbe
Jeder CSS
Farbausdruck gibt einen SassScript
Farbwert zurück. unquoted strings
Diese enthält eine große Anzahl benannter Farben (oft nicht von Zeichenfolgen ohne Anführungszeichen zu unterscheiden).
1.4 BetriebOperations
Alle Datentypen unterstützen die Gleichheitsoperation ==
OR !=
, zusätzlich hat jeder Datentyp auch seine eigene Operationsmethode.
1.4.1 Numerische OperationenNumber Operations
SassScript
Unterstützt Addition, Subtraktion, Multiplikation und Division sowie Rundungsoperationen ( +, -, *, /, %
) und konvertiert bei Bedarf Werte zwischen Einheiten. Der Vergleichsoperator ( >, <, >=, <=
) kann auch für numerische Operationen verwendet werden.
// Sass
p {
width: 1in + 8pt;
}
// 编译为:
p {
width: 1.111in;
}
- Divisionsbetrieb
/
Die Divisionsoperation verdient eine gesonderte Erwähnung. Denn /
Symbole CSS
spielen normalerweise die Rolle, Zahlen in zu trennen. In SassScript
, /
nicht nur zum Trennen von Zahlen, sondern auch für Divisionsoperationen. In den folgenden drei Fällen handelt /
es sich um einen Teilungsvorgang:
- wenn der Wert oder Teil eines Werts eine Variable oder der Rückgabewert einer Funktion ist;
- Wenn der Wert in Klammern eingeschlossen ist;
- Wenn der Wert Teil eines arithmetischen Ausdrucks ist.
// Sass
p {
font: 10px/8px; // 普通的CSS
$width: 1000px;
width: $width/2; // 使用了变量,是除法运算
width: round(1.5)/2; // 函数返回值,是除法运算
height: (500px/2); // 使用圆括号,是除法运算
margin-left: 5px + 8px/2px; // 算数运算表达式的一部分,是除法运算
}
// 编译为CSS
p {
font: 10px/8px;
width: 500px;
height: 250px;
margin-left: 9px;
}
Wenn Sie eine Variable verwenden müssen und nicht möchten, /
dass sie als Divisionsoperator verwendet wird, können Sie #{}
die Variable umschließen mit:
// Sass
p {$font-size: 12px;$line-height: 30px;font: #{$font-size}/#{$line-height};
}
// 编译为CSS
p {font: 12px/30px;
}
1.4.2 FarbwertoperationColor Operations
Die Berechnung des Farbwerts erfolgt abschnittsweise, das heißt, R, G, B
die Werte werden separat berechnet.
p {
color: #010203 + #040506;
}
In Stücken berechnet 01 + 04 = 05
02 + 05 = 07
03 + 06 = 09
, dann kompiliert als:
p {
color: #050709;
}
verwendet werden color functions
, was etwas bequemer ist als Farbberechnungen.
Farbwerte können auch mit numerischen Operationen kombiniert werden:
p {
color: #010203 * 2;
}
// 计算 01 * 2 = 02 02 * 2 = 04 03 * 2 = 06,然后编译为:
p {
color: #020406;
}
Es ist zu beachten, dass, wenn der Farbwert enthält alpha channel
, der an der Berechnung beteiligte Farbwert denselben alpha
Wert haben muss, um die Operation auszuführen, da die arithmetische Operation nicht auf den alpha
Wert wirkt.
p {
// 需要保证有相同的alpha值color: rgba(255, 0, 0, 0.75) + rgba(0, 255, 0, 0.75);
}
Der Wert im Farbwert alpha
kann über die Funktion opacity
oder angepasst werden transparentize
.
// Sass
$translucent-red: rgba(255, 0, 0, 0.5);
p {
color: opacify($translucent-red, 0.3);
background-color: transparentize($translucent-red, 0.25);
}
// 被编译为:
p {
color: rgba(255, 0, 0, 0.8);
background-color: rgba(255, 0, 0, 0.25);
}
1.4.3 String-OperationenString Operations
Verwenden Sie eine +
Verkettungszeichenfolge; +
der Wert auf der linken Seite bestimmt, ob das endgültige kompilierte Ergebnis in Anführungszeichen oder nicht in Anführungszeichen gesetzt wird.
Wenn der Operationsausdruck in Verbindung mit anderen Werten verwendet wird, verwenden Sie Leerzeichen als Konnektoren:
p {
margin: 3px + 4px auto;
}
// 编译为:
p {
margin: 7px auto;
}
Sie können #{}
dynamische Werte einfügen mit:
$value: null;
p:before {content: "I ate #{$value} pies!";
}
// 编译为CSS:
p:before {content: "I ate pies!";
}
1.4.4 Boolesche OperationenBoolean Operations
Unterstützung für boolesche Operationen and
, or
, not
.
1.4.5 Array-Operation
Arrays unterstützen keine direkten Operationen und können nur list functions
mit manipuliert werden.
1.5 Klammern(Parentheses)
Klammern werden zuerst gezählt.
1.6 FunktionenFunctions
SassScript
Es sind viele Funktionen eingebaut, einige können sogar CSS
mit gewöhnlichen Anweisungen aufgerufen werden:
p {
color: hsl(0, 100%, 50%);
}
// 编译为:
p {
color: #ff0000;
}
- Schlüsselwortargumente
Keyword Arguments
Sass
Funktionen erlauben Schlüsselwortargumente, das obige Beispiel kann wie folgt geschrieben werden:
p {
color: hsl($hue: 0, $saturation: 100%, $lightness: 50%);
}
Sass
Es gibt viele eingebaute Funktionen, daher werde ich sie hier nicht erweitern.
1.7 InterpolationsanweisungenInterpolation #{}
Variablen können #{}
in Selektoren oder Eigenschaftsnamen verwendet werden über:
$name: foo;
$attr: border;
p.#{$name} {#{$attr}-color: blue;
}
// 编译为:
p.foo {border-color: blue;
}
SassScript
im 1.8&
&
Stellt den übergeordneten Selektor dar. Wie folgt, &
der Wert von ((".foo.bar" ".baz.bang"), ".bip.qux")
.
.foo.bar .baz.bang, .bip.qux {$selector: &;
}
Wenn es keinen übergeordneten Selektor gibt, ist &
der Wert null
. Dies kann angewendet werden mixin
, um zu erkennen, ob es einen übergeordneten Selektor gibt:
@mixin does-parent-exist {
@if & {
// 有父选择器
&:hover {
color: red;
}} @else {
// 没有父选择器
a {
color: red;
}}
}
1.9 Variablenvorgabewert ( Variable Defaults
):!default
Das Hinzufügen am Ende einer Variablen !default
kann verwendet werden, um !default
einer Variablen, der keine Deklaration zugewiesen wurde, einen Wert zuzuweisen. null
Die Zuweisung funktioniert nur, wenn der Variablen kein Wert oder ein Nullwert zugewiesen wurde !default
.
$content: "First content";
// 变量已被赋值,无效
$content: "Second content?" !default;
$new_content: "First time reference" !default;
#main {
content: $content;
new-content: $new_content;
}
// 编译为:
#main {
content: "First content";
new-content: "First time reference";
}
2. @-Rules
mit dem Befehl ( Directives
)
Sass
Alle CSS3 @-Rules
sowie Sass
bestimmte Direktiven ( directives
) werden unterstützt.
2.1@import
Sass
Erweiterte @import
Funktionalität zum Importieren .scss
und .sass
Ablegen. Die importierten Dateien werden zusammengeführt und in dieselbe CSS
Datei kompiliert. Darüber hinaus können in der importierten Datei enthaltene Variablen in der importierten Datei mixin
verfügbar sein oder nicht.
Im Allgemeinen wird die Datei @import
gefunden Sass
und importiert, mit den folgenden Ausnahmen, die als normale CSS
Syntax behandelt werden:
- Die Dateierweiterung ist
.css
; - Dateinamen
http://
beginnen mit; - Der Dateiname ist
url()
; @import
enthaltenmedia queries
.
Es ist erlaubt, mehrere Dateien gleichzeitig zu importieren. Wenn keine Erweiterung geschrieben wird, wird versucht, .scss
oder .sass
die Datei mit demselben Namen zu finden.
@import "rounded-corners", "text-shadow";
Importdateien können auch Interpolationsanweisungen verwenden #{}
, jedoch nur für CSS
die url()
Importmethode.
$family: unquote("Droid+Sans");
@import url("http://fonts.googleapis.com/css?family=#{$family}");
// 编译为:
@import url("http://fonts.googleapis.com/css?family=Droid+Sans");
@imports
Es gibt auch zwei spezielle Verwendungen: Partials und Nesting .
- Membran (
Partials
)
Manchmal möchten Sie Sass
eine Datei importieren, sie aber nicht als kompilieren CSS
, Sie können einen Unterstrich vor dem Dateinamen hinzufügen, der Ihnen mitteilt, dass Sass
Sie sie nicht kompilieren sollen. Beachten Sie, dass der Unterstrich in der Importanweisung nicht erforderlich ist. Wenn die Datei beispielsweise den Namen _colors.scss
trägt, importiert der folgende Code die _colors.scss
Datei und wird nicht als kompiliert CSS
.
@import "colors";
Es sollte beachtet werden, dass, wenn es Dateien mit demselben Namen gibt, die führende Unterstriche enthalten, und Dateien, die keine führenden Unterstriche enthalten, die Dateien, die Unterstriche hinzufügen, ignoriert werden.
- Verschachtelung
@import
In den meisten Szenarien verwenden wir es auf der obersten Ebene der Datei @imports
. Tatsächlich kann die Verschachtelung auch @imports
in CSS
Stile oder verschachtelt werden @media
. Der Unterschied zur Verwendung in der obersten Ebene besteht darin, dass der so importierte Stil nur in der verschachtelten Ebene erscheinen kann, was als „lokaler Geltungsbereich“ zu verstehen ist.
// example.scss
.example {
color: red;
}
// main.scss
#main {
@import "example";
}
wird schließlich kompiliert zu:
#main .example {
color: red;
}
Es sollte jedoch beachtet werden, dass in den Dateien, die von diesem verschachtelten Formular @import
importiert werden, keine Anweisungen der obersten Ebene wie @mixin
usw. enthalten sein sollten.@charset
2.2@media
Sass
ist das @media
gleiche CSS
wie in , mit zusätzlichen neuen Funktionen:
- Es darf
CSS
innerhalb von Regeln verschachtelt werden. Wenn es@media
inCSS
eine Regel verschachtelt ist, wird es beim Kompilieren in die äußerste Ebene der Datei kompiliert und enthält den übergeordneten Selektor, wenn es zuvor verschachtelt war, was sehr praktisch ist.
// Sass
.sidebar {
width: 300px;
@media screen and (orientation: landscape) {
width: 500px;}
}
// 编译为
.sidebar {
width: 300px;
}
@media screen and (orientation: landscape) {
.sidebar {
width: 500px; }
}
@media
Verschachtelung ist erlaubtqueries
, was automatisch zur Kompilierzeit hinzugefügt wirdand
.
@media screen {
.sidebar {
@media (orientation: landscape) {
width: 500px;
}}
}
// 编译为
@media screen and (orientation: landscape) {
.sidebar {
width: 500px; }
}
- Sie können
SassScript
(Variable, Funktion usw.) anstelle des Namens oder Werts der Bedingung verwenden.
$media: screen;
$feature: -webkit-min-device-pixel-ratio;
$value: 1.5;
@media #{$media} and ($feature: $value) {
.sidebar {
width: 500px;}
}
// 编译为
@media screen and (-webkit-min-device-pixel-ratio: 1.5) {
.sidebar {
width: 500px; }
}
2.3@extend
@extend
Ein Selektor kann dazu gebracht werden, den Stil eines anderen Selektors über zu erben .
.error {
border: 1px #f00;
background-color: #fdd;
}
.error.intrusion {
background-image: url("/image/hacked.png");
}
.seriousError {
// 继承,此时所有使用到 .error 的样式都会被继承过来
@extend .error;
border-width: 3px;
}
// 编译为
.error, .seriousError {
border: 1px #f00;
background-color: #fdd; }
.error.intrusion, .seriousError.intrusion {
background-image: url("/image/hacked.png");
}
.seriousError {
border-width: 3px;
}
Placeholder Selectors
Platzhalterauswahl
Manchmal ist es notwendig, eine Reihe von Stilen für die Vererbung zu definieren, nicht für ein bestimmtes Element, und wir hoffen, dass es nicht Sass
separat kompiliert und ausgegeben wird. Diese Art von Szene tritt häufiger auf, wenn eine Sass
Stilbibliothek erstellt wird. So wurde der Platzhalterselektor geboren. Seine Verwendung ist fast identisch id
mit Selektor oder class
Selektor, die Selektornotation ist %
. Bei alleiniger Verwendung werden Platzhalterselektoren Sass
ignoriert und nicht in die Ausgabedatei kompiliert.
// 不会被编译到输出文件中
#context a%extreme {
color: blue;
font-weight: bold;
font-size: 2em;
}
Es muss @extend
verwendet werden von:
.notice {
@extend %extreme;
}
// 被编译为
#context a.notice {
color: blue;
font-weight: bold;
font-size: 2em;
}
!optional
Aussage
Mithilfe von !optional
Deklarationen ist es möglich, @extend
keine neuen Selektoren zu generieren.
// 不可以,因为没有 .notice
a.important {
@extend .notice
}
// 可以
a.important {
@extend .notice !optional;
}
- im Befehl verwendet
@extend
Um zu vermeiden, dass viel nutzloser Code generiert wird, erweitern Sie ( @extend
) in der Anweisung und beschränken Sie die Erweiterung auf Selektoren in derselben Anweisungsebene.
@media print {
.error {
border: 1px #f00;
background-color: #fdd;}
.seriousError {
// 可以
// .error 同在一个 @meida层级中
@extend .error;
border-width: 3px;}
}
// 以下为反面栗子
.error {
border: 1px #f00;
background-color: #fdd;
}
@media print {
.seriousError {
// 不可以, .error 不在当前的@meida指令层级中
@extend .error;
border-width: 3px;}
}
2.4@at-root
Verwenden Sie @at-root
Anweisungen, um ausgewählte Selektoren auf die äußerste Ebene zu heben.
.parent {...
@at-root .child { ... }
}
// 编译为
.parent { ... }
.child { ... }
- Es kann sich um eine Struktur auf Blockebene handeln, die mehrere Selektoren enthält.
.parent {...
@at-root {
.child1 { ... }
.child2 { ... }}
.step-child { ... }
}
// 编译为
.parent { ... }
.child1 { ... }
.child2 { ... }
.parent .step-child { ... }
- Verwenden Sie
with:xxx yyy ...
oderwithout:xxx yyy ...
, um sicherzustellen, dass die äußere Direktive für den Selektor gültig ist, der in die äußerste Schicht befördert wird:
// without:
@media print {
.page {
width: 8in;
// without: media 让选择器不受外层的@media影响
@at-root (without: media) {
color: red;
}}
}
// 编译为
@media print {
.page {
width: 8in;}
}
.page {
color: red;
}
3. SteuerbefehleControl Derectives
Steuerungsdirektiven werden verwendet, um Stile unter bestimmten Bedingungen zu referenzieren.
3.1if()
Die eingebaute if
Funktion kann in jedem SassScript
Scripting-Kontext verwendet werden.
3.2@if
@if
Die Bedingung ist erfüllt, wenn der Rückgabewert des Ausdrucks der Anweisung nicht false
oder ist null
. Kann später @else if
angeschlossen werden @else
.
$type: monster;
p {
@if $type == ocean {
color: blue;} @else if $type == matador {
color: red;} @else if $type == monster {
color: green;} @else {
color: black;}
}
// 编译为
p {
color: green;
}
3.3@for
Diese Direktive hat zwei Formate: @for $var from <start> through <end>
, oder @for $var from <start> to <end>
. Beide enthalten den Ausgangspunkt <start>
, der Unterschied besteht darin, dass to
er nicht enthält <end>
, sondern through
enthält <end>
. Kann auch $var
eine beliebige Variable sein, <start>
muss <end>
aber ganze Zahlen sein.
@for $i from 1 to 3 {
.item-#{$i} { width: 2em * $i; }
}
// 编译为
.item-1 {
width: 2em;
}
.item-2 {
width: 4em;
}
3.4@each
@each
Befehlsformat:@each $var in <list>
@each $animal in puma, sea-slug, egret, salamander {.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');}
}
// 编译为
.puma-icon {
background-image: url('/images/puma.png'); }
.sea-slug-icon {
background-image: url('/images/sea-slug.png'); }
.egret-icon {
background-image: url('/images/egret.png'); }
.salamander-icon {
background-image: url('/images/salamander.png'); }
- Mehrere Variablen können gleichzeitig angewendet werden , was praktisch ist, wenn Sie Stile schreiben, die ähnliche Formen, aber unterschiedliche Werte haben:
@each $animal, $color, $cursor in (puma, black, default),
(sea-slug, blue, pointer),
(egret, white, move) {.#{$animal}-icon {
background-image: url('/images/#{$animal}.png');
border: 2px solid $color;
cursor: $cursor;}
}
// 编译为
.puma-icon {
background-image: url('/images/puma.png');
border: 2px solid black;
cursor: default; }
.sea-slug-icon {
background-image: url('/images/sea-slug.png');
border: 2px solid blue;
cursor: pointer; }
.egret-icon {
background-image: url('/images/egret.png');
border: 2px solid white;
cursor: move; }
- Da
maps
es als Array behandelt wirdlists
,@each
kann auchmap
verwendet werden :
@each $header, $size in (h1: 2em, h2: 1.5em, h3: 1.2em) {#{$header} {
font-size: $size;}
}
// 编译为
h1 {
font-size: 2em; }
h2 {
font-size: 1.5em; }
h3 {
font-size: 1.2em; }
3.5@while
while
Zirkulation, ich verstehe.
$i: 6;
@while $i > 0 {
.item-#{$i} { width: 2em * $i; }
// 更改条件变量
$i: $i - 2;
}
//编译为
.item-6 {
width: 12em; }
.item-4 {
width: 8em; }
.item-2 {
width: 4em; }
4. Gemischte Befehle ( Mixin Directives
)
mixin
Wird verwendet, um wiederverwendbare Stile zu definieren.
4.1 Gemischte Anweisungen definieren @minin
( Defining a Mixin: @mixin
)
Nachdem @mixin
Sie den Namen und den Stil hinzugefügt haben, können Sie die gemischte Anweisung definieren. Beachten Sie, dass Sie Selektoren und Attribute einschließen müssen, und Sie können auch verwenden &
, um auf den übergeordneten Selektor zu verweisen.
// 定义名为 clearfix 的混合指令
@mixin clearfix {
display: inline-block;
// & 指代父选择器。注意,这个混合指令里虽然它没有父选择器,
// 但是混合指令使用的地方,可以产生父选择器&:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;}
// 这里的 & 同理* html & { height: 1px }
}
4.2 Referenz gemischte Anweisungen @include
( Including a Mixin: @include
)
- Verwenden Sie
@include MixinName
, um eine Mixin-Direktive zu zitieren:
.page-title {
// 引用混合指令,将 clearfix 中的规则混入到 .page-title 中
@include clearfix;
padding: 4px;
margin-top: 10px;
}
- Es kann auch direkt auf die äußerste Ebene verwiesen und eingemischt werden, ohne Attribute zu definieren und keinen übergeordneten Selektor zu haben, auf den verwiesen werden kann:
@mixin silly-links {
a {
color: blue;
background-color: red;}
}
@include silly-links;
//编译为
a {
color: blue;
background-color: red; }
In den Mixin-Direktiven, die wir schreiben, ist es am besten, nur untergeordnete Selektoren zu definieren, damit sie überall in der Datei sicher importiert werden können.
- Eine zusammengesetzte Direktive kann auf andere zusammengesetzte Direktiven verweisen:
@mixin compound {
@include highlighted-background;
@include header-text;
}
@mixin highlighted-background { background-color: #fc0; }
@mixin header-text { font-size: 20px; }
4.3 Parameter ( Arguments
)
Parameter können verwendet werden, um Variablen für den Stil von gemischten Befehlen zu setzen und Werte zuzuweisen. Beim Referenzieren und Definieren gemischter Anweisungen sollte die Reihenfolge der Parameter eine Eins-zu-Eins-Entsprechung sein, und den Parametern können Standardwerte zugewiesen werden.
// $width有默认值
@mixin sexy-border($color, $width: 1in) {
// 注意这里得 border,是CSS命名空间
border: {
color: $color;
width: $width;
style: dashed;}
}
p { @include sexy-border(blue); }
h1 { @include sexy-border(blue, 2in); }
// 编译为
p {
border-color: blue;
border-width: 1in;
border-style: dashed; }
h1 {
border-color: blue;
border-width: 2in;
border-style: dashed; }
Darüber hinaus gibt es zwei weitere wichtige Punkte zu den Parametern:
- Schlüsselwort parameter (
Keyword Arguments
): WennMixin
Sie einen Parameter per Referenz übergeben, übergeben Sie den Wert genau, indem Sie das Schlüsselwort des Parameters (Parametername) angeben.
p { @include sexy-border($color: blue); }
h1 { @include sexy-border($color: blue, $width: 2in); }
Das Schreiben ist zwar etwas umständlich, aber gut lesbar und genau zuordenbar.
- Parametervariable (
Variable Arguments
): Wenn Sie nicht sicher sind, wie viele Parameter der gemischte Befehl benötigt, können Sie die Parametervariable am Ende des...
zu deklarierenden Parameters verwenden, undSass
diese Parameter werden als Werteliste behandelt.
@mixin box-shadow($shadows...) {
-moz-box-shadow: $shadows;
-webkit-box-shadow: $shadows;
box-shadow: $shadows;
}
.shadows {
@include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
}
// 编译为
.shadowed {
-moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
-webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
}
Sie können beim Zitieren auch Parametervariablen verwenden:
@mixin colors($text, $background, $border) {
color: $text;
background-color: $background;
border-color: $border;
}
$values: #ff0000, #00ff00, #0000ff;
.primary {
@include colors($values...);
}
// 编译为
.primary {
color: #ff0000;
background-color: #00ff00;
border-color: #0000ff;
}
4.4 Inhalte in den gemischten Befehl importieren @content
( Passing Content Blocks to a Mixin
)
Beim Zitieren Mixin
von , insbesondere beim Zitieren auf der äußersten Ebene der Datei, können Sie @content
Platzhalter verwenden und dann @include
den folgenden Inhalt in @content
die Position importieren, ähnlich wie bei Vorlagen, Slots usw.
@mixin apply-to-ie6-only {* html {
@content;}
}
@include apply-to-ie6-only {
#logo {
background-image: url(/logo.gif);}
}
// 编译为
* html #logo {
background-image: url(/logo.gif);
}
Aufgrund der häufigen Verwendung Mixin
in Sass
Stilbibliotheken. Um die Verwendung zu vereinfachen, kann es =
ausgedrückt werden @mixin
durch und +
ausgedrückt durch @include
.
// Sass (这里就是Sass格式的语法了,而非SCSS格式)
=apply-to-ie6-only* html
@content
+apply-to-ie6-only
#logo
background-image: url(/logo.gif)
- Inhalt auf Blockebene und variabler Geltungsbereich : Durch
@content
das Importieren von Inhalt auf Blockebene wird sein Geltungsbereich mit dem Kontext verknüpft, in dem er definiert ist, und hat nichts mit dem Geltungsbereich innerhalb der gemischten Anweisung zu tun.
$color: white;
@mixin colors($color: blue) {
background-color: $color;
// @content 的内容的作用域在定义它的地方
@content;
border-color: $color;
}
.colors {
@include colors { // 这里的color,虽然会被插入到@content的位置// 但是它的作用域是在定义它的地方,
// 而定义它的地方,$color是全局变量,值为whitecolor: $color; }
}
// 编译为
.colors {
background-color: blue;
color: white;
border-color: blue;
}
Beachten Sie, dass sich nicht jede Definition im globalen Geltungsbereich befindet und es auch möglich ist, dass die Definition in einem Selektor verschachtelt ist und der Geltungsbereich dann der lokale Geltungsbereich des Selektors ist.
5. Funktionsanweisung ( Function Directives
)
Sass
Ermöglicht benutzerdefinierte Funktionen, Funktionen können in jedem Attributwert oder verwendet werden SassScript
. Namen von benutzerdefinierten Funktionen können vorangestellt werden, um Namenskonflikte zu vermeiden.
$grid-width: 40px;
$gutter-width: 10px;
@function grid-width($n) {
@return $n * $grid-width + ($n - 1) * $gutter-width;
}
#sidebar { width: grid-width(5); }
// 编译为
#sidebar {
width: 240px;
}
6. Ausgabeformat
6.1:nested
Nested ( :nested
) ist sass
das Standardausgabeformat von , das die CSS
Beziehung HTML
zwischen und klar widerspiegelt. Selektoren und Attribute belegen eine separate Zeile, und die Einrückung sass
stimmt mit der in der Datei überein, wobei sie sich auf die Einrückung stützt, um die Verschachtelungsebene widerzuspiegeln.
// 编译后输出的CSS文件
#main {
color: #fff;
background-color: #000; }
#main p {
width: 10em; }
6.2:expanded
Das expand ( :expanded
)-Format ist dasselbe wie beim Schreiben von Hand, und der Selektor ist nicht eingerückt.
#main {
color: #fff;
background-color: #000;
}
#main p {
width: 10em;
}
6.3:compact
Das kompakte Format ( Compact
) benötigt weniger Platz, jede CSS
Regel belegt nur eine Zeile, verschachtelte Selektoren hinterlassen keine Leerzeilen und nicht verschachtelte Selektoren lassen Leerzeilen dazwischen.
#main { color: #fff; background-color: #000; }
#main p { width: 10em; }
.huge { font-size: 10em; font-weight: bold; text-decoration: underline; }
6.4:compressed
Das komprimierte Format ( Compressed
) hinterlässt keine Leerzeilen, Leerzeichen, Kommentare usw. und das Ausgabevolumen ist am kleinsten.
#main{color:#fff;background-color:#000}#main p{width:10em}.huge{font-size:10em;font-weight:bold;text-decoration:underline}
Zu guter Letzt
Organisierte eine Reihe von "Interview-Sammlungen von Front-End-Herstellern", einschließlich HTML, CSS, JavaScript, HTTP, TCP-Protokoll, Browser, VUE, React, Datenstruktur und Algorithmus, insgesamt 201 Interviewfragen, und beantwortete jede Frage Beantworten und analysieren.
Freunde in Not, Sie können auf die Karte am Ende des Artikels klicken, um dieses Dokument zu erhalten und es kostenlos zu teilen
Ein Teil der Dokumentation zeigt:
Die Länge des Artikels ist begrenzt, und die folgenden Inhalte werden nicht einzeln angezeigt
Freunde in Not, Sie können auf die Karte unten klicken, um sie kostenlos zu erhalten