Sekali-sekali, Chrome akan membuat HTML / CSS yang valid dengan benar salah atau tidak sama sekali. Menggali melalui inspektur DOM sering cukup untuk membuatnya menyadari kesalahan cara dan menggambar ulang dengan benar, sehingga terbukti bahwa markupnya baik. Ini sering terjadi (dan dapat diprediksi) cukup dalam proyek yang sedang saya kerjakan sehingga saya telah menempatkan kode untuk memaksa redraw dalam keadaan tertentu.
Ini berfungsi di sebagian besar kombinasi browser / os:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
Seperti pada, atur beberapa properti CSS yang tidak digunakan, lalu minta beberapa informasi yang memaksa redraw, lalu unduh properti tersebut. Sayangnya, tim yang cemerlang di belakang Chrome untuk Mac tampaknya telah menemukan cara untuk mendapatkan offsetHeight itu tanpa menggambar ulang. Dengan demikian membunuh hack yang bermanfaat.
Sejauh ini, yang terbaik yang saya hasilkan untuk mendapatkan efek yang sama pada Chrome / Mac adalah keburukan ini:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
Seperti dalam, sebenarnya memaksa elemen untuk melompat sedikit, lalu dinginkan sebentar dan melompat kembali. Yang lebih parah, jika Anda menjatuhkan batas waktu di bawah 500 ms (ke tempat yang kurang terlihat), sering kali tidak akan memiliki efek yang diinginkan, karena browser tidak akan berkeliling untuk menggambar ulang sebelum kembali ke keadaan semula.
Adakah yang mau menawarkan versi yang lebih baik dari hack redraw / refresh ini (lebih disukai berdasarkan contoh pertama di atas) yang bekerja di Chrome / Mac?
sumber
Jawaban:
Tidak yakin persis apa yang ingin Anda capai tetapi ini adalah metode yang saya gunakan di masa lalu dengan keberhasilan memaksa browser untuk menggambar ulang, mungkin itu akan berhasil untuk Anda.
Jika gambar sederhana ini tidak berfungsi, Anda dapat mencoba yang ini. Ini menyisipkan simpul teks kosong ke dalam elemen yang menjamin redraw.
EDIT: Menanggapi Šime Vidas apa yang kami capai di sini akan menjadi reflow paksa. Anda dapat mengetahui lebih lanjut dari master sendiri http://paulirish.com/2011/dom-html5-css3-performance/
sumber
.hide().show(0)
pada elemen apa pun (saya memilih footer halaman) itu harus menyegarkan halaman.Tidak ada jawaban di atas yang berfungsi untuk saya. Saya memang memperhatikan bahwa mengubah ukuran jendela saya memang menyebabkan redraw. Jadi ini berhasil untuk saya:
sumber
$(window).trigger('resize')
tidak, itu hanya melempar peristiwa 'mengubah ukuran' yang memicu penangan terkait jika ditugaskan.Kami baru-baru ini menemukan ini dan menemukan bahwa mempromosikan elemen yang terpengaruh ke lapisan komposit dengan translateZ memperbaiki masalah tanpa memerlukan javascript tambahan.
Karena masalah melukis ini sebagian besar muncul di Webkit / Blink, dan perbaikan ini sebagian besar menargetkan Webkit / Blink, dalam beberapa kasus lebih baik. Terutama karena banyak solusi JavaScript menyebabkan reflow dan pengecatan ulang , bukan hanya pengecatan ulang.
sumber
neon-animated-pages
. Terima kasih: +1:Solusi ini tanpa batas waktu! Redraw kekuatan nyata ! Untuk Android dan iOS.
sumber
Ini bekerja untuk saya. Kudos pergi ke sini .
sumber
$().hide().show(0)
show()
berbeda dari yangshow(0)
di mana dengan menentukan durasi di yang terakhir, itu dipicu oleh metode animasi jQuery dalam batas waktu, bukan segera yang memberikan waktu untuk membuat dengan cara yang sama yanghide(0, function() { $(this).show(); })
tidak .Menyembunyikan elemen dan kemudian menampilkannya lagi dalam setTimeout 0 akan memaksa redraw.
sumber
myElement.getBoundingClientRect()
, yang sedang di-cache, kemungkinan untuk keperluan optimasi / kinerja. Saya hanya menambahkan batas waktu nol milidetik untuk fungsi yang menambahkan elemen baru ke DOM dan mendapatkan nilai baru setelah elemen lama dengan nilai sebelumnya (di-cache) telah dihapus dari DOM.Ini sepertinya melakukan trik untuk saya. Plus, itu benar-benar tidak terlihat sama sekali.
sumber
panggilan
window.getComputedStyle()
harus memaksa reflowsumber
offsetHeight
properti yang bukan css.Saya mengalami tantangan ini hari ini di OSX El Capitan dengan Chrome v51. Halaman yang dipermasalahkan bekerja dengan baik di Safari. Saya mencoba hampir setiap saran pada halaman ini - tidak ada yang berhasil - semua memiliki efek samping ... Saya akhirnya menerapkan kode di bawah ini - super sederhana - tidak ada efek samping (masih berfungsi seperti sebelumnya di Safari).
Solusi: Beralih kelas pada elemen yang bermasalah sesuai kebutuhan. Setiap toggle akan memaksa redraw. (Saya menggunakan jQuery untuk kenyamanan, tetapi JavaScript vanilla seharusnya tidak menjadi masalah ...)
jQuery Class Toggle
Kelas CSS
Dan itu saja ...
CATATAN: Anda harus menjalankan cuplikan di bawah "Halaman Penuh" untuk melihat efeknya.
sumber
panggil fungsi ini setelah 500 milidetik.
sumber
Jika Anda ingin mempertahankan gaya yang dinyatakan dalam lembar gaya Anda, lebih baik menggunakan sesuatu seperti:
NB: dengan webkit / blink terbaru, menyimpan nilai
offsetHeight
wajib untuk memicu pengecatan ulang, jika tidak VM (untuk keperluan optimasi) mungkin akan melewati instruksi itu.Pembaruan: menambahkan
offsetHeight
pembacaan kedua , perlu untuk mencegah browser dari antrian / caching perubahan properti / kelas CSS berikut dengan mengembalikandisplay
nilai (dengan cara ini transisi CSS yang dapat mengikuti harus dirender)sumber
// <== ide buruk$('article.child').redraw();
sumber
.fadeIn(1)
bukan.show(300)
untuk saya - tidak mendorong elemen di sekitar. Jadi saya kira, itu adalah pemicudisplay:none
dan kembali keblock
Suatu pendekatan yang bekerja untuk saya di IE (saya tidak bisa menggunakan teknik tampilan karena ada input yang tidak boleh kehilangan fokus)
Ini berfungsi jika Anda memiliki 0 margin (mengubah padding juga berfungsi)
sumber
Hanya CSS. Ini berfungsi untuk situasi di mana elemen anak dihapus atau ditambahkan. Dalam situasi ini, batas dan sudut bundar dapat meninggalkan artefak.
sumber
Perbaikan saya untuk IE10 + IE11. Pada dasarnya yang terjadi adalah Anda menambahkan DIV di dalam elemen pembungkus yang harus dihitung ulang. Kemudian cukup keluarkan dan voila; bekerja seperti pesona :)
sumber
Sebagian besar jawaban membutuhkan penggunaan batas waktu asynchroneous, yang menyebabkan kedipan yang mengganggu.
Tapi saya datang dengan yang ini, yang bekerja dengan lancar karena sinkron:
sumber
Ini solusi saya yang berfungsi untuk menghilangkan konten ...
sumber
Saya mengalami masalah serupa dan garis JS sederhana ini membantu memperbaikinya:
Dalam kasus saya itu adalah bug dengan ekstensi Chrome yang tidak menggambar ulang halaman setelah mengubah CSS-nya dari dalam ekstensi.
sumber
Saya ingin mengembalikan semua status ke status sebelumnya (tanpa memuat ulang) termasuk elemen yang ditambahkan oleh jquery. Implementasi di atas tidak akan berhasil. dan saya lakukan sebagai berikut.
sumber
Saya memiliki daftar komponen reaksi yang ketika digulir, kemudian membuka halaman lain, kemudian ketika kembali daftar tidak diberikan pada Safari iOS sampai halaman digulir. Jadi ini adalah perbaikannya.
sumber
Di bawah ini css berfungsi untuk saya di IE 11 dan Edge, tidak perlu JS.
scaleY(1)
lakukan triknya di sini. Tampaknya solusi paling sederhana.sumber
Itu membantu saya
sumber
2020: Lebih ringan dan lebih kuat
Solusi sebelumnya tidak berfungsi lagi untuk saya.
Saya kira browser mengoptimalkan proses menggambar dengan mendeteksi semakin banyak perubahan "tidak berguna".
Solusi ini membuat browser menggambar klon untuk mengganti elemen asli. Ini bekerja dan mungkin lebih berkelanjutan:
diuji pada Chrome 80 / Edge 80 / Firefox 75
sumber