In Sass, non riesco a distinguere la differenza tra l'utilizzo di @include
con un mixin e l'utilizzo di @extend
con una classe segnaposto. Non equivalgono alla stessa cosa?Utilizzo di @include vs @extend in Sass?
risposta
Le estensioni non consentono la personalizzazione, ma producono CSS molto efficienti.
%button
background-color: lightgrey
&:hover, &:active
background-color: white
a
@extend %button
button
@extend %button
Risultato:
a, button {
background-color: lightgrey;
}
a:hover, button:hover, a:active, button:active {
background-color: white;
}
Con mixins, si ottiene CSS duplicato, ma è possibile utilizzare gli argomenti per modificare il risultato per ogni utilizzo.
=button($main-color: lightgrey, $active-color: white)
background-color: $main-color
border: 1px solid black
border-radius: 0.2em
&:hover, &:active
background-color: $active-color
a
+button
button
+button(pink, red)
Risultati in:
a {
background-color: lightgrey;
border: 1px solid black;
border-radius: 0.2em;
}
a:hover, a:active {
background-color: white;
}
button {
background-color: pink;
border: 1px solid black;
border-radius: 0.2em;
}
button:hover, button:active {
background-color: red;
}
Si prega di seguire questa serie consecutiva di esempi di codice per vedere come si può fare il vostro pulitore codice e più gestibile utilizzando estende e mixins efficace: http://thecodingdesigner.com/journal/balancing-ideal-sass-and-ideal-css
Nota che SASS purtroppo non consente l'uso di estensioni all'interno di query multimediali (e l'esempio corrispondente dal link sopra è sbagliato). Nella situazione in cui è necessario estendere in base a domande dei media, utilizzare un 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
Risultato:
#main-menu {
display: block;
background-color: pink;
}
@media (min-width: 20em) {
#secondary-menu {
display: block;
background-color: pink;
}
}
duplicazione è inevitabile in questo caso, ma non si deve preoccuparsi troppo su di esso perché la compressione gzip del web server si prenderà cura di esso.
PS Si noti che è possibile dichiarare classi segnaposto all'interno di query multimediali.
Aggiornamento 2014/12/28: Estende producono più compatta CSS di mixins fanno, ma questo vantaggio è diminuito quando CSS viene compresso con gzip. Se il tuo server serve CSS compresso con gzip (dovrebbe davvero!), Quindi estende non ti dà quasi alcun beneficio. Quindi puoi sempre usare i mixin ! Maggiori informazioni su questo argomento: http://www.sitepoint.com/sass-extend-nobody-told-you/
Non penso che * * interamente * accurato ... puoi personalizzare '@ extends' sovrascrivendo l'estensione parent. Ovviamente non puoi passare argomenti, ma è l'unica differenza? In tal caso, '@ extend' solo' @ mixin' senza argomenti? Non vedo ancora il vantaggio o la differenza. – Aerovistae
La differenza sta nel modo in cui è organizzato il codice compilato. –
Ecco alcune altre stranezze ... http://stackoverflow.com/questions/30744625/sass-and-bootstrap-mixins-vs-extends/30744854#30744854 –
Un buon approccio consiste nell'utilizzare entrambi: creare un mixin che consenta numerose personalizzazioni e quindi estendere le configurazioni comuni di tale mix. Per esempio (SCSS di sintassi):
@mixin my-button($size: 15, $color: red) {
@include inline-block;
@include border-radius(5px);
font-size: $size + px;
background-color: $color;
}
%button {
@include my-button;
}
%alt-button {
@include my-button(15, green);
}
%big-button {
@include my-button(25);
}
questo modo si evita di chiamare la mia pulsante mixin più e più volte. Significa anche che non devi ricordare le impostazioni per i pulsanti comuni, ma hai comunque la possibilità di creare un pulsante unico e unico nel tuo genere.
Prendo questo esempio da a blog post I wrote non molto tempo fa. Spero che questo ti aiuti.
Utilizzare mixins se accetta un parametro, in cui l'output compilato cambierà a seconda di ciò che si passa in esso.
@include opacity(0.1);
Usa estendere (con segnaposto) per eventuali statici blocchi ripetibili di stili.
color: blue;
font-weight: bold;
font-size: 2em;
Secondo me le estensioni sono il male puro e dovrebbero essere evitate. Ecco perché:
data la 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}
il seguente CSS verrà generato:
.mystyle-class, ::-webkit-input-placeholder { //invalid in non-webkit browsers
color: blue;
}
Quando un browser non capisce un selettore, è invalida l'intera linea di selettori . Ciò significa che la tua preziosa classe mystyle non è più blu (per molti browser). Cosa significa veramente? Se in qualsiasi momento si utilizza un'estensione in cui un browser potrebbe non comprendere il selettore, ogni altro uso dell'estensione verrà invalidato. Questo comportamento consente anche per la nidificazione del male:
%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;}
Risultato:
::-webkit-input-placeholder, .mystyle-class { //invalid in non-webkit browsers
color: blue;
}
::-webkit-input-placeholder {
height: 0;
}
Tl; dr: @extend è perfettamente ok per il tempo che non si utilizza mai con qualsiasi selettore del browser spesific. Se lo fai, improvvisamente distruggerà gli stili ovunque tu lo abbia usato. Prova invece a fare affidamento sui mixin!
Nota interessante – simhumileco
- 1. ruby include vs extend
- 2. SASS/SCSS regola @extend selettori
- 3. Twig embed vs include, qualsiasi motivo di utilizzo include
- 4. SASS/SCSS utilizzando @extend attraverso singoli file (responsive design)
- 5. Include font-awesome in bootstrap sass via Bower
- 6. Utilizzo di troppo include() in php
- 7. Twig tag include vs function include
- 8. Autoprefixer vs LESS/Sass mixins?
- 9. Differenze fondamentali tra l'utilizzo di CoffeeScript `extends` vs. Backbone.js` extend`
- 10. Twig: render vs include
- 11. Twig macro VS include?
- 12. Utilizzo di SASS con colori specificati dall'utente
- 13. WiX Include vs Fragments
- 14. PHP include "../" vs "/../"
- 15. SASS e Bootstrap - mixins vs. @extends
- 16. Scopo di _.extend/_. Assegna?
- 17. underscorejs: qual è la differenza tra extendOwn vs extend?
- 18. g: include vs g: render
- 19. Utilizzo di include per indicare dinamicamente l'HTML
- 20. C++: utilizzo di namespace e #include
- 21. Come @extend da un altro file sass, o come ottenere OOSASS?
- 22. Extend Richiesta di classe in laravel 5
- 23. Il lato client include vs lato server include?
- 24. Variabili SCSS come classe @extend
- 25. Quando utilizzare $ .extend ({...})?
- 26. PHP Deep Extend Array
- 27. eredità JavaScript con _.extend()
- 28. Underscore js extend method
- 29. cercando di utilizzare "#include <stdbool.h>" in VS 2010
- 30. Indice composito vs. INDICE di copertura INCLUDE in SQL Server
includono non darvi estendere la classe base, è sufficiente aggiungere opzioni. Basta consigliare di leggere http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#including_a_mixin e http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#extend – CodeGroover
Inoltre, @CodeGroover, non è un commento utile, forse hai frainteso la domanda. La lettura di questo fornisce ulteriori informazioni utili: https://gist.github.com/antsa/970172 – Aerovistae
** Ogni volta che utilizzi un mixin senza parametri, un'estensione sarà più efficiente. ** [Courtesy Chris] (https : //css-tricks.com/the-extend-concept/) – Abhijeet