Przejścia CSS3: Czy „przejście: wszystko” jest wolniejsze niż „przejście: x”?


82

Mam pytanie dotyczące szybkości renderowania dla właściwości przejścia css3.

Załóżmy, że mam kilka elementów:

div, span, a {transition: all}

div {margin: 2px}
span {opacity: .5}
a:hover {background-position: left top}

div:hover {margin: -100px}
span:hover {opacity: 1}
a:hover {background-position: -5px top}

O wiele bardziej efektywne jest kierowanie wszystkich przejść dla wszystkich tych elementów przy użyciu jednej deklaracji div, span, a {transition: all}. Ale moje pytanie brzmi: czy byłoby „szybsze” pod względem płynności i szybkości renderowania animacji, aby osiągnąć specyficzną właściwość przejścia każdego elementu? Na przykład:

div {margin: 2px; transition: margin .2s ease-in}
span {opacity: .5; transition: opacity .2s ease-in}
a {background-position: left top; transition: background .2s ease-in}

div:hover {margin: -100px}
span:hover {opacity: 1}
a:hover {background-position: -5px top}

Moja logika polegająca na zadawaniu tego pytania jest taka, że ​​jeśli "silnik" css musi szukać "wszystkich" właściwości przejścia, nawet jeśli istnieje tylko jedna właściwość dla elementu, może to spowolnić działanie.

Czy ktoś wie, czy tak jest? Dzięki!


1
To zawsze była moja teoria, ale nigdy nie zauważyłem żadnej różnicy w praktyce.
ThinkingStiff

3
Spodziewałbym się, że faktyczne wykonanie animacji na ekranie byłoby dużo, dużo droższe niż parsowanie CSS. O ile nie nadużywasz systemu, nie martwiłbym się tym zbytnio.
StilesCrisis,

Myślę, że jeśli ISTNIEJE różnica, będzie to wyrażona w milisekundach - ale chcę wiedzieć, czy jest nawet minutowa różnica. dzięki za komentarze
HandiworkNYC.com

1
To krzyczy do mnie „szczegóły implementacji specyficzne dla dostawcy” ...
BoltClock

Odpowiedzi:


73

Tak, używanie transition: allmoże powodować poważne wady wydajności. Może istnieć wiele przypadków, w których przeglądarka będzie wyglądać, jeśli będzie musiała dokonać przejścia, nawet jeśli użytkownik go nie zobaczy, na przykład zmiany koloru, zmiany wymiarów itp.

Najprostszy przykład, jaki przychodzi mi do głowy, to: http://dabblet.com/gist/1657661 - spróbuj zmienić poziom powiększenia lub rozmiar czcionki, a zobaczysz, że wszystko staje się animowane. Oczywiście nie może być wiele takich interakcji użytkownika, ale mogą wystąpić pewne zmiany w interfejsie, które mogą spowodować ponowne wlanie i ponowne malowanie w niektórych blokach, co może nakłonić przeglądarkę do podjęcia próby animacji tych zmian.

Dlatego ogólnie zaleca się, aby nie używać transition: alli zamiast tego używać bezpośrednich przejść.

Jest kilka innych rzeczy, które mogą się nie udać z allprzejściami, na przykład animacja przy ładowaniu strony, w przypadku której najpierw renderowałoby początkowe style bloków, a następnie stosował je w animacji. W wielu przypadkach nie byłoby to coś, czego chcesz :)


link jest martwy, chciałbym zobaczyć twój przykład
MMachinegun

Naprawiono link do całego dabbleta
kizu

Chciałbym też zobaczyć przykład. Może już nie istnieje?
Drazzah

11
To nie jest tak naprawdę odpowiedź na pierwotne pytanie. Tak, możesz przypadkowo przenieść rzeczy, których nie zamierzałeś animować, ale OP pytał, czy reguła „wszystko” sama powoduje jakiekolwiek uderzenie w wydajność, zakładając, że żadne niezamierzone przejścia nie zostały wyzwolone.
Owen Masback

30

Używałem allw przypadkach, w których potrzebowałem animować więcej niż jedną regułę. Na przykład, gdybym chciał zmienić color& background-coloron :hover.

Okazuje się jednak, że możesz kierować reklamy na więcej niż jedną regułę dla przejść, więc nigdy nie musisz uciekać się do tego allustawienia.

.nav a {
  transition: color .2s, text-shadow .2s;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.