在 ie8 中,如果在更改类名时元素不使用关联的 css“重新绘制”,那么如何强制浏览器刷新而不破坏 ie8 性能?
这篇文章(如何强制 WebKit 重绘/重绘以传播样式更改?)建议调用 offsetHeight 来强制重绘。
这篇文章 ( http://www.tek-tips.com/viewthread.cfm?qid=1688809 ) 有一条评论建议从 body 元素中添加和删除一个类。
这两种方法都扼杀了 ie8 的性能,第一种方法对我的布局产生了副作用。
最好的方法是什么?
在 ie8 中,如果在更改类名时元素不使用关联的 css“重新绘制”,那么如何强制浏览器刷新而不破坏 ie8 性能?
这篇文章(如何强制 WebKit 重绘/重绘以传播样式更改?)建议调用 offsetHeight 来强制重绘。
这篇文章 ( http://www.tek-tips.com/viewthread.cfm?qid=1688809 ) 有一条评论建议从 body 元素中添加和删除一个类。
这两种方法都扼杀了 ie8 的性能,第一种方法对我的布局产生了副作用。
最好的方法是什么?
我为我的 ie8 问题提出的解决方案是在我正在更改的元素的近父级上添加/删除一个类。由于我使用的是modernizer,因此我检查了ie8,然后执行此添加/删除舞蹈以获取新的css 进行绘制。
$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');
}
这个问题的正确答案是您需要实际更改content规则。
.black-element:before { content:"Hey!"; color: #000;}
.red-element:before { content:"Hey! "; color: #f00;}
Hey!注意我在on之后添加的额外空间.red-element
可笑的是,这行得通:
function ie8Repaint(element) {
element.html(element.html().replace('>', '>'));
}
DOM 中实际上没有任何变化,因此它不会影响任何其他浏览器。
在其上触发移动或调整大小事件。
var ie8 = whateverYouUseToDetectIE();
var element = document.getElementById("my-element");
element.className += " new-class";
if (ie8) {
element.fireEvent("resize");
}
这扩展了此处的其他答案。您需要添加一个新类(Doug 的答案)并确保该类具有不同的内容值(Adam 的答案)。仅仅改变班级可能是不够的。需要更改内容以强制 IE8 重新绘制。这是一篇相关的博客文章。
这是要更改添加新类的 JQuery:
$(".my-css-class").addClass("my-css-class2");
这是第二类的 CSS,其内容值略有不同:
.my-css-class:before {content: "\e014";}
.my-css-class2:before {content: "\e014 ";}
我遇到了很多困难,尝试了一切都无济于事……直到我为 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;
}
现在我的复选框的 CSS 更改在 IE8、Chrome 和 Firefox 上运行良好!