J'utilise :after
et :before
css pseudo-éléments et cela fonctionne très bien dans IE8, et tous les navigateurs modernes mais cela ne fonctionne pas très bien dans IE7. Existe-t-il des hacks connus pour contourner cela dans IE7?
avec tout hack CSS pur, ce n'est pas possible.
Utilisez IE8.js http://code.google.com/p/ie7-js/
Il a un soutien pour cela. http://ie7-js.googlecode.com/svn/test/index.html
page de test également là
après - http://ie7-js.googlecode.com/svn/test/after.html
avant - http://ie7-js.googlecode.com/svn/test/before.html
Modifier après le 1er commentaire
Vous pouvez simplement conserver ce js pour IE6 et 7. les autres navigateurs ne le liront pas.
<!--[if lt IE 8]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE8.js"></script>
<![endif]-->
Et si vous utilisez déjà jQuery dans votre projet, vous pouvez utiliser ce plugin
Pseudo Plugin jQuery
J'utilisais IE8.js (http://code.google.com/p/ie7-js/) dans un projet et j'ai dû le supprimer car il bloquait IE7 entre 10/15 secondes.
Pour maintenir le contenu généré avec: après et: avant les pseudo-éléments, sans IE8.js, j'ai fait ce qui suit:
.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;
}
Je préfère cette méthode plutôt qu'avec javascript, car cela gardera tous les sélecteurs au même endroit :)
Avant et après, vous pouvez utiliser ceci:
.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;
}
Si vous utilisez déjà Modernizr , il a une détection de base pour "Contenu généré par CSS".
Vous pouvez ensuite remplir le :before
Ou :after
Manquant à l'aide de JavaScript. Par exemple:
.selector:before, .selector-before {
content: "Hello, world!";
color: red;
}
jQuery pour insérer le contenu généré directement dans le DOM:
if (!Modernizr.generatedcontent) {
$('.selector').prepend('<span class="selector-before">Hello, world!</span>');
}
Eh bien, il y a un hack CSS pur qui fonctionne, en quelque sorte. C'est de la magie noire mais est parfois pratique lorsqu'il est utilisé à peine.
C'est expliqué ici: 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
Fragment 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;
}
Feuille de style spécifique à 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;
}
Vous pouvez utiliser des expressions CSS pour ce faire. Par exemple, vous pouvez brancher un symbole ♣ via:
expression(this.runtimeStyle.backgroundImage="none",this.innerHTML = '♣'+this.innerHTML)
J'ai écrit un article à ce sujet sur Smashing Magazine, voir http://coding.smashingmagazine.com/2011/03/19/styling-elements-with-glyphs-sprites-and-pseudo-elements/
Lorsque j'ai besoin de support pour: avant et: après j'utilise le Gist suivant que j'ai écrit. C'est du pur CSS (au point où vous écriviez simplement du CSS) mais inclut une expression CSS. Fonctionne dans la plupart des cas.
https://Gist.github.com/236248
/* =============================================================================
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"
);
}