Dans ie8, si les éléments ne "repeignent" pas le css associé lorsque vous modifiez le nom de la classe, comment forcer le navigateur à actualiser et à ne pas supprimer les performances de ie8?
Cet article ( Comment puis-je forcer WebKit à redessiner/repeindre pour propager les changements de style? ) a suggéré d’appeler offsetHeight, ce qui force le repeint.
Ce message ( http://www.tek-tips.com/viewthread.cfm?qid=1688809 ) comportait un commentaire suggérant d'ajouter et de supprimer une classe de l'élément body.
Ces deux approches ont tué ie8 performances et la première a eu des effets secondaires sur ma présentation.
Quelle est la meilleure approche?
La solution que j'ai trouvée pour mon problème ie8 était d'ajouter/de supprimer une classe sur un parent proche de l'élément que je suis en train de changer. Depuis que j'utilise modernizer, je vérifie ie8, puis ajoute/supprime dance pour obtenir le nouveau fichier CSS à Paint.
$uicontext.addClass('new-ui-look');
if ($('html').is('.ie8')) {
// IE8: ui does not repaint when css class changes
$uicontext.parents('li').addClass('z').removeClass('z');
}
La réponse correcte à cette question est que vous devez réellement changer la règle content
.
.black-element:before { content:"Hey!"; color: #000;}
.red-element:before { content:"Hey! "; color: #f00;}
Notez l'espace supplémentaire que j'ai ajouté après Hey!
sur .red-element
Ridiculement, cela fonctionne:
function ie8Repaint(element) {
element.html(element.html().replace('>', '>'));
}
Rien ne change réellement dans le DOM, cela n'affectera donc aucun autre navigateur.
Déclenchez un événement de déplacement ou de redimensionnement.
var ie8 = whateverYouUseToDetectIE();
var element = document.getElementById("my-element");
element.className += " new-class";
if (ie8) {
element.fireEvent("resize");
}
Cela développe les autres réponses ici. Vous devez à la fois ajouter une nouvelle classe ( La réponse de Doug ) et vous assurer que la classe a une valeur de contenu différente ( La réponse d'Adam ). Changer la classe à elle seule peut ne pas suffire. Le changement de contenu est nécessaire pour forcer IE8 à repeindre. Voici un article de blog connexe .
Voici le JQuery pour changer ajouter la nouvelle classe:
$(".my-css-class").addClass("my-css-class2");
Voici CSS avec la 2ème classe ayant une valeur de contenu légèrement différente:
.my-css-class:before {content: "\e014";}
.my-css-class2:before {content: "\e014 ";}
J'ai eu beaucoup de difficulté et j'ai tout essayé en vain ... jusqu'à ce que j'essaye pour IE8
function toggleCheck(name) {
el = document.getElementById(name);
if( hasClass(el, 'checked') ) {
el.className = el.className.replace(/checked/,'unchecked');
} else if( hasClass(el, 'unchecked') ) {
el.className = el.className.replace(/unchecked/,'checked');
}
document.body.className = document.body.className;
}
function hasClass(element, cls) {
return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}
Et maintenant, mes modifications CSS pour mes cases à cocher fonctionnent à merveille pour IE8, Chrome et Firefox!