我正在使用:after
和:before
css伪元素,它在 IE8 和所有现代浏览器中工作正常,但它在 IE7中无法正常工作即可。在 IE7 中是否有已知的黑客可以解决这个问题?
答案 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
答案 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"
);
}