: after и: before Взлом псевдоэлементов CSS для IE 7 - PullRequest
56 голосов
/ 15 ноября 2010

Я использую псевдоэлементы :after и :before css, и он отлично работает в IE8 и во всех современных браузерах, но не работает нормально в IE7 . Есть ли известные хаки, чтобы обойти это в IE7 ?

Ответы [ 7 ]

68 голосов
/ 15 ноября 2010

с любым чистым хакером CSS это невозможно.

Использовать IE8.js http://code.google.com/p/ie7-js/

У него есть поддержка для этого. http://ie7 -js.googlecode.com / SVN / тест / index.html

тестовая страница тоже есть

после - http://ie7 -js.googlecode.com / svn / test / after.html

до - http://ie7 -js.googlecode.com / svn / test / before.html

Редактировать после 1-го комментария

Вы можете просто сохранить этот 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/

52 голосов
/ 21 февраля 2012

Я использовал IE8.js (http://code.google.com/p/ie7-js/) в проекте, и мне пришлось удалить его, потому что он блокировал IE7 в течение 10/15 с.

Для управления контентом, созданным с помощью псевдоэлементов: after и: before, без 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, потому что это будет держать все селекторы в одном месте:)

4 голосов
/ 30 июля 2013

До и после вы можете использовать это:

.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 голосов
/ 04 февраля 2014

Если вы уже используете Modernizr , у него есть определение ядра для «CSS Generated Content».

Затем вы можете заполнить пропущенные :before или :after, используя JavaScript. Например:

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

jQuery для вставки сгенерированного контента непосредственно в DOM:

if (!Modernizr.generatedcontent) {
    $('.selector').prepend('<span class="selector-before">Hello, world!</span>');
}
3 голосов
/ 19 января 2012

Вы можете использовать выражения CSS для этого.Например, вы можете вставить символ via через:

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/

3 голосов
/ 25 июля 2011

Ну, есть чистый CSS-хак, который работает, вроде. Это чёрная магия, но иногда она полезна при малом использовании.

Это объясняется здесь: 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;
}
2 голосов
/ 07 июня 2012

Когда мне нужна поддержка: before и: after, я использую следующую суть, которую я написал.Это чистый 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"
  );
}
...