IE8中的强制重新计算样式-

问题描述 投票:1回答:2

如何最准确地强制浏览器重新计算整个样式或单个元素的样式?

我不能简单地通过替换innerHTML或其他内容来重新加载整个DOM,因为那样会丢失所有附加的事件处理程序,因此,我需要使用会迫使浏览器重新计算样式的内容。这确实需要与IE8一起使用。

我曾尝试搜索任何可解决此问题的方法,但至少没有使用“重新计算样式”一词,我找不到任何地方,而我可以找到的关于“重新加载样式”的唯一相关结果是“ How to refresh the style of a page after css switch”。但是,该问题对我不起作用,因为我不是直接更改需要更改样式的元素的类,而是更改其同级。

[Here is a simplified demo,仅提供相关代码:

HTML:

<span id="foo">This gets a class,</span>
<div>...and this should become red,</div>
<button onclick="document.getElementById('foo').className = 'foo';">...if you click here</button>

CSS:

span.foo + div {color:red;}

如果您测试该演示,至少要在IE11的IE8仿真模式下,您将看到样式不会更新。对我来说,它仅在我在F12界面的DOM查看器中选择节点后才更新。 (PS:IE8仿真模式位于IE11的F12界面的底部选项卡中。)

javascript jquery css internet-explorer-8
2个回答
1
投票

+ selector所针对的元素的祖先上切换类:

$('body').addClass('ie_force_restyle').removeClass('ie_force_restyle');

这将强制IE8-重新执行与给定元素的所有后代匹配的选择器。

为了更加有效,您也可以定位#foo的父对象:

$('#foo').parent().addClass('ie_force_restyle').removeClass('ie_force_restyle');

Demo

在Windows 7 x64上测试-IE8。

注意:我仅针对相邻的兄弟选择器+测试了此设置,但我很确定它应适用于~:first-child和其他对旧IE中的DOM更改无反应的选择器。

[[虽然我不能主张独创性,但是在为IE8-编写:checked pseudo-class polyfill时,我已经在Internet的黑暗角落找到了该解决方案。

我在IE11上也遇到了类似的问题-它在Vue.js应用的特定部分中出现了奇怪的z-index问题。检查受影响的元素或调整窗口大小会突然导致其自行修复。

[我发现我可以通过使用通用CSS选择器添加和删除样式标签来强制重新计算整个Java样式:

:checked

受此var head = document.querySelector("head");
var style = head.appendChild(document.createElement("style"));
var styleSheet = document.styleSheets[document.styleSheets.length - 1];
styleSheet.insertRule("* { }", 0);
head.removeChild(style);
的启发。

0
投票
我在IE11上也遇到了类似的问题-它在Vue.js应用的特定部分中出现了奇怪的z-index问题。检查受影响的元素或调整窗口大小会突然导致其自行修复。
© www.soinside.com 2019 - 2024. All rights reserved.