Позиционирование элементов SVG с использованием CSS - PullRequest
35 голосов
/ 03 февраля 2010

Предположим, что следующий документ SVG:

<svg version="1.1" baseProfile="full" width="300" height="200" xmlns="http://www.w3.org/2000/svg">
<text x="20" y="20">My text</text>
</svg>

Теперь я хочу переместить этот текст с помощью css.

Я попытался добавить style="dx:20" и style="transform: translate(20)". Оба не имеют никакого эффекта в Firefox и Safari. Добавление их как обычных атрибутов работает нормально, но тогда я не могу отделить позиционирование от фактического кода. Установка x, y, left и top в стиле также не работает.

Есть ли способ разместить элемент SVG с помощью CSS?

Ответы [ 7 ]

28 голосов
/ 01 января 2012

Мне удалось переместить некоторый текст SVG в chrome, используя следующий CSS:

text.identity{
transform: translate(74px,0px);
-ms-transform: translate(74px,0px); /* IE 9 */
-webkit-transform: translate(74px,0px); /* Safari and Chrome */
-o-transform: translate(74px,0px); /* Opera */
-moz-transform: translate(74px,0px); /* Firefox */
}

Однако в Firefox это не сдвигается ...

21 голосов
/ 22 мая 2015

Я пришел сюда в поисках исправления, но сам решил проблему, подумал, что поделюсь:

transform: translate(100px, 100px)

Похоже, работает во всех современных браузерах, кроме Internet Explorer, вплоть до Microsoft Edge (который еще не вышел), что весьма разочаровывает. Элементы, на которых я тестировал:

<path>
<polygon>
<g>

Единственная проблема, с которой я столкнулся, связана с <text> элементами, и существует решение обернуть <text> в <g> и применить к нему преобразование. Это также должно работать для любых элементов, которые я еще не тестировал, у которых есть проблемы с transform: translate().

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

13 голосов
/ 28 марта 2013

Вот хакерская возможность позиционировать определенные текстовые элементы исключительно с помощью CSS, злоупотребляя атрибутами 'letter-spacing' для x-координаты и 'baseline-shift' для координаты y:

<defs>
    <font><font-face font-family="cssPosAnchor" />
        <glyph unicode="." horiz-adv-x="0" />
    </font>
    <style type="text/css"><![CDATA[
#cssPos {
    font-family:cssPosAnchor;
    letter-spacing:10px; /* x-coordinate */
}
#cssPos>tspan {
    font-family:serif;
    letter-spacing:normal;
    baseline-shift:-30px; /* negative y-coordinate */
}
]]>
    </style>
</defs>
<text id="cssPos">.<tspan>CSS-Positioned Text!</tspan></text>

'baseline-shift' применимо только к 'tspan' Элементы, что делает внутреннее <tspan> необходимым в представленном коде.Положительные значения для смещения базовой линии перемещают текст вверх, в противоположность нормальному направлению в svg.

'letter-spacing' требуется начальная буква, чтобы иметь эффект, поэтому . необходимо.Чтобы исключить ширину этой первой буквы, мы используем специальный шрифт cssPosAnchor, где точка не имеет ширины и формы.Следующий <tspan> дополнительно восстанавливает шрифт и межбуквенный интервал.

Scope

Должен работать в каждой соответствующей реализации SVG.

Существует одно неопределенное ограничение для отрицательного x-координаты.Спецификация для атрибута «межбуквенный интервал» гласит: «Значения могут быть отрицательными, но могут быть ограничения для конкретной реализации».

Совместимость

Текст 'direction' изменения должны работать очень хорошо, когда они наложены на внутренний <tspan>.

Нестандартный 'режим записи' должен быть наложен на внешний <text>.С этим наверняка будут проблемы.

Возможно, станут возможными более важные 'text-anchor' значения middle и end например:

<defs>
    <font><font-face font-family="cssPosAnchor" />
        <glyph unicode="." horiz-adv-x="0" />
        <glyph unicode=" " horiz-adv-x="0" />
    </font>
    <style type="text/css"><![CDATA[
#cssPos {
    font-family:cssPosAnchor;
    letter-spacing:100px; /* x-coordinate */
    word-spacing:-200px; /* negative double x-coordinate */
}
#cssPos>tspan {
    font-family:serif;
    word-spacing:normal;
    letter-spacing:normal;
    baseline-shift:-30px; /* negative y-coordinate */
}
#cssPos {
    text-anchor=middle;
}
]]>
    </style>
</defs>
<text id="cssPos">.<tspan>CSS-Positioned Text!</tspan> .</text>

‹space›. перед закрывающим тегом <\text> дает интервал, равный минус x-координата.Таким образом, внутренний <tspan> перемещается, но сохраняет свое пространство в <text>, как если бы он все еще был там.

Поскольку могут существовать определенные для реализации ограничения на отрицательные значения для атрибутов spacing, это негарантированно работает на всех клиентов!

6 голосов
/ 03 февраля 2010

В настоящий момент, кажется, - согласно Шелли Пауэрс , в ее статье без списка" Использование SVG для гибких, масштабируемых и забавных фонов: Часть I"и" Part II"- этот CSS в настоящее время не наилучшим образом подходит для позиционирования SVG. На самом деле, кажется, что это довольно минное поле для включения SVG в веб-страницу, без непосредственного встраивания ее в сам html.

Я надеюсь, что найдутся решения, и действительно, Пауэрс действительно предлагает несколько обходных путей, чтобы обеспечить правильное разделение стиля и контента для SVG. Я рискну предположить, что текущие проблемы - это относительная новизна концепции / стандарта (к сожалению, например, .gif или даже .png ...).

Извините, я не могу предложить лучший ответ. = /

1 голос
/ 26 мая 2017

Использование позиционирования CSS:

index.html

<link href="style.css" rel="stylesheet" />
<div class="parent">
  <div class="child">
    <svg version="1.1" baseProfile="full" width="300" height="200" xmlns="http://www.w3.org/2000/svg"><text x="20" y="20">My text</text>
    </svg>
  </div>
</div>

style.css

.parent {
  position: relative;
  height: 1000; /* bigger than your svg */
  width: 1000; /* bigger than your svg */
}

.child {
  position: absolute;
  top: 10px;  /* relative to parent container */
  left: 10px; /* relative to parent container */
}
0 голосов
/ 31 марта 2016

многоугольник r = "7" id = "map_points_55" points = "23,10 15,27 34,16 10,16 31,27" style = "fill: lime; обводка: фиолетовая; ширина обводки: 0; заполнить правило: от нуля «;

Если вы хотите переместить звезду, добавьте к 10 или более в точках, таких как точки = "33,20 25,37 44,26 20,26 41,37"

0 голосов
/ 04 февраля 2010

Я предупреждаю вас, я относительный новичок, но как насчет "x" и "y" и присваиваю их с номером и "px"

возможно:

left: 290px;    top: 1200px;

или

x:30px; y:50px;

и

text-anchor:start;

Образец:

<text
       xml:space="preserve"
       style="font-size:32;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Comic Sans MS;-inkscape-font-specification:Comic Sans MS Bold"
       x="131.42857"
       y="269.50504"
       id="text2383"
       sodipodi:linespacing="125%"><tspan
         sodipodi:role="line"
         id="tspan2385"
         x="131.42857"
         y="269.50504">Position ze text</tspan></text>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...