svg.js - Как получить позицию X из текстового элемента SVG - PullRequest
1 голос
/ 22 марта 2019

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

window.onload=function(){
    let mapa = SVG('#map').size('100%', '100%');

    let txtText = SVG("#elements text").text();
    let posX = SVG("#elements text").x();
    let posVal = SVG("#elements text").has($(this).text() == "Messi");

    $(".results").html("Text " + txtText + " position X is: " + posX);

}
body {
  font-family: "Calibri";
}
.results {
    width: 100%;
    text-align: center;
    font-size: 1.4rem;
    margin: 5vh 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/3.0.12/svg.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="results">asd</div>
<svg version="1.1" id="map" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 553 492" enable-background="new 0 0 553 492" xml:space="preserve">
  <g id="elements">
    <rect x="12" y="17" fill="#006633" width="525" height="462"/>
    <path fill="#339933" d="M495,130c-2,68.4,26,142-51,211s-116,131-244,63S-39,373,77,237S140,96,252,69s173-53,220-22S497,63,495,130
      z"/>
    <text transform="matrix(1 0 0 1 210.7305 325.9219)" fill="#FFFFFF" font-size="80px">Messi</text>
  </g>
</svg>

Спасибо

Ответы [ 2 ]

3 голосов
/ 22 марта 2019

Поскольку позиция устанавливается преобразованием, вы должны получить ее из информации о преобразовании, например, так:

window.onload=function(){
    let mapa = SVG('#map').size('100%', '100%');

    let txtText = SVG("#elements text").text();
    let posVal = SVG("#elements text").has($(this).text() == "Messi");
    let posX = SVG("#elements text").transform().translateX*SVG("#elements text").transform().scaleX;

    $(".results").html("Text " + txtText + " position X is: " + posX);

}
body {
  font-family: "Calibri";
}
.results {
    width: 100%;
    text-align: center;
    font-size: 1.4rem;
    margin: 5vh 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/svg.js/3.0.12/svg.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="results">asd</div>
<svg version="1.1" id="map" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 553 492" enable-background="new 0 0 553 492" xml:space="preserve">
  <g id="elements">
    <rect x="12" y="17" fill="#006633" width="525" height="462"/>
    <path fill="#339933" d="M495,130c-2,68.4,26,142-51,211s-116,131-244,63S-39,373,77,237S140,96,252,69s173-53,220-22S497,63,495,130
      z"/>
    <text transform="matrix(1 0 0 1 210.7305 325.9219)" fill="#FFFFFF" font-size="80px">Messi</text>
  </g>
</svg>
2 голосов
/ 23 марта 2019

В качестве альтернативы вы можете использовать text.rbox(svg), чтобы получить ограничивающую рамку вокруг визуального представления вашего текста относительно svgbox.x вы получите нужное вам значение

...