SVG: текст всередині прямої


180

Я хочу показати текст у SVG rect. Це можливо?

я намагався

<svg xmlns="http://www.w3.org/2000/svg">
  <g>
    <rect x="0" y="0" width="100" height="100" fill="red">
      <text x="0" y="10" font-family="Verdana" font-size="55" fill="blue"> Hello </text>
    </rect>
  </g>
</svg>

Але це не працює.


Відповіді:


240

Це неможливо. Якщо ви хочете відобразити текст всередині прямого елемента, слід поставити їх як у групу, так і текстовий елемент, що надходить після прямого елемента (щоб він з'явився вгорі).

<svg xmlns="http://www.w3.org/2000/svg">
  <g>
    <rect x="0" y="0" width="100" height="100" fill="red"></rect>
    <text x="0" y="50" font-family="Verdana" font-size="35" fill="blue">Hello</text>
  </g>
</svg>


20
Чи є спосіб, щоб не потрібно вручну встановлювати висоту та ширину на прямому шасі?
Джордж Мауер

Залежить від ситуації і що ви маєте на увазі під «вручну». Ви можете писати сценарій у JavaScript, якщо вам це подобається (див. Відповідь нарендра нижче)
KeatsKelleher

9
Використовуючи мої знання у gформаті html - які, можливо, тут не застосовуються - здається, що елемент має тут неявний розмір, і я хотів би, щоб прямокутник розширився до свого розміру.
Джордж Мауер

2
Група підходить до її змісту не іншим способом. Я думаю, що елементи все ще відносяться до батьківського svg.
shuji

чи важливий тут груповий елемент?
dmo

66

Програмне використання D3 :

body = d3.select('body')
svg = body.append('svg').attr('height', 600).attr('width', 200)
rect = svg.append('rect').transition().duration(500).attr('width', 150)
                .attr('height', 100)
                .attr('x', 40)
                .attr('y', 100)
                .style('fill', 'white')
                .attr('stroke', 'black')
text = svg.append('text').text('This is some information about whatever')
                .attr('x', 50)
                .attr('y', 150)
                .attr('fill', 'black')

11
Це створює розмітку, яка відображається так, як хоче ОП, але вона не робить те, що намагається зробити ОП (що не є законним). Це все одно виробляє <svg><rect/><text/></svg>.
Джошуа Тейлор

7
Javascript! = SVG. Питання позначено тегами svg, text та rect. Ніщо не вказує на те, що користувач має доступ до мови програмування. (Роблю це зауваження, оскільки я прийшов сюди шукати статичне рішення.)
aioobe

6
Хоча це правда, це не стосується питання мене, і, очевидно, багато інших людей прийшли сюди за D3
cosmichero2025

1
Чи можна автофіксувати пряму на ширину тексту
Колін Д

1
@Colin D Це теж я шукаю. Але виглядає неможливо очікувати, що це буде зроблено автоматично. Натомість ми повинні зробити це вручну самі, щоб цього досягти. Для цього знадобляться деякі вимірювання розмірності (ширини та / або висоти) обох елементів (прямої і тексту).
Lex Soft

7

Ви можете використовувати foreignobject для більшого контролю та розміщення насиченого HTML-вмісту по прямому чи по колу

    <svg width="250" height="250" xmlns="http://www.w3.org/2000/svg">
        <rect x="0" y="0" width="250" height="250" fill="aquamarine" />
        <foreignobject x="0" y="0" width="250" height="250">
            <body xmlns="http://www.w3.org/1999/xhtml">
                <div>Here is a long text that runs more than one line and works as a paragraph</div>
                <br />
                <div>This is <u>UNDER LINE</u> one</div>
                <br />
                <div>This is <b>BOLD</b> one</div>
                <br />
                <div>This is <i>Italic</i> one</div>
            </body>
        </foreignobject>
    </svg>

введіть тут опис зображення


На відміну від параметра text-tags-only, цей фактично розмістив текст всередині шляху, а не заховав його в якомусь невидимому просторі над ним! В xі yатрибути не потрібні були для мене , але widthі heightбули або ж ніде не було видно!
Метт Арнольд

4
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
    <g>
  <defs>
    <linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" style="stop-color:rgb(145,200,103);stop-opacity:1" />
      <stop offset="100%" style="stop-color:rgb(132,168,86);stop-opacity:1" />
    </linearGradient>
  </defs>
  <rect width="220" height="30" class="GradientBorder" fill="url(#grad1)" />
  <text x="60" y="20" font-family="Calibri" font-size="20" fill="white" >My Code , Your Achivement....... </text>
  </g>
</svg> 

0

Програмно відображати текст над прямою, використовуючи базовий Javascript

 var svg = document.getElementsByTagNameNS('http://www.w3.org/2000/svg', 'svg')[0];

        var text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
        text.setAttribute('x', 20);
        text.setAttribute('y', 50);
        text.setAttribute('width', 500);
        text.style.fill = 'red';
        text.style.fontFamily = 'Verdana';
        text.style.fontSize = '35';
        text.innerHTML = "Some text line";

        svg.appendChild(text);

        var text2 = document.createElementNS('http://www.w3.org/2000/svg', 'text');
        text2.setAttribute('x', 20);
        text2.setAttribute('y', 100);
        text2.setAttribute('width', 500);
        text2.style.fill = 'green';
        text2.style.fontFamily = 'Calibri';
        text2.style.fontSize = '35';
        text2.style.fontStyle = 'italic';
        text2.innerHTML = "Some italic line";

       
        svg.appendChild(text2);

        var text3 = document.createElementNS('http://www.w3.org/2000/svg', 'text');
        text3.setAttribute('x', 20);
        text3.setAttribute('y', 150);
        text3.setAttribute('width', 500);
        text3.style.fill = 'green';
        text3.style.fontFamily = 'Calibri';
        text3.style.fontSize = '35';
        text3.style.fontWeight = 700;
        text3.innerHTML = "Some bold line";

       
        svg.appendChild(text3);
    <svg width="510" height="250" xmlns="http://www.w3.org/2000/svg">
        <rect x="0" y="0" width="510" height="250" fill="aquamarine" />
    </svg>

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.