Od czasu do czasu Chrome renderuje całkowicie poprawny kod HTML / CSS niepoprawnie lub wcale. Zagłębianie się w inspektora DOM często wystarcza, aby uświadomić sobie błąd na swoich drogach i poprawnie przerysować, więc możliwe jest, że znaczniki są dobre. Zdarza się to dość często (i przewidywalnie) w projekcie, nad którym pracuję, że wprowadziłem kod, aby wymusić przerysowanie w pewnych okolicznościach.
Działa to w większości kombinacji przeglądarki / systemu operacyjnego:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
Jak na początku, popraw nieużywaną właściwość CSS, a następnie poproś o informacje, które wymuszają przerysowanie, a następnie popraw właściwość. Niestety, świetny zespół, który stoi za Chrome na Maca, wydaje się znaleźć sposób na uzyskanie offsetuHeight bez przerysowywania. W ten sposób zabicie innego użytecznego hacka.
Do tej pory najlepsze, co wymyśliłem, aby uzyskać ten sam efekt w Chrome / Mac, to brzydota:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
Jak w rzeczywistości, faktycznie zmuś element do skoku, a następnie zrelaksuj się przez chwilę i przeskocz z powrotem. Co gorsza, jeśli upuścisz ten limit poniżej 500 ms (do poziomu, który byłby mniej zauważalny), często nie będzie miał pożądanego efektu, ponieważ przeglądarka nie przejdzie do przerysowywania, zanim powróci do pierwotnego stanu.
Czy ktoś chce zaoferować lepszą wersję tego przerysowania / odświeżenia (najlepiej w oparciu o pierwszy przykład powyżej), która działa na Chrome / Mac?
źródło
Odpowiedzi:
Nie jestem pewien, co dokładnie próbujesz osiągnąć, ale jest to metoda, którą z powodzeniem stosowałem, aby zmusić przeglądarkę do przerysowania, być może zadziała.
Jeśli to proste przerysowanie nie działa, możesz spróbować tego. Wstawia pusty element tekstowy do elementu, co gwarantuje przerysowanie.
EDYCJA: W odpowiedzi na Šime Vidasa osiągamy tutaj wymuszony przepływ. Możesz dowiedzieć się więcej od samego mistrza http://paulirish.com/2011/dom-html5-css3-performance/
źródło
.hide().show(0)
na każdym elemencie (wybrałem stopce strony) należy odświeżyć stronę.Żadna z powyższych odpowiedzi nie działała dla mnie. Zauważyłem, że zmiana rozmiaru mojego okna spowodowała przerysowanie. Zrobiło to dla mnie:
źródło
$(window).trigger('resize')
nie, powoduje jedynie zdarzenie „resize”, które wyzwala powiązany moduł obsługi, jeśli jest przypisany.Niedawno się z tym spotkaliśmy i odkryliśmy, że promowanie dotkniętego elementu do warstwy kompozytowej za pomocą translateZ rozwiązało problem bez potrzeby dodatkowego javascript.
Ponieważ te problemy z malowaniem pojawiają się głównie w Webkit / Blink, a ta poprawka dotyczy głównie Webkit / Blink, w niektórych przypadkach lepiej jest. Zwłaszcza, że wiele rozwiązań JavaScript powoduje ponowne wlanie i odmalowanie , a nie tylko odmalowanie.
źródło
neon-animated-pages
. Dziękujemy: +1:To rozwiązanie bez limitów czasu! Prawdziwa siła przerysowania! Dla Androida i iOS.
źródło
To działa dla mnie. Kudos idź tutaj .
źródło
$().hide().show(0)
show()
różni się odshow(0)
tego, że określając czas trwania w drugim przypadku, jest uruchamiany przez metody animacji jQuery w limicie czasu, a nie natychmiast, co daje czas na renderowanie w ten sam sposób, cohide(0, function() { $(this).show(); })
robi .Ukrywanie elementu, a następnie pokazanie go ponownie w ciągu setTimeout 0 spowoduje wymuszenie przerysowania.
źródło
myElement.getBoundingClientRect()
, które były buforowane, prawdopodobnie w celach optymalizacji / wydajności. Po prostu dodałem limit czasu zero milisekund dla funkcji, która dodaje nowy element do DOM i pobiera nowe wartości po usunięciu starego elementu z poprzednich (buforowanych) wartości z DOM.Wydaje mi się, że to załatwia sprawę. Poza tym tak naprawdę wcale się nie pokazuje.
źródło
połączenie
window.getComputedStyle()
powinno wymusić ponowne wyciekiźródło
offsetHeight
właściwości, która nie jest css.Spotkałem się dzisiaj z tym wyzwaniem w OSX El Capitan z Chrome v51. Ta strona działała poprawnie w przeglądarce Safari. Próbowałem prawie każdej sugestii na tej stronie - żadna nie działała prawidłowo - wszystkie miały skutki uboczne ... Skończyło się na implementacji poniższego kodu - bardzo proste - żadnych efektów ubocznych (nadal działa jak poprzednio w Safari).
Rozwiązanie: w razie potrzeby przełącz klasę na problematycznym elemencie. Każde przełączenie wymusi przerysowanie. (Dla wygody użyłem jQuery, ale waniliowy JavaScript nie powinien stanowić problemu ...)
jQuery Class Toggle
Klasa CSS
I to wszystko...
UWAGA: Aby zobaczyć efekt, musisz uruchomić fragment kodu poniżej „Cała strona”.
źródło
wywołaj tę funkcję po 500 milisekundach.
źródło
Jeśli chcesz zachować style zadeklarowane w arkuszach stylów, lepiej użyć czegoś takiego:
Uwaga: z najnowszym zestawem web / blink, przechowującym wartość
offsetHeight
jest obowiązkowe w celu uruchomienia odświeżania, w przeciwnym razie VM (dla celów optymalizacji) prawdopodobnie pominie tę instrukcję.Aktualizacja: dodano drugi
offsetHeight
odczyt, konieczne jest, aby przeglądarka nie ustawiała w kolejce / buforowała następującą zmianę właściwości / klasy CSS z przywróceniemdisplay
wartości (w ten sposób należy renderować przejście CSS, które można wykonać)źródło
// <== zły pomysł$('article.child').redraw();
źródło
.fadeIn(1)
zamiast zamiast.show(300)
dla mnie - nie wypychając elementu dookoła.display:none
block
Podejście, które zadziałało dla mnie w IE (nie mogłem użyć techniki wyświetlania, ponieważ było wejście, które nie może stracić ostrości)
Działa, jeśli masz 0 marginesów (zmiana również wypełnienia działa)
źródło
Tylko CSS. Działa to w sytuacjach, gdy element potomny jest usuwany lub dodawany. W takich sytuacjach granice i zaokrąglone rogi mogą pozostawić artefakty.
źródło
Moja poprawka do IE10 + IE11. Zasadniczo dzieje się tak, że dodajesz DIV do elementu owijającego, który musi zostać ponownie obliczony. Następnie po prostu usuń go i voila; działa jak marzenie :)
źródło
Większość odpowiedzi wymaga użycia asynchronicznego limitu czasu, co powoduje denerwujące mrugnięcie.
Ale wymyśliłem ten, który działa płynnie, ponieważ jest synchroniczny:
źródło
To jest moje rozwiązanie, które działało na znikanie treści ...
źródło
Natrafiłem na podobny problem i ta prosta linia JS pomogła go naprawić:
W moim przypadku był to błąd polegający na tym, że rozszerzenie Chrome nie przerysowywało strony po zmianie CSS z tego rozszerzenia.
źródło
Chciałem przywrócić wszystkie stany do poprzedniego stanu (bez przeładowywania), w tym elementy dodane przez jquery. Powyższe wdrożenie nie zadziała. i zrobiłem w następujący sposób.
źródło
Miałem listę reagujących składników, która po przewinięciu otworzyła kolejną stronę, a po powrocie lista nie była renderowana w Safari iOS, dopóki strona nie została przewinięta. To jest poprawka.
źródło
Poniżej css działa dla mnie na IE 11 i Edge, nie wymaga JS.
scaleY(1)
robi lewę tutaj. Wydaje się najprostszym rozwiązaniem.źródło
Pomogło mi to
źródło
2020: Lżejszy i silniejszy
Poprzednie rozwiązania już dla mnie nie działają.
Sądzę, że przeglądarki optymalizują proces rysowania, wykrywając coraz więcej „bezużytecznych” zmian.
To rozwiązanie powoduje, że przeglądarka rysuje klon, aby zastąpić oryginalny element. Działa i prawdopodobnie jest bardziej zrównoważony:
testowany na Chrome 80 / Edge 80 / Firefox 75
źródło