【问题标题】:How do you work around IE not supporting :after?您如何解决 IE 不支持 :after 的问题?
【发布时间】:2010-10-23 05:47:25
【问题描述】:

我有一堆列表

<ul>
  <li class="first">Item 1</li>
  <li>Item 2</li>
  <li class="last">Item 3</li>
</ul>

风格化

li:after {
  content: ' / ';
}
li.last:after {
  content: '';
}

这一定是一种常见的问题。我想我可以弄乱html并放入包含字符的中介&lt;li&gt;,或者如果IE是加载浏览器,我可以连接一个javascript将它们放在那里,但这不会抓住人们没有javascript。伊诺。我倾向于使 html 变得混乱,但我想听听对此是否有一些意见。

【问题讨论】:

    标签: css internet-explorer css-selectors


    【解决方案1】:

    如果您的内容不打算在运行时更改,您可以使用以下内容:

    .icon-glass {
      *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf000;');
    }
    

    如果您的内容打算在运行时更改,您可以执行以下操作:

    .icon-glass {
      *top:expression(0, this.innerHTML = '&#xf000;');
    }
    

    不幸的是,这非常慢。虽然它可能在 IE6 中工作,但会显着降低性能,但如果页面上有太多图标,IE7 可能会崩溃。所以我不会推荐第二种技术,除非你只使用很少的图标并且你可以承受性能下降。

    【讨论】:

      【解决方案2】:

      尝试使用类似 jQuery 的东西。

      `$(函数(){

      $('li').not(':last-child').append('\'');

      });`

      它不会弄乱 html。 此外,要使其仅适用于 IE,请尝试使用 jquery 兼容性。

      【讨论】:

        【解决方案3】:

        Internet Explorer (IE) 不支持 :after 选择器我们必须改用一些技巧,例如这个:

        li { scrollbar-face-color: expression(!this.isInserted==true ? this.isInserted=(this.innerHTML = '' + this.innerHTML + 'xkcd150') : ''); }
        

        "xkcd150" - 这个将被添加到每个&lt;li&gt; 之后。

        它是一个表达式,通常用于替换和修复一些 IE 错误。

        所以,完整代码是:

        li { scrollbar-face-color: expression(!this.isInserted==true ? this.isInserted=(this.innerHTML = '' + this.innerHTML + ' / ') : ''); }
        
        li.last {
        scrollbar-face-color: expression(!this.isInserted==true ? this.isInserted=(this.innerHTML = '' + this.innerHTML + '') : ''); }
        

        第一行加“/”,第二行什么都不加。

        所有代码都必须添加到您的 css 文件中。

        【讨论】:

        • 我不知道是因为极端聪明而投赞成票,还是因为有史以来最邪恶的黑客而投反对票。 8-)
        • 这个 hack 是一个内联的 javascript,没有更多的用处。而且......它有效:)
        【解决方案4】:

        我使用 javascript 和条件 cmets。即使用 jQuery。

         <!--[if IE 6]>
           <script type='text/javascript'>
             $(document).ready( function() {
              $('li').not('li.last').after('/');
             });
           </script>
         <![endif]-->
        

        使用单独的 JS 文件当然更好。
        这也有一个缺点,即您必须将所有内容编写两次,因为您将它放在 CSS 中以用于良好的浏览器,并再次在 javascript 中用于 IE6。

        【讨论】:

          【解决方案5】:

          如果 IE 支持 last-child,您就不需要执行 class="last" :P。

          IE 支持一直并将继续是垃圾。 IE 8 已经做出了巨大的改进, :after 和 :before 正如你所期望的那样工作,IE 7 也支持它们。只针对这两个,特别是因为微软正在推出 IE 8 而不是 Windows 更新。

          【讨论】:

          • 我想我会因此而被遗忘 :P 与 IE 6 相比,IE 8 绝对令人惊叹,并且为它和其他符合标准的浏览器进行开发很容易。一个没有完全搞砸的盒子模型,符合标准的渲染,或者几乎至少。在我正在开发的一个网站上,我没有在 CSS 中实现任何 hack,并且该网站在 IE 8、FireFox、Chrome、Opera 和 Safari 中呈现完全相同。
          • 我猜 mod down 真的是因为这是一个评论而不是一个答案。
          • 好吧,如果客户端不针对 ie6 没问题,我不会。 tbh 我没有跟上 ie8 的发展,但很高兴听到这并不全是坏事。
          【解决方案6】:
          1. 使用IE7.js hack 添加伪元素支持。
          2. 使用条件 cmets 添加到标记以模拟该效果或删除一些现有样式以使其在没有分隔符的情况下更易于阅读 - 例如,让列表项堆叠在条件注释的样式表中
          3. 通过重新排列样式让 IE6 优雅降级,这样就不会发生这种情况,即使它在其他浏览器中看起来不同。

          【讨论】:

          • 啊,我忘了条件 cmets。它们必须是混乱 html 的最简洁的方式
          【解决方案7】:

          这是一个你不喜欢的想法。 8-) 将您的 / 符号作为背景图像放入 &lt;li&gt;s 的右侧填充中。

          【讨论】:

          • 你是认真的 :D 你平时是这样做的吗?
          • 在这种情况下,我只使用了竖线,而不是斜线,在这种情况下,您可以使用右边框(例如,entrian.com/source-search 上的顶部导航菜单)
          【解决方案8】:

          我只是在生成列表 HTML 时使用服务器端语言来完成。我想这会被认为是“混乱的 HTML”。

          【讨论】:

          • 你是为所有客户做这件事,根本不关心 css,还是从它的用户代理中精确定位 IE?
          • 我总是这样做,不幸的是,:after 目前不是一个特别受支持的选择器。
          • :after 在 2001 年以后发布的浏览器中得到很好的支持。用户代理不可靠,尤其是在决定浏览器能力方面。
          猜你喜欢
          • 2020-05-05
          • 2021-10-04
          • 1970-01-01
          • 2018-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多