Подтвердить что ты не робот

Как центрировать SVG-текст вертикально в IE9

Чтобы выравнивать текст по вертикали в SVG, нужно использовать атрибут dominant-baseline. Это уже обсуждалось в SO (Выравнивание текста в SVG) и является частью спецификация.

Моя проблема с IE9, которая, по-видимому, не поддерживает dominant-baseline и кучу другие вещи.

Есть ли у вас какие-либо идеи о приближении dominant-baseline: central в IE9?

Вот пример, который работает в FF и Chrome. Он не работает в IE9, Opera 11. Safari в Windows не поддерживает central, но поддерживает middle, который по-прежнему хорош.

<?xml version="1.0"?>
<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
    <path d="M 10 100 h 290" stroke="blue" stroke-width=".5" />
    <text x="40" y="100" font-size="16" style="dominant-baseline: auto;">
        XXX dominant-baseline: auto; XXX
    </text>

    <path d="M 10 200 h 290" stroke="blue" stroke-width=".5" />
    <text x="40" y="200" font-family="sans-serif" font-size="15" style="dominant-baseline: central;">
        XXX dominant-baseline: central XXX
    </text>
</svg>
4b9b3361

Ответ 1

Это гигантский взлом, но мы можем приблизиться к вертикальной средней позиции, учитывая размер шрифта.

Спецификация определяет central следующим образом:

центральный

Это идентифицирует вычисленную базовую линию который находится в центре блока EM.

Мы можем взять EM box известного размера шрифта и измерить его ограничивающий прямоугольник для вычисления центра.

<?xml version="1.0"?>
<svg width="300" height="300" xmlns="http://www.w3.org/2000/svg">
    <path d="M 10 100 h 290" stroke="blue" stroke-width=".5" />
    <text id="default-text" x="20" y="100" font-size="5em">
        M
    </text>
    <script>
        window.onload = function() {
            var text = document.getElementById("default-text"),
                bbox = text.getBBox(),
                actualHeight = (100 - bbox.y),
                fontSize = parseInt(window.getComputedStyle(text)["fontSize"]),
                offsetY = (actualHeight / 2) - (bbox.height - fontSize);

            text.setAttribute("transform", "translate(0, " + offsetY + ")");
        }
    </script>

    <path   d="M 10 200 h 290" stroke="blue" stroke-width=".5" />
    <text   id="reference-text" x="20" y="200" font-size="5em"
            style="dominant-baseline: central;">
        M
    </text>
</svg>

Очевидно, что код может быть намного чище, но это всего лишь доказательство концепции.

Ответ 2

Один из способов добиться этого в IE - установить положение, относящееся к размеру шрифта:

<text font-size="WHATEVER YOU WANT" text-anchor="middle" "dy"="-.4em"> M </text>

Настройка атрибута "dy" сдвинет текст вверх (если значение отрицательное) или вниз (если значение положительное). Установка атрибута "text-anchor" центрирует текст по оси x, просто отлично в IE. Хотя это может взломать, но так же поддерживается IE SVG!

Ответ 3

Вы можете попробовать baseline-shift, чтобы увидеть, работает ли это в IE9:

<?xml version="1.0"?>
<svg width="300" height="500" xmlns="http://www.w3.org/2000/svg">
    <path d="M 10 100 h 290" stroke="blue" stroke-width=".5" />
    <text x="40" y="100" font-size="16" style="dominant-baseline: auto;">
        XXX dominant-baseline: auto; XXX
    </text>

    <path d="M 10 200 h 290" stroke="blue" stroke-width=".5" />
    <text x="40" y="200" font-family="sans-serif" font-size="15" style="dominant-baseline: central;">
        XXX dominant-baseline: central XXX
    </text>

    <path d="M 10 300 h 290" stroke="blue" stroke-width=".5" />
    <text x="40" y="300" font-family="sans-serif" font-size="15">
      <tspan style="baseline-shift:-30%;">
        XXX baseline-shift: -30% XXX
      </tspan>
    </text>
</svg>

Firefox, похоже, не поддерживает базовый сдвиг, но Webkit и Opera делают.