Ошибка IE9 с увеличенным размером шрифта css-содержимого

Я нашел ошибку в IE9, но googling для нее еще не помог найти какое-либо решение.

Следующее работает отлично в FF 3 + 4, Chrome, Opera и даже IE8, но не в IE9.

HTML:

<div class="outer">
    <p class="inner">Lorem ipsum dolor</p>
</div>

CSS:

div p {
    font-size: 1.2em;
}
div p:after {
    content: " sit amet";
}

div p:after {
    font-size: 1.3em;
}
div.outer p:after,
div p.inner:after {
    font-size: 3em;
}

"sit amet" огромный в IE9, поскольку он, кажется, умножает размер шрифта снова и снова. Невозможно переписать его "важными" или другими средствами повышения специфичности (например, "div.outer" уже должен это делать). Кажется, что он получает , умноженный на одно и то же объявление, т.е. div.outer p:after, div p.inner:after не будет умножаться на 3, а на 9!

(Обратите внимание, что здесь не нужны "внутренние" и "внешние" классы. То же самое происходит, объявляя div p {} снова и снова, но это имеет смысл только с классами как пример реального мира.)

Вот тестовая страница: http://dl.dropbox.com/u/4667354/temp/ie9-bug.html

Есть ли какое-либо решение?

Edit:

Чтобы прояснить два недоразумения:

  • Ошибка не обычного поведения, при котором дочерние элементы умножают размер шрифта своего родителя при использовании em. Ошибка заключается в том, что размер шрифта в сгенерированном содержимом не может быть перезаписан и при попытке будет размножаться. То есть установка размера шрифта в div p:after выполняется один раз, но настройка его снова умножается, а не перезаписывает ее.
  • Чтобы лучше понять, в чем проблема (если у вас нет IE9 под рукой), вот два скриншота тестовой страницы: в IE8 и любой другой современный браузер и в IE9.

Ответ 1

Вы можете попробовать использовать rem вместо em, IE9 поддерживает его, тогда ваши размеры будут относиться к базовому шрифту вместо умножения вместе. Вот хорошее объяснение.

Я бы предположил, что разница в том, что IE9 обрабатывает сгенерированный контент как дочерний элемент, в то время как другие браузеры не являются, следовательно, умножением.

Ответ 2

Этот может иметь какое-то отношение к различию между обработанными деревьями DOM от IE8 до IE9.

Internet Explorer 8:

  • <html>
    • <head>
    • <body>
      • <div class="outer">
        • <p class="inner">
          • Текст - Lorem ipsum dolar

Internet Explorer 9:

  • <html>
    • <head>
    • <body>
      • Текст - пустой текст Node
      • <div class="outer">
        • Текст - пустой текст Node
        • <p class="inner">
          • Текст - Lorem ipsum dolar
        • Текст - пустой текст Node
      • Текст - пустой текст Node

Чтение бонусов

Ответ 3

Существует обход, который позволяет относить размер шрифта (em или %): добавьте еще один класс с псевдоэлементом font-size, уменьшим размер.

Я собрал скрипт, показывающий обходной путь, но базовый код ниже:

<p class="one">Test (1.25em = 20px)</p>
<p class="one two">Test (2em = 32px but 2.5em = 40px in IE)</p>
<p class="one one-ie two">Test (2em = 32px)</p>

Затем стили выглядят следующим образом:

body {
    font-size: 16px;
}

.one::before {
    content:      "::before";
    font-family:  monospace;
    font-size:    1.25em;
    margin-right: 10px;
}

.one-ie::before {
    font-size: 0.8em;
}

.two::before {
    font-size: 2em;
}

Большинство браузеров будут переопределять селектор .one-ie::before с помощью .two::before, а сборка IE по существу будет отрицать предыдущий font-size. Если IE исправить ошибку и разрешить псевдоэлементные стили переопределять, а не составлять, хак становится переопределенным, как и любой другой браузер.

Ответ 4

Я вижу тестовую страницу "sit amet" столь же огромной в Firefox 4.0.1. Вы уверены, что это только IE, а не фактическое поведение?

edit: и сафари тоже. Я нахожусь на Mac. Я не думаю, что это ошибка IE.

Ответ 5

Я видел подобное в других версиях IE, используя ems. Попробуйте установить

HTML {
    font-size: 100%;
}

Должны это исправить!