:之后和:之前css伪元素攻击IE 7

时间:2010-11-15 06:14:01

标签: html css internet-explorer-7 pseudo-element

我正在使用:after:before css伪元素,它在 IE8 和所有现代浏览器中工作正常,但它在 IE7中无法正常工作即可。在 IE7 中是否有已知的黑客可以解决这个问题?

7 个答案:

答案 0 :(得分:68)

任何纯CSS攻击都是不可能的。

使用IE8.js http://code.google.com/p/ie7-js/

它支持这一点。 http://ie7-js.googlecode.com/svn/test/index.html

测试页面也有

之后 - http://ie7-js.googlecode.com/svn/test/after.html

之前 - http://ie7-js.googlecode.com/svn/test/before.html

在第一条评论后修改

您可以将此js保留为IE6和7.其他浏览器将无法读取它。

<!--[if lt IE 8]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE8.js"></script>
<![endif]-->

如果您已经在项目中使用jQuery而不是使用此插件

jQuery Pseudo Plugin

http://jquery.lukelutman.com/plugins/pseudo/

答案 1 :(得分:52)

我在项目中使用IE8.js(http://code.google.com/p/ie7-js/),我不得不删除它,因为它在10/15秒之间阻止了IE7。

要保留使用以下内容生成的内容:after和:之前的伪元素,不使用IE8.js,我执行了以下操作:

   .tabs {
     *zoom: expression( 
          this.runtimeStyle.zoom="1",
          this.appendChild( document.createElement("small") ).className="after"
         );
   }

   .tabs:after,
   .tabs .after {
     content: '';
     display:block;
     height:10px;
     width:100%;
     background:red;
   }

我更喜欢这种方式,而不是使用javascript,因为这会让所有选择器保持在同一位置:)

答案 2 :(得分:4)

在使用之前和之后:

.tabs {
    *zoom: expression(
        this.runtimeStyle.zoom="1",
        this.insertBefore(
            document.createElement("div"),
            this.childNodes[0]
        ).className="before",
        this.appendChild(
            document.createElement("div")
        ).className="after"
    );
}

...

.tabs::before, .tabs .before {
    display: block;
    width: 10px;
    height: 20px;
    background-color: #eee;
    float: left;
}
.tabs::after, .tabs .after {
    display: block;
    width: 10px;
    height: 20px;
    background-color: #c0c;
    float: left;
}

答案 3 :(得分:3)

有一个纯粹的CSS hack有效。它是黑魔法,但有时候用得很蹩脚。

这里解释: http://nanobox.chipx86.com/blog/2006/07/before-and-after-in-ie7-and-below.php http://web.archive.org/web/20080706132651/http://nanobox.chipx86.com/blog/2006/07/before-and-after-in-ie7-and-below.php

HTML片段:

<div id="container">
 <!-- -->
 <div class="mainContent">
  <p>Blah blah</p>
  <p>Blah blah</p>
  <p>Blah blah</p>
  <!-- -->
 </div>
</div>

<强> CSS:

#container:before
{
 background: url("corners-top.png");
 content: "";
 display: block;
 height: 24px;
}

#container .mainContent:after
{
 background: url("corners-bottom.png");
 content: "";
 display: block;
 height: 28px;
}

特定于IE的样式表:

#container *
{
 background: url("corners-top.png");
 display: list-item;
 font-size: 24px;
 line-height: 24px;
 list-style: none;
}

#container .mainContent
{
 background: none;
 display: block;
 font-size: 1em;
 line-height: 1.25;
}

#container .mainContent *
{
 background: url("corners-bottom.png");
 font-size: 28px;
 line-height: 28px;
}

/*
  Now, still in the IE-specific stylesheet, remove the styles for all
  element descendants of .mainContent. Refer to each element by tag name.
*/

#container .mainContent p, #container .mainContent div, (And so on...)
{
 background: none;
 display: block;
 font-size: 1em;
 line-height: 1.25;
}

答案 4 :(得分:3)

您可以使用CSS表达式执行此操作。例如,您可以通过以下方式插入♣符号:

expression(this.runtimeStyle.backgroundImage="none",this.innerHTML = '♣'+this.innerHTML)

我在Smashing Magazine上写了一篇关于此的文章,请参阅http://coding.smashingmagazine.com/2011/03/19/styling-elements-with-glyphs-sprites-and-pseudo-elements/

答案 5 :(得分:3)

如果您已经在使用Modernizr,则会对“CSS生成的内容”进行核心检测。

然后,您可以使用JavaScript填写丢失的:before:after。例如:

.selector:before, .selector-before {
    content: "Hello, world!";
    color: red;
}

jQuery将生成的内容直接插入DOM:

if (!Modernizr.generatedcontent) {
    $('.selector').prepend('<span class="selector-before">Hello, world!</span>');
}

答案 6 :(得分:2)

当需要支持:之前和之后我使用我写的下面的要点。它是纯CSS(简而言之,你只是编写CSS),但确实包含了一个CSS表达式。适用于大多数情况。

https://gist.github.com/2362483

/* =============================================================================
    CSS Declarations
   ========================================================================== */

/* ==|== The Standard Way =================================================== */

.foo::before {
  /* ...css rules... */
}

.foo::after{
  /* ...css rules... */
}


/* ==|== The IE Way =================================================== */
/* NOTE: a comma separated IE & Standard rule won't work.               *
 * IE doesn't understand ::before or ::after & ignores the declaration  */

.lt-ie9 .foo:before,
.lt-ie8 .foo .ie-before {
  /* ...css rules... */
}

.lt-ie9 .foo:after,
.lt-ie8 .foo .ie-after {
  /* ...css rules... */
}


/* =============================================================================
    IE6 & IE7 polyfills
   ========================================================================== */

.lt-ie8 .foo {
  zoom: expression(
    this.runtimeStyle.zoom="1",

    /* ::before polyfill - creates <i class="ie-before"></i> */
    this.insertBefore( document.createElement("i"), this.firstChild ).className="ie-before",

    /* ::after polyfill - creates <i class="ie-after"></i> */
    this.appendChild( document.createElement("i") ).className="ie-after"
  );
}