css - IE8 不应用该样式,即使它的开发人员工具显示它

标签 css internet-explorer-8 pseudo-element

我想知道是否有人遇到过这个问题,他们是如何解决的。 IE 没有为我在运行时添加的类应用样式 (jQuery)。奇怪的是,开发人员工具显示应该应用它。见下图。

“fa-bars”元素有一个带有“blue”类的父元素。在本例中,我在 $(document).ready() 中添加了“blue”类。如果我在 HTML 标记上添加“蓝色”类(而不是在运行时添加),它会正确应用样式。但这不是我想做的。

我只在 IE 上遇到这个问题(我使用 IE8),但 Chrome 和 FF 都按照我的预期(正确)呈现页面。关于如何解决这个问题的任何想法?

似乎只有在呈现伪内容(例如 FontAwesome)时才会出现问题。如果我用纯文本替换该元素,它就可以工作。

enter image description here

已添加:

这是我的完整 HTML,其中包含指向 FontAwesome 和 jQuery 的 CDN 的链接:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width" />
        <title>Test</title>
        <link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
        <script src="http://code.jquery.com/jquery-1.10.2.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                $('.nav-toc').addClass('blue');
            });
        </script>
        <style type="text/css">
            .fa {font-size: 1.5em;}
            .nav-toc {color: red;}
            .blue {color: blue;}
        </style>
    </head>

    <body class="pson-green">
        <div id="master-body">
            <!-- Top banner (Menu) -->
            <div id="master-header">
                <div class="content-wrapper">
                    <div id="nav-grp-toc" class="nav-container">
                        <div class="nav-btn nav-toc" title="Contents Menu"><i class="fa fa-bars"></i></div>
                    </div><div id="nav-grp-help" class="nav-container">
                        <div class="nav-btn nav-help" title="Help"><i class="fa fa-question"></i></div>
                    </div><div id="nav-grp-counters" class="nav-container">
                        <div id="page-counter" class="nav-page counter-panel">
                            <div id="current-page" class="current-count" title="Current page number"></div>
                            <div id="total-pages" class="max-count" title="Total number of pages"></div>
                        </div>
                        <div id="question-counter" class="nav-quiz counter-panel">
                            <div id="current-question" class="current-count" class="Current question number"></div>
                            <div id="total-questions" class="max-count" title="Total number of questions"></div>
                        </div>
                    </div><div id="nav-grp-steppers" class="nav-container">
                        <div class="nav-btn nav-page nav-prev" title="Back"><i class="fa fa-chevron-left"></i></div>
                        <div class="nav-btn nav-page nav-next" title="Next"><i class="fa fa-chevron-right"></i></div>
                    </div><div id="nav-grp-exit" class="nav-container">
                        <div class="nav-btn nav-page nav-exit" title="Exit Course"><i class="fa fa-sign-out"></i></div>
                    </div>
                </div>
                <div id="dimmer-for-header" class="dimmer"></div>
            </div>
        </div>
    </body>   
</html>

最佳答案

我想我可能已经找到了答案。从我对类似帖子的搜索看来,问题出在 IE 对伪元素的处理上。不幸的是,我对这些帖子的许多答案/建议似乎对我的情况不起作用,除了这个 SO item .基本上,它建议强制 IE 重新绘制伪元素,方法是临时向 DOM 添加一个删除所有伪内容的样式标签,然后立即删除该样式标签。当结合基于此 SO item 的 IE8 检查时,它似乎有效。 .我将此添加到我的脚本中:

var ie = (function () {
    var undef,
    v = 3,
    div = document.createElement('div'),
    all = div.getElementsByTagName('i');
    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
                        all[0]
                        );
   return v > 4 ? v : undef;
 } ());

 function redrawPseudos() {
    var head = document.getElementsByTagName('head')[0],
    style = document.createElement('style');
    style.type = 'text/css';
    style.styleSheet.cssText = ':before,:after{content:none !important;}';
    head.appendChild(style);
    setTimeout(function () {
        head.removeChild(style);
    }, 0);
 }

所以当我必须添加/删除一个类时,我希望它会影响伪元素的样式,我必须这样做:

 $('.class1').addClass('newclass');   
 if (ie === 8) {
    redrawPseudos();
 }

这可能是一种昂贵的方式。但是我只有不到十几个伪元素。

已添加:

您可以通过将选择器传递给 redrawPseudos() 并将其包含到样式中来改进这一点。这会将重绘限制为由您的选择器标识的元素。

function redrawPseudos(sel) {
    ...
    style.styleSheet.cssText = sel + ':before, ' + sel + ':after, ' + sel + ' *:before, ' + sel + ' *:after ' + '{content:none !important;}';
    ...
}

关于css - IE8 不应用该样式,即使它的开发人员工具显示它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21470482/

相关文章:

css - 向右下拉菜单

javascript - 汉堡包图标无响应

internet-explorer - PIE.htc 不适用于 IE8

html - 一个:after point的相对定位

html - Twitter Bootstrap 调整宽度 - 登陆页面

css - 如何实现 CSS 到 powershell 转换 html 输出?

css - 悬停时在 IE8 中的奇怪定位

jquery - 在 IE 8 上将背景颜色设置为透明动画

css - 在 IE 中对 css 生成的内容应用文本装饰

css - 在伪元素未显示在路径元素上之前