W Sassie nie do końca dostrzegam różnicę między używaniem @includez mieszanką a używaniem @extendz klasą zastępczą. Czy nie sprowadzają się do tego samego?
Poza tym @CodeGroover, komentarz w ogóle nie jest przydatny, być może źle zrozumiałeś pytanie. Czytanie tego daje więcej przydatnych informacji: gist.github.com/antsa/970172
tymczasowy_nazwa_użytkownika
4
Za każdym razem, gdy użyjesz miksu bez parametru, rozszerzenie będzie bardziej wydajne. Dzięki uprzejmości Chris
Abhijeet
Odpowiedzi:
89
Rozszerzenia nie pozwalają na dostosowywanie, ale generują bardzo wydajny CSS.
%button
background-color: lightgrey
&:hover, &:active
background-color: white
a
@extend %button
button
@extend %button
Postępuj zgodnie z poniższym zestawem przykładów kodu, aby zobaczyć, jak możesz uczynić swój kod czystszym i łatwiejszym w utrzymaniu, efektywnie stosując rozszerzenia i mieszanki: http://thecodingdesigner.com/posts/balancing
Zwróć uwagę, że SASS niestety nie pozwala na używanie rozszerzeń w zapytaniach o media (a odpowiedni przykład z powyższego linku jest nieprawidłowy). W sytuacji, gdy potrzebujesz rozszerzyć na podstawie zapytań o media, użyj miksu:
=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
W tym przypadku powielanie jest nieuniknione, ale nie powinieneś się tym zbytnio przejmować, ponieważ zajmie się tym kompresja gzip serwera WWW.
PS Pamiętaj, że w zapytaniach o media możesz zadeklarować klasy zastępcze.
Aktualizacja 2014-12-28 : Rozszerzenia tworzą bardziej zwarty CSS niż miksery , ale ta korzyść jest mniejsza , gdy CSS jest spakowany gzipem. Jeśli twój serwer obsługuje CSS spakowany gzipem (naprawdę powinien!), Rozszerzenia nie dają prawie żadnych korzyści. Więc zawsze możesz używać mixinów ! Więcej na ten temat tutaj: http://www.sitepoint.com/sass-extend-nobody-told-you/
Nie sądzę, żeby to było do końca dokładne ... możesz dostosować @extends, zastępując rodzica rozszerzenia. Oczywiście nie możesz przekazać argumentów, ale czy to jedyna różnica? W takim razie jest @extendpo prostu @mixinbez argumentów? Nadal nie widzę korzyści ani różnicy.
Byłbym ostrożny, interpretując tam aspekt „nie daje prawie żadnych korzyści” z ostatniego akapitu. Kompresja Gzip to oparty na słownikach koder Huffmana, więc jeśli powtórzenie nastąpi wystarczająco daleko od siebie, tekst nie będzie obecny w słowniku i ucierpi na tym współczynniki kompresji. Nadal zawsze wolę, @extendgdzie to możliwe, ponieważ da to bardziej zwarty CSS, który nadal będzie dość dobrze kompresowany (w końcu jest to tekst ASCII).
amcgregor
@amcgregor, różnica jest znikoma.
Andrey Mikhaylov - lolmaus 25.07.19
@ AndreyMikhaylov-lolmaus Zgadzam się! Spodziewałbym się, że różnica będzie zasadniczo nie do zmierzenia w sieci, niezależnie od wyboru dla czegokolwiek do jednego megabajta generowanego CSS, poza faktem, że nieskompresowany wynik końcowy w pamięci będzie mniejszy @extend. Jest to mikro-optymalizacja, która pozornie opiera się na intuicji i przeczuciach, a nie na zrozumieniu, jak faktycznie działa schemat kompresji. (Ponadto: ignoruje znaczny narzut związany z kodowaniem transferu gzip na żądanie; kompresja nie jest darmowa
!;
18
Dobrym podejściem jest użycie obu - stwórz mixin, który pozwoli ci na wiele dostosowań, a następnie rozszerzy typowe konfiguracje tego miksu. Na przykład (składnia SCSS):
Dzięki temu nie musisz w kółko wywoływać miksera my-button. Oznacza to również, że nie musisz pamiętać ustawień typowych przycisków, ale nadal masz możliwość stworzenia super unikalnego, jednorazowego przycisku, jeśli wybierzesz.
Moim zdaniem rozciągnięte są czystym złem i należy ich unikać. Oto dlaczego:
biorąc pod uwagę 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}
Zostanie wygenerowany następujący plik CSS:
.mystyle-class, ::-webkit-input-placeholder { //invalid in non-webkit browsers
color: blue;
}
Gdy przeglądarka nie rozpoznaje selektora, unieważnia całą linię selektorów. Oznacza to, że twoja cenna klasa mystyle nie jest już niebieska (dla wielu przeglądarek). Co to tak naprawdę znaczy? Jeśli w jakimkolwiek momencie użyjesz rozszerzenia, w którym przeglądarka może nie zrozumieć selektora, każde inne użycie rozszerzenia zostanie unieważnione. To zachowanie pozwala również na złe zagnieżdżanie:
%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 jest całkowicie w porządku, o ile nigdy nie używasz go z żadnymi specjalistycznymi selektorami przeglądarki. Jeśli to zrobisz, nagle zniszczy style w każdym miejscu, w którym go użyłeś. Zamiast tego spróbuj polegać na mieszankach!
Całkowicie zgadzam się z poprzednią odpowiedzią d4nyll. Jest tam tekst o opcji rozszerzania i kiedy badałem ten temat, znalazłem wiele skarg dotyczących rozszerzenia, więc pamiętaj o tym i jeśli istnieje możliwość użycia mixin zamiast rozszerzenia, po prostu pomiń rozszerzenie.
Odpowiedzi:
Rozszerzenia nie pozwalają na dostosowywanie, ale generują bardzo wydajny CSS.
Wynik:
Dzięki mieszankom otrzymujesz zduplikowane CSS, ale możesz użyć argumentów, aby zmodyfikować wynik dla każdego użycia.
Prowadzi do:
Postępuj zgodnie z poniższym zestawem przykładów kodu, aby zobaczyć, jak możesz uczynić swój kod czystszym i łatwiejszym w utrzymaniu, efektywnie stosując rozszerzenia i mieszanki: http://thecodingdesigner.com/posts/balancing
Zwróć uwagę, że SASS niestety nie pozwala na używanie rozszerzeń w zapytaniach o media (a odpowiedni przykład z powyższego linku jest nieprawidłowy). W sytuacji, gdy potrzebujesz rozszerzyć na podstawie zapytań o media, użyj miksu:
Wynik:
W tym przypadku powielanie jest nieuniknione, ale nie powinieneś się tym zbytnio przejmować, ponieważ zajmie się tym kompresja gzip serwera WWW.
PS Pamiętaj, że w zapytaniach o media możesz zadeklarować klasy zastępcze.
Aktualizacja 2014-12-28 : Rozszerzenia tworzą bardziej zwarty CSS niż miksery , ale ta korzyść jest mniejsza , gdy CSS jest spakowany gzipem. Jeśli twój serwer obsługuje CSS spakowany gzipem (naprawdę powinien!), Rozszerzenia nie dają prawie żadnych korzyści. Więc zawsze możesz używać mixinów ! Więcej na ten temat tutaj: http://www.sitepoint.com/sass-extend-nobody-told-you/
źródło
@extends
, zastępując rodzica rozszerzenia. Oczywiście nie możesz przekazać argumentów, ale czy to jedyna różnica? W takim razie jest@extend
po prostu@mixin
bez argumentów? Nadal nie widzę korzyści ani różnicy.@extend
gdzie to możliwe, ponieważ da to bardziej zwarty CSS, który nadal będzie dość dobrze kompresowany (w końcu jest to tekst ASCII).@extend
. Jest to mikro-optymalizacja, która pozornie opiera się na intuicji i przeczuciach, a nie na zrozumieniu, jak faktycznie działa schemat kompresji. (Ponadto: ignoruje znaczny narzut związany z kodowaniem transferu gzip na żądanie; kompresja nie jest darmowaDobrym podejściem jest użycie obu - stwórz mixin, który pozwoli ci na wiele dostosowań, a następnie rozszerzy typowe konfiguracje tego miksu. Na przykład (składnia SCSS):
Dzięki temu nie musisz w kółko wywoływać miksera my-button. Oznacza to również, że nie musisz pamiętać ustawień typowych przycisków, ale nadal masz możliwość stworzenia super unikalnego, jednorazowego przycisku, jeśli wybierzesz.
Biorę ten przykład z posta na blogu, który napisałem niedawno. Mam nadzieję że to pomoże.
źródło
Moim zdaniem rozciągnięte są czystym złem i należy ich unikać. Oto dlaczego:
biorąc pod uwagę scss:
Zostanie wygenerowany następujący plik CSS:
Gdy przeglądarka nie rozpoznaje selektora, unieważnia całą linię selektorów. Oznacza to, że twoja cenna klasa mystyle nie jest już niebieska (dla wielu przeglądarek). Co to tak naprawdę znaczy? Jeśli w jakimkolwiek momencie użyjesz rozszerzenia, w którym przeglądarka może nie zrozumieć selektora, każde inne użycie rozszerzenia zostanie unieważnione. To zachowanie pozwala również na złe zagnieżdżanie:
Wynik:
Tl; dr: @extend jest całkowicie w porządku, o ile nigdy nie używasz go z żadnymi specjalistycznymi selektorami przeglądarki. Jeśli to zrobisz, nagle zniszczy style w każdym miejscu, w którym go użyłeś. Zamiast tego spróbuj polegać na mieszankach!
źródło
Użyj mixins, jeśli akceptuje parametr, gdzie skompilowane wyjście będzie się zmieniać w zależności od tego, co do niego przekażesz.
Użyj rozszerzenia (z symbolem zastępczym) dla dowolnych statycznych powtarzalnych bloków stylów.
źródło
Całkowicie zgadzam się z poprzednią odpowiedzią d4nyll. Jest tam tekst o opcji rozszerzania i kiedy badałem ten temat, znalazłem wiele skarg dotyczących rozszerzenia, więc pamiętaj o tym i jeśli istnieje możliwość użycia mixin zamiast rozszerzenia, po prostu pomiń rozszerzenie.
źródło