即使其开发者工具显示它,IE8也不会应用该样式

时间:2014-01-31 00:37:57

标签: 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>

1 个答案:

答案 0 :(得分:0)

我想我可能找到了答案。从我搜索类似帖子看来,问题在于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;}';
    ...
}