In Sass kann ich den Unterschied zwischen der Verwendung @includemit einem Mixin und der Verwendung @extendmit einer Platzhalterklasse nicht ganz erkennen . Sind sie nicht dasselbe?
Befolgen Sie diese fortlaufenden Codebeispiele, um zu sehen, wie Sie Ihren Code sauberer und wartbarer machen können, indem Sie Erweiterungen und Mixins effektiv verwenden: http://thecodingdesigner.com/posts/balancing
Beachten Sie, dass SASS die Verwendung von Erweiterungen innerhalb von Medienabfragen leider nicht zulässt (und das entsprechende Beispiel über den obigen Link ist falsch). Verwenden Sie in Situationen, in denen Sie basierend auf Medienabfragen eine Erweiterung benötigen, ein Mixin:
=active
display: block
background-color: pink
%active
+active
#main-menu
@extend %active // Active by default
#secondary-menu
@media (min-width: 20em)
+active // Active only on wide screens
In diesem Fall ist eine Duplizierung unvermeidlich, aber Sie sollten sich nicht zu sehr darum kümmern, da sich die gzip-Komprimierung des Webservers darum kümmert.
PS Beachten Sie, dass Sie Platzhalterklassen in Medienabfragen deklarieren können.
Update 2014.12.28 : Verlängert Produkte kompakten CSS als Mixins tun, aber diese Leistung vermindert wird , wenn CSS gzipped wird. Wenn Ihr Server gzipped CSS dient (es soll wirklich!), Dann reichen Sie fast keinen Nutzen. Sie können also immer Mixins verwenden ! Mehr dazu hier: http://www.sitepoint.com/sass-extend-nobody-told-you/
Ich denke nicht, dass das ganz richtig ist ... Sie können anpassen, @extendsindem Sie die übergeordnete Erweiterung überschreiben. Natürlich können Sie keine Argumente weitergeben, aber ist das dann der einzige Unterschied? In diesem Fall ist @extendnur @mixinohne Argumente? Ich sehe immer noch keinen Vorteil oder Unterschied.
Ich würde den Aspekt "gibt Ihnen fast keinen Nutzen" des letzten Absatzes dort sorgfältig interpretieren. Die Gzip-Komprimierung ist ein wörterbuchbasierter Huffman-Codierer. Wenn die Wiederholung also weit genug voneinander entfernt erfolgt, ist der Text nicht im Wörterbuch vorhanden und die Komprimierungsverhältnisse leiden darunter. Ich ziehe noch immer , @extendwo möglich, da dies wird kompakten CSS produzieren, die ziemlich gut noch komprimieren werden (es ist ASCII - Text, nachdem alle).
Amcgregor
@amcgregor, der Unterschied ist vernachlässigbar.
Andrey Mikhaylov - lolmaus
@ AndreyMikhaylov-lolmaus Ich stimme zu! Ich würde erwarten, dass der Unterschied über das Kabel im Wesentlichen nicht messbar ist, unabhängig von der Wahl für etwas bis zu etwa einem Megabyte generierten CSS, abgesehen von der Tatsache, dass das unkomprimierte Endergebnis im Speicher bei Verwendung kompakter ist @extend. Dies ist eine Mikrooptimierung, die anscheinend eher auf Intuition und Bauchgefühl basiert als auf einem Verständnis der tatsächlichen Funktionsweise des Komprimierungsschemas. (Auch: es ignoriert den erheblichen Aufwand der On-Demand-GZIP-Übertragungscodierung; Komprimierung ist nicht kostenlos !;)
Amcgregor
18
Ein guter Ansatz ist es, beides zu verwenden - erstellen Sie ein Mixin, das Ihnen viele Anpassungen ermöglicht, und erweitern Sie dann die gängigen Konfigurationen dieses Mixins. Zum Beispiel (SCSS-Syntax):
Dies erspart Ihnen das wiederholte Aufrufen des My-Button-Mixins. Es bedeutet auch, dass Sie sich nicht an die Einstellungen für allgemeine Schaltflächen erinnern müssen, aber dennoch die Möglichkeit haben, eine super einzigartige, einmalige Schaltfläche zu erstellen, falls Sie dies wünschen.
Meiner Meinung nach sind Erweiterungen rein böse und sollten vermieden werden. Hier ist warum:
angesichts der scss:
%mystyle {color: blue;}
.mystyle-class {@extend %mystyle}
//basically anything not understood by target browser (such as :last-child in IE8):
::-webkit-input-placeholder {@extend %mystyle}
Das folgende CSS wird generiert:
.mystyle-class, ::-webkit-input-placeholder { //invalid in non-webkit browsers
color: blue;
}
Wenn ein Browser einen Selektor nicht versteht, macht er die gesamte Auswahlzeile ungültig. Dies bedeutet, dass Ihre wertvolle Mystyle-Klasse nicht mehr blau ist (für viele Browser). Was bedeutet das wirklich? Wenn Sie zu irgendeinem Zeitpunkt eine Erweiterung verwenden, bei der ein Browser den Selektor möglicherweise nicht versteht, wird jede andere Verwendung der Erweiterung ungültig. Dieses Verhalten ermöglicht auch böses Verschachteln:
%mystyle {color: blue;}
@mixin mystyle-mixin {@extend %mystyle; height: 0;}
::-webkit-input-placeholder {@include mystyle-mixin}
//you thought nesting in a mixin would make it safe?
.mystyle-class {@extend %mystyle;}
Tl; dr: @extend ist vollkommen in Ordnung, solange Sie es nie mit einem Browser-spezifischen Selektor verwenden. Wenn Sie dies tun, werden die Stile plötzlich überall dort abgerissen, wo Sie sie verwendet haben. Versuchen Sie stattdessen, sich auf Mixins zu verlassen!
Ich stimme der vorherigen Antwort von d4nyll voll und ganz zu. Es gibt einen Text über die Option "Erweitern", und während ich dieses Thema recherchierte, fand ich viele Beschwerden über die Option "Erweitern". Denken Sie also daran, und wenn die Möglichkeit besteht, Mixin anstelle von "Erweitern" zu verwenden, überspringen Sie einfach "Erweitern".
Antworten:
Erweiterungen erlauben keine Anpassung, produzieren jedoch sehr effizientes CSS.
Ergebnis:
Mit Mixins erhalten Sie doppeltes CSS, aber Sie können Argumente verwenden, um das Ergebnis für jede Verwendung zu ändern.
Ergebnisse in:
Befolgen Sie diese fortlaufenden Codebeispiele, um zu sehen, wie Sie Ihren Code sauberer und wartbarer machen können, indem Sie Erweiterungen und Mixins effektiv verwenden: http://thecodingdesigner.com/posts/balancing
Beachten Sie, dass SASS die Verwendung von Erweiterungen innerhalb von Medienabfragen leider nicht zulässt (und das entsprechende Beispiel über den obigen Link ist falsch). Verwenden Sie in Situationen, in denen Sie basierend auf Medienabfragen eine Erweiterung benötigen, ein Mixin:
Ergebnis:
In diesem Fall ist eine Duplizierung unvermeidlich, aber Sie sollten sich nicht zu sehr darum kümmern, da sich die gzip-Komprimierung des Webservers darum kümmert.
PS Beachten Sie, dass Sie Platzhalterklassen in Medienabfragen deklarieren können.
Update 2014.12.28 : Verlängert Produkte kompakten CSS als Mixins tun, aber diese Leistung vermindert wird , wenn CSS gzipped wird. Wenn Ihr Server gzipped CSS dient (es soll wirklich!), Dann reichen Sie fast keinen Nutzen. Sie können also immer Mixins verwenden ! Mehr dazu hier: http://www.sitepoint.com/sass-extend-nobody-told-you/
quelle
@extends
indem Sie die übergeordnete Erweiterung überschreiben. Natürlich können Sie keine Argumente weitergeben, aber ist das dann der einzige Unterschied? In diesem Fall ist@extend
nur@mixin
ohne Argumente? Ich sehe immer noch keinen Vorteil oder Unterschied.@extend
wo möglich, da dies wird kompakten CSS produzieren, die ziemlich gut noch komprimieren werden (es ist ASCII - Text, nachdem alle).@extend
. Dies ist eine Mikrooptimierung, die anscheinend eher auf Intuition und Bauchgefühl basiert als auf einem Verständnis der tatsächlichen Funktionsweise des Komprimierungsschemas. (Auch: es ignoriert den erheblichen Aufwand der On-Demand-GZIP-Übertragungscodierung; Komprimierung ist nicht kostenlos !;)Ein guter Ansatz ist es, beides zu verwenden - erstellen Sie ein Mixin, das Ihnen viele Anpassungen ermöglicht, und erweitern Sie dann die gängigen Konfigurationen dieses Mixins. Zum Beispiel (SCSS-Syntax):
Dies erspart Ihnen das wiederholte Aufrufen des My-Button-Mixins. Es bedeutet auch, dass Sie sich nicht an die Einstellungen für allgemeine Schaltflächen erinnern müssen, aber dennoch die Möglichkeit haben, eine super einzigartige, einmalige Schaltfläche zu erstellen, falls Sie dies wünschen.
Ich nehme dieses Beispiel aus einem Blog-Beitrag, den ich vor kurzem geschrieben habe. Hoffe das hilft.
quelle
Meiner Meinung nach sind Erweiterungen rein böse und sollten vermieden werden. Hier ist warum:
angesichts der scss:
Das folgende CSS wird generiert:
Wenn ein Browser einen Selektor nicht versteht, macht er die gesamte Auswahlzeile ungültig. Dies bedeutet, dass Ihre wertvolle Mystyle-Klasse nicht mehr blau ist (für viele Browser). Was bedeutet das wirklich? Wenn Sie zu irgendeinem Zeitpunkt eine Erweiterung verwenden, bei der ein Browser den Selektor möglicherweise nicht versteht, wird jede andere Verwendung der Erweiterung ungültig. Dieses Verhalten ermöglicht auch böses Verschachteln:
Ergebnis:
Tl; dr: @extend ist vollkommen in Ordnung, solange Sie es nie mit einem Browser-spezifischen Selektor verwenden. Wenn Sie dies tun, werden die Stile plötzlich überall dort abgerissen, wo Sie sie verwendet haben. Versuchen Sie stattdessen, sich auf Mixins zu verlassen!
quelle
Verwenden Sie Mixins, wenn ein Parameter akzeptiert wird, bei dem sich die kompilierte Ausgabe abhängig von der Übergabe ändert.
Verwenden Sie "Erweitern" (mit Platzhalter) für statisch wiederholbare Stilblöcke.
quelle
Ich stimme der vorherigen Antwort von d4nyll voll und ganz zu. Es gibt einen Text über die Option "Erweitern", und während ich dieses Thema recherchierte, fand ich viele Beschwerden über die Option "Erweitern". Denken Sie also daran, und wenn die Möglichkeit besteht, Mixin anstelle von "Erweitern" zu verwenden, überspringen Sie einfach "Erweitern".
quelle