2012-01-24 19 views
12

Opracowuję aplikację specjalnie dla nowoczesnych przeglądarek i bardzo intensywnie wykorzystuję właściwość box-shadow.Bardzo powolne cienie CSS3 w Chrome

Do niedawna było to absolutnie w porządku we wszystkich przeglądarkach obsługujących. Jednak około miesiąca temu podczas testowania w Chrome zauważyłem, że przewijanie było "ekstremalnie" powolne, do tego stopnia, że ​​prawie nie można go było używać.

W ciągu ostatniego miesiąca próbowałem wyskakiwać ze skryptów i mieszać z moją strukturą html, wszystko, co można wymyślić, aż w końcu znalazłem przyczynę.

Przy wyłączonym oknie cienia/webkit-box-shadow na wszystkich elementach, dla których został ustawiony, problem znika.

To, co wydaje mi się dziwne, to fakt, że sprawdziło się w Chrome przed około miesiącem. Nawiasem mówiąc przewijanie w Safari w wersji Windows jest w porządku, choć trochę wolniejsze niż IE/Opera i Firefox.

Czy to znany problem? Czy ktoś ma obejście tego problemu?

Co jest jeszcze jedną metodą na powielenie tego samego efektu bez użycia właściwości CSS3?

+0

nie mogę mówić do konkretnego problemu, ale efekty CSS3 są znane i udokumentowane spowolnić renderowanie stron. Jeśli chodzi o replikowanie efektu, czy możesz podać nam przykład użycia cienia, aby pomóc Ci znaleźć odpowiedź? –

+0

Rzeczywiście, wydaje się to tak dziwne, że do niedawna wszystko było w porządku, bez dodawania nowych cieni pudełkowych. Bez względu. Używam go po prostu do dodawania niewielkich cieni wokół elementów w celu nadania efektu 3D. Nie używam tego efektu do symulowania czegoś, do czego nie był przeznaczony. Większość zastosowań ma promień od 4 do 10 pikseli wokół krawędzi. Jedyną trudnością jest to, że te elementy kontenera mają rozmiar dynamiczny, ponieważ zawartość może być dodawana/usuwana. O dziwo, tylko przewijanie ma ten problem, wszystkie inne powtórzenia wyglądają dobrze – gordyr

+0

Yah, jeszcze bardziej interesujący jest ten wątek sprzed roku RE: safari: http://stackoverflow.com/questions/4789853/css3-box -shadow-causes-scroll-lag-slow-performance-on-safari-5-0-2 Jedno co pamiętam to to, że zarówno promień cienia, jak i liczba cieni spowalniają go. Niestety, nie mam żadnej poprawki. –

Odpowiedz

13

Było zgłoszenie błędu otwierane i zamykane w Webkit ubiegłym roku:

CSS3 box-shadow causes scroll-lag (slow performance) on Safari 5.0.2?

Wydaje Chrome ma otwartą błąd w starszej wersji:

http://code.google.com/p/chromium/issues/detail?id=95164

Airbnb omówiła Problem ten został ostatnio rozwiązany i faktycznie zmieniono jego ostateczny projekt z tego powodu:

http://nerds.airbnb.com/box-shadows-are-expensive-to-paint

Istnieje grupa osób, które ostatnio zyskały zainteresowanie programowym testowaniem wydajności CSS.Oto bookmarklet można użyć, aby rozpocząć własne badania:

http://andy.edinborough.org/CSS-Stress-Testing-and-Performance-Profiling

W międzyczasie, masz rację, że włamanie border-image jest rozwiązaniem. Sprawdź tutaj:

Scroll Lag with CSS3 box-shadow property?

+0

Świetne linki, wielkie dzięki Matt ... Myślę, że to nie tylko ja! W ciągu następnej godziny będę miał zabawę z obrazem obramowania i zobaczę, czy uda mi się wymyślić coś użytecznego. Dzięki! – gordyr

+0

Okazuje się, że własność border-image była dość prosta i doskonale rozwiązała problem. Ten ostatni opublikowany link zrobił lewę. Oczywiście zmodyfikowałem obraz/css tak, aby pasował do mojej strony, dodał zaokrąglone rogi i gradienty i mogłem zastąpić gradienty CSS także w tym, co jest dość eleganckim rozwiązaniem. To dało produkt uboczny radykalnego zmniejszenia rozmiaru mojego CSS, ponieważ nie muszę mieć tak wielu linii obsługujących każdą przeglądarkę pod względem gradientów/cieni pudełek/granicy promienia. Twoje zdrowie! – gordyr

+0

Użyłem 'box-shadow' w moich przyciskach w mojej aplikacji telefonicznej i opóźniło się przed': active' z opóźnieniem, z pewnością jest to nowy błąd. –

1

To może nie być szczególnie box-shadow, może coś innego w twojej aplikacji zużywa o wiele za dużo zasobów, a box-shadow jest właśnie wisienką na wierzchu.

Mimo to mogę potwierdzić, że box-shadow na zbyt długich lub dużych elementach powoduje problemy z wydajnością. Pracuję dla pewnego kreatora formularzy typu drag'n'drop i próbowałem ustawić opcję box-shadow na div o wymiarach 900 x 9 x 9 x 9 pikseli, a przewijanie zaczęło się od razu opóźniać. Nasza jest bardzo ciężka aplikacja internetowa ajax, więc inni mogą sobie pozwolić na lepsze wyniki, ale nadal uważam, że jest to dobry przykład.

Więc poszedłem do szkoły i stworzyłem zdjęcia. Myślę, że najbardziej odpowiednim sposobem uzyskania cieni obrazów bez zbyt dużego obciążenia obrazu jest posiadanie elementu o stałej szerokości.

To, co zrobiłem, to trzy plasterki obrazu. Jeden kawałek od góry do samych rogów górnych, jeden od dołu do tuż powyżej dolnych rogów i jeden cienki kawałek od środka, który użyłem na div jako obraz tła z powtarzaniem-y, dzięki czemu mogę dynamicznie zmieniać wysokość div dopasuj stronę użytkowników.

Można pokroić jeszcze więcej, aby zmieściło się w dowolnym polu, ale staje się ono zbyt duże (co najmniej 5 dodatkowych obrazów i 8 dodatkowych elementów div, aby być precyzyjnym) dla imo box-shadow.

+0

Podobnie jak Twoja, moja aplikacja to pojedyncza strona, bardzo ciężka aplikacja obsługująca wiele ajaxów, zawierająca wiele efektów przeciągania/upuszczania i efektów wizualnych. Niestety na wszystkie elementy nie mam luksusu o stałych szerokościach, choć z pewnością naprawi to sporo z nich. Twoje rozwiązanie brzmi dobrze, ale mam zamiar pozostawić to pytanie otwarte przez następną godzinę w nadziei, że ktoś inny zaproponuje inną alternatywę. Wielkie dzięki! – gordyr

+0

proszę, chciałbym zobaczyć, czy ktoś może wymyślić coś lepszego. Ja też tego nie lubię, ale czasami robisz to, co musisz zrobić :) – Ege

Powiązane problemy