Saya punya beberapa JavaScript yang sepele untuk melakukan perubahan gaya:
sel = document.getElementById('my_id');
sel.className = sel.className.replace(/item-[1-9]-selected/,'item-1-selected');
return false;
Ini berfungsi baik dengan versi terbaru FF, Opera dan IE, tetapi gagal pada versi terbaru Chrome dan Safari.
Itu mempengaruhi dua keturunan, yang kebetulan adalah saudara kandung. Saudara pertama memperbarui, tetapi yang kedua tidak. Anak dari elemen kedua juga memiliki fokus dan berisi tag <a> yang berisi kode di atas dalam atribut onclick .
Dalam “Developer Tools” jendela Chrome jika saya menyenggol (misalnya hapus centang & cek) setiap atribut setiap elemen, update saudara kedua dengan gaya yang benar.
Apakah ada solusi untuk dengan mudah dan terprogram "menyenggol" WebKit agar melakukan hal yang benar?
css
google-chrome
safari
webkit
danorton
sumber
sumber
Jawaban:
Saya menemukan beberapa saran rumit dan banyak yang sederhana yang tidak berhasil, tetapi komentar kepada salah satu dari mereka oleh Vasil Dinkov memberikan solusi sederhana untuk memaksa redraw / pengecatan ulang yang berfungsi dengan baik:
Saya akan membiarkan orang lain berkomentar jika itu berfungsi untuk gaya selain "blok".
Terima kasih, Vasil!
sumber
'inline-block'
,'table'
atau'run-in'
bukannya'none'
, tetapi ini mungkin memiliki efek samping. Juga, batas waktu 0 memicu reflow seperti halnya kuerioffsetHeight
:sel.style.display = 'run-in'; setTimeout(function () { sel.style.display = 'block'; }, 0);
Kami baru-baru ini menemukan ini dan menemukan bahwa mempromosikan elemen yang terpengaruh ke lapisan komposit dengan translateZ di CSS 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 jawaban yang diterima hampir pasti menyebabkan reflow dan pengecatan ulang , bukan hanya pengecatan ulang.
Webkit dan Blink telah bekerja keras untuk menghasilkan kinerja, dan jenis gangguan ini adalah efek samping yang disayangkan dari optimasi yang bertujuan untuk mengurangi aliran dan cat yang tidak perlu. CSS akan berubah atau spesifikasi berikutnya yang berhasil akan menjadi solusi di masa depan, kemungkinan besar.
Ada cara lain untuk mencapai lapisan komposit, tetapi ini adalah yang paling umum.
sumber
solusi danorton tidak bekerja untuk saya. Saya punya beberapa masalah aneh di mana webkit tidak akan menggambar beberapa elemen sama sekali; di mana teks dalam input tidak diperbarui hingga onur; dan mengubah className tidak akan menghasilkan redraw.
Solusi saya, saya tidak sengaja temukan, adalah menambahkan elemen gaya kosong ke tubuh, setelah skrip.
Itu memperbaikinya. Seberapa aneh itu? Semoga ini bermanfaat bagi seseorang.
sumber
var div = $('<div>').appendTo(element); setTimeout(function(){ div.remove(); }, 0);
$('<style></style>').appendTo($(document.body)).remove();
Karena tampilan + pemicu offset tidak berfungsi untuk saya, saya menemukan solusi di sini:
http://mir.aculo.us/2009/09/25/force-redraw-dom-technique-for-webkit-based-browsers/
yaitu
sumber
scale(1)
, saya menugaskannya sebagaielement.style.webkitTransform = element.style.webkitTransform
. Alasan untuk ini adalah bahwa pengaturan itu ke yang pertama adalah mendistorsi halaman sedikit untukabsolute
elemen yang diposisikan!display
solusinya.Saya menderita masalah yang sama. Perbaikan toggling display danorton bekerja untuk saya ketika ditambahkan ke fungsi langkah animasi saya, tetapi saya khawatir tentang kinerja dan saya mencari opsi lain.
Dalam keadaan saya, elemen yang tidak dicat ulang berada dalam elemen posisi absolut yang pada saat itu tidak memiliki indeks-z. Menambahkan z-index ke elemen ini mengubah perilaku Chrome dan repaints terjadi seperti yang diharapkan -> animasi menjadi lancar.
Saya ragu bahwa ini adalah obat mujarab, saya bayangkan itu tergantung mengapa Chrome memilih untuk tidak menggambar ulang elemen tersebut tetapi saya memposting solusi khusus ini di sini dalam bantuan yang diharapkan seseorang.
Ceria, Rob
tl; dr >> Cobalah menambahkan indeks-z ke elemen atau induknya.
sumber
Pekerjaan berikut. Hanya perlu diatur sekali dalam CSS murni. Dan itu berfungsi lebih andal daripada fungsi JS. Performa tampaknya tidak terpengaruh.
sumber
zoom
bukannya padding:@-webkit-keyframes safariBugFix {from { zoom: 100%; } to { zoom: 99.99999%; }}
Untuk beberapa alasan saya tidak bisa mendapatkan jawaban danorton untuk bekerja, saya bisa melihat apa yang seharusnya dilakukan, jadi saya mengubah sedikit ini:
dan itu berhasil untuk saya.
sumber
Saya datang ke sini karena saya perlu menggambar ulang scrollbar di Chrome setelah mengubah css-nya.
Jika seseorang memiliki masalah yang sama, saya menyelesaikannya dengan memanggil fungsi ini:
Metode ini bukan solusi terbaik, tetapi dapat bekerja dengan segalanya, menyembunyikan dan menunjukkan elemen yang perlu digambar ulang dapat menyelesaikan setiap masalah.
Ini biola tempat saya menggunakannya: http://jsfiddle.net/promatik/wZwJz/18/
sumber
Saya menemukan ini hari ini: Element.redraw () untuk prototype.js
Menggunakan:
Namun, saya terkadang memperhatikan bahwa Anda harus memanggil redraw () pada elemen yang bermasalah secara langsung. Terkadang menggambar ulang elemen induk tidak akan menyelesaikan masalah yang dialami anak.
Artikel bagus tentang cara browser merender elemen: Rendering: repaint, reflow / relayout, restyle
sumber
appendChild
adalah metode DOM, bukan metode jQuery.Saya punya masalah dengan sejumlah div yang dimasukkan ke div lain dengan
position: absolute
, div yang dimasukkan tidak memiliki atribut posisi. Ketika saya mengubah ini untukposition:relative
itu berfungsi dengan baik. (Sangat sulit untuk menentukan masalah)Dalam kasus saya elemen mana yang dimasukkan oleh Angular dengan
ng-repeat
.sumber
Saya tidak percaya ini masih menjadi masalah di tahun 2014. Saya baru saja mengalami masalah ini ketika menyegarkan kotak teks posisi tetap di bagian kiri bawah halaman saat menggulir, keterangannya akan 'hantu' naik ke atas layar. Setelah mencoba semuanya di atas tanpa hasil, saya perhatikan banyak hal yang lambat / menyebabkan masalah karena membuat relayOM DOM yang sangat singkat dll menyebabkan perasaan agak tidak wajar menggulung dll ...
Saya akhirnya membuat posisi tetap, div ukuran penuh dengan
pointer-events: none
dan menerapkan jawaban danorton untuk elemen itu, yang tampaknya memaksa redraw pada seluruh layar tanpa mengganggu DOM.HTML:
CSS:
JS:
sumber
z-index
danpointer-events
aturan-aturan yang berlebihan di sini.Bukannya pertanyaan ini membutuhkan jawaban lain, tetapi saya menemukan hanya mengubah warna dengan sedikit memaksa pengecatan ulang dalam situasi khusus saya.
The
setTimeout
terbukti penting untuk memindahkan perubahan gaya kedua di luar acara loop arus.sumber
Satu-satunya solusi yang berfungsi untuk saya mirip dengan jawaban sowasred2012:
Saya memiliki banyak blok masalah di halaman, jadi saya mengubah
display
properti elemen root. Dan saya menggunakandisplay: table;
sebagai gantinyadisplay: none;
, karenanone
akan mengatur ulang gulir offset.sumber
Saya menggunakan
transform: translateZ(0);
metode ini tetapi dalam beberapa kasus tidak cukup.Saya bukan penggemar menambahkan dan menghapus kelas jadi saya mencoba mencari cara untuk menyelesaikan ini dan berakhir dengan peretasan baru yang bekerja dengan baik:
sumber
Karena semua orang tampaknya memiliki masalah dan solusi mereka sendiri, saya pikir saya akan menambahkan sesuatu yang berfungsi untuk saya. Di Android 4.1 dengan Chrome saat ini, mencoba menyeret kanvas di dalam div dengan overflow: disembunyikan, saya tidak bisa mendapatkan redraw kecuali saya menambahkan elemen ke div induk (di mana itu tidak akan membahayakan).
Tidak ada layar berkedip atau pembaruan nyata, dan membersihkan setelah saya sendiri. Tidak ada variabel cakupan kelas atau global, hanya lokal. Sepertinya tidak menyakiti apa pun di Mobile Safari / iPad atau browser desktop.
sumber
Saya bekerja pada aplikasi ionic html5, pada beberapa layar saya telah
absolute
memposisikan elemen, ketika gulir ke atas atau ke bawah di perangkat iOS (iPhone 4,5,6, 6+) saya memiliki bug repaint.Mencoba banyak solusi tidak satupun dari mereka bekerja kecuali yang satu ini menyelesaikan masalah saya.
Saya telah menggunakan kelas css
.fixRepaint
pada elemen posisi absolut ituIni telah memperbaiki masalah saya, mungkin bisa membantu seseorang
sumber
Ini bagus untuk JS
Tetapi dalam Jquery, dan terutama ketika Anda hanya dapat menggunakan $ (dokumen). Sudah dan tidak dapat mengikat ke acara .load objek karena alasan tertentu, berikut ini akan berfungsi.
Anda perlu mendapatkan wadah OUTER (PALING) dari objek / divs dan kemudian menghapus semua isinya ke dalam variabel, kemudian menambahkannya kembali. Ini akan membuat SEMUA perubahan dilakukan dalam wadah luar yang terlihat.
sumber
Saya menemukan metode ini berguna ketika bekerja dengan transisi
sumber
retasan "display / offsetHeight" tidak berfungsi dalam kasus saya, setidaknya saat diterapkan pada elemen yang dianimasikan.
saya memiliki menu dropdown yang sedang dibuka / ditutup atas konten halaman. artefak dibiarkan pada konten halaman setelah menu ditutup (hanya di browser webkit). satu-satunya cara hack "display / offsetHeight" bekerja adalah jika saya menerapkannya pada tubuh, yang tampaknya jahat.
Namun, saya memang menemukan solusi lain:
ini masih cukup hacky (menggunakan properti CSS3 untuk memaksa rendering perangkat keras), tetapi setidaknya itu hanya mempengaruhi elemen yang dimaksud, dan bekerja untuk saya pada safari dan chrome pada PC dan Mac.
sumber
Ini sepertinya terkait dengan ini: gaya jQuery tidak diterapkan di Safari
Solusi yang disarankan dalam respons pertama telah bekerja dengan baik untuk saya dalam skenario ini, yaitu: menerapkan dan menghapus kelas dummy ke tubuh setelah melakukan perubahan gaya:
Ini memaksa safari untuk menggambar ulang.
sumber
saran di atas tidak berhasil untuk saya. tetapi yang di bawah tidak.
Ingin mengubah teks di dalam jangkar secara dinamis. Kata "Cari". Membuat "tag" tag dalam dengan atribut id. Konten yang dikelola menggunakan javascript (di bawah)
isi skrip:
sumber
Saya mengalami masalah dengan SVG yang menghilang di Chrome untuk Android ketika orientasi diubah dalam keadaan tertentu. Kode di bawah ini tidak mereproduksinya, tetapi pengaturan yang kami miliki.
Setengah hari kemudian setelah menyodok dan mendorong dan tidak senang dengan solusi peretasan yang ditawarkan di sini, saya menemukan bahwa masalah ini disebabkan oleh fakta bahwa elemen tersebut tetap tersimpan dalam ingatan saat menggambar yang baru. Solusinya adalah membuat ID linearGradient pada SVG unik, meskipun hanya pernah digunakan sekali per halaman.
Ini dapat dicapai dengan berbagai cara, tetapi untuk aplikasi sudut kami, kami menggunakan fungsi lodash uniqueId untuk menambahkan variabel ke ruang lingkup:
Petunjuk Sudut (JS):
Pembaruan HTML:
Baris 5:
<linearGradient ng-attr-id="{{indicatorColourPatternId}}" x1="0" x2="0" y1="0" y2="1">
Baris 11:
<rect x="0" y="0" rx="5" ry="5" width="100%" height="100%" ng-attr-fill="url(#{{indicatorColourPatternId}})"/>
Saya harap jawaban ini menyelamatkan seseorang dari hari-hari dengan menghancurkan keyboard mereka.
sumber
Saya akan merekomendasikan cara yang kurang resmi dan lebih formal untuk memaksa reflow: use forceDOMReflowJS . Dalam kasus Anda, kode Anda akan terlihat sebagai berikut.
sumber
Saya menemukan bahwa hanya menambahkan gaya konten ke elemen memaksanya untuk mengecat ulang, ini harus menjadi nilai yang berbeda setiap kali Anda ingin menggambar ulang dan tidak perlu menggunakan elemen pseudo.
sumber
Saya mencoba jawaban yang lebih sederhana tetapi tidak berhasil untuk saya. Saya mengalami masalah untuk memiliki clientWidth yang sama dengan safari dibandingkan dengan browser lain dan kode ini memecahkan masalah:
Ini benar-benar aneh karena jika saya mencoba lagi untuk mendapatkan clientWidth setelah get_safe_value, saya mendapatkan nilai buruk dengan safari, pengambil harus antara
sty.transform = "translateZ(1px)";
dansty.transform = "";
Solusi lain yang bekerja secara definitif adalah
Masalahnya adalah Anda kehilangan fokus dan status gulir.
sumber
Ini akan memaksa pengecatan ulang sambil menghindari kerlap-kerlip, mengutak-atik elemen yang ada dan masalah tata letak ...
sumber
Solusi sederhana dengan jquery:
atau
Memiliki SVG yang tidak ditampilkan ketika ditambahkan ke html.
Ini dapat ditambahkan setelah elemen svg ada di layar.
Solusi yang lebih baik adalah dengan menggunakan:
dan dengan jQuery:
ini akan ditampilkan dengan benar di Chrome.
sumber