SVG Word Wrap - Показать пробку? - PullRequest
22 голосов
/ 24 января 2009

Ради интереса я пытаюсь понять, как далеко я смогу реализовать браузерный клиент SVG для RIA, с которым я возился в свободное время.

Но попал в ОГРОМНЫЙ камень преткновения. Нет переноса слов !!

Кто-нибудь знает какую-нибудь работу (я думаю, какой-то JavaScript или специальный тег, который я не знаю)?

Если нет, то мне придется пойти по пути xhtml и начать прикреплять элементы HTML в моем SVG (ой), или просто вернуться через десять лет, когда SVG 1.2 будет готов.

Ответы [ 8 ]

15 голосов
/ 19 марта 2011

Существует также тег ForeignObject. Затем вы можете встроить HTML в SVG, что дает наибольшую гибкость. HTML отлично подходит для макета документа и был взломан до бесконечности для поддержки макета приложения, рисования и всего, что хотят разработчики. Но его сила заключается в переносе слов и оформлении документов. Пусть HTML делает то, что умеет лучше всего, и пусть SVG делает то, что умеет лучше всего.

http://www.w3.org/TR/SVG/extend.html

Это работает для большинства браузеров FireFox, Opera, Webkit, кроме IE (начиная с IE11). :-( Разве история в Интернете не так ли?

http://schmerg.com/svg-support-in-ie9-close-but-should-try-harde

13 голосов
/ 25 июля 2013

Этот SVG-материал сбивает с толку, не так ли?

К счастью, вы можете достичь хороших результатов, но это требует больше работы, чем использование HTML 5.

Вот снимок экрана моего приложения ASP.Net / SVG, показывающий немного «фальшивого» переноса слов.

enter image description here

Следующая функция создаст для вас элемент SVG text , разбитый на части tspan , длина каждой строки которых не превышает 20 символов.

<text x="600" y="400" font-size="12" fill="#FFFFFF" text-anchor="middle">
    <tspan x="600" y="400">Here a realy long </tspan>
    <tspan x="600" y="416">title which needs </tspan>
    <tspan x="600" y="432">wrapping </tspan>
</text>

Это не идеально, но просто, быстро, и пользователи никогда не узнают разницу.

My createSVGtext () Функция JavaScript принимает три параметра: x-position, y-position и текст для отображения. Шрифт, максимальное количество символов в строке и цвет текста жестко заданы в моей функции, но это легко изменить.

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

var svgText = createSVGtext("Here a realy long title which needs wrapping", 600, 400);
$('svg').append(svgText);

А вот функция JavaScript:

function createSVGtext(caption, x, y) {
    //  This function attempts to create a new svg "text" element, chopping 
    //  it up into "tspan" pieces, if the caption is too long
    //
    var svgText = document.createElementNS('http://www.w3.org/2000/svg', 'text');
    svgText.setAttributeNS(null, 'x', x);
    svgText.setAttributeNS(null, 'y', y);
    svgText.setAttributeNS(null, 'font-size', 12);
    svgText.setAttributeNS(null, 'fill', '#FFFFFF');         //  White text
    svgText.setAttributeNS(null, 'text-anchor', 'middle');   //  Center the text

    //  The following two variables should really be passed as parameters
    var MAXIMUM_CHARS_PER_LINE = 20;
    var LINE_HEIGHT = 16;

    var words = caption.split(" ");
    var line = "";

    for (var n = 0; n < words.length; n++) {
        var testLine = line + words[n] + " ";
        if (testLine.length > MAXIMUM_CHARS_PER_LINE)
        {
            //  Add a new <tspan> element
            var svgTSpan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
            svgTSpan.setAttributeNS(null, 'x', x);
            svgTSpan.setAttributeNS(null, 'y', y);

            var tSpanTextNode = document.createTextNode(line);
            svgTSpan.appendChild(tSpanTextNode);
            svgText.appendChild(svgTSpan);

            line = words[n] + " ";
            y += LINE_HEIGHT;
        }
        else {
            line = testLine;
        }
    }

    var svgTSpan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan');
    svgTSpan.setAttributeNS(null, 'x', x);
    svgTSpan.setAttributeNS(null, 'y', y);

    var tSpanTextNode = document.createTextNode(line);
    svgTSpan.appendChild(tSpanTextNode);

    svgText.appendChild(svgTSpan);

    return svgText;
}

Логика переноса слов основана на этом учебнике по HTML5 Canvas

Надеюсь, вы найдете это полезным!

Mike

http://www.MikesKnowledgeBase.com

UPDATE

Одна вещь, которую я забыл упомянуть.

Этот экран «Диаграмма рабочего процесса», который я показал выше, изначально был написан с использованием HTML 5 canvas . Он работал прекрасно, значки можно перетаскивать, всплывающие меню могут появляться при нажатии на них, и даже IE8, казалось, доволен этим.

Но я обнаружил, что если диаграмма станет «слишком большой» (например, 4000 x 4000 пикселей), то она не сможет инициализироваться во всех браузерах, ничего не появится - , но - до JavaScript код был обеспокоен, все работало нормально.

Таким образом, даже при проверке ошибок моя диаграмма выглядела пустой, и я не смог определить, когда возникла эта проблема с showtopper.

var canvasSupported = !!c.getContext;
if (!canvasSupported) {
    //  The user's browser doesn't support HTML 5 <Canvas> controls.
    prompt("Workflow", "Your browser doesn't support drawing on HTML 5 canvases.");
    return;
}

var context = c.getContext("2d");
if (context == null) {
    //  The user's browser doesn't support HTML 5 <Canvas> controls.
    prompt("Workflow", "The canvas isn't drawable.");
    return;
}

//  With larger diagrams, the error-checking above failed to notice that
//  the canvas wasn't being drawn.

Итак, вот почему мне пришлось переписать код JavaScript, чтобы вместо него использовать SVG. Кажется, он лучше справляется с большими диаграммами.

11 голосов
/ 18 февраля 2009

SVGT 1.2 представляет элемент textArea http://www.w3.org/TR/SVGTiny12/text.html#TextInAnArea, но в настоящее время он поддерживается только экспериментально Opera 10. Я не знаю, планируют ли когда-нибудь другие браузеры реализовать его, хотя я надеюсь, что они это сделают.

10 голосов
/ 24 января 2009

В этом документе оказывается, что tspan может дать иллюзию переноса слов:

Тег tspan идентичен текстовому тегу, но может быть вложен внутри текстовых тегов и внутри самого себя. В сочетании с атрибутом 'dy' это позволяет создать иллюзию переноса слов в SVG 1.1. Обратите внимание, что 'dy' относится к последнему нарисованному глифу (символу).

2 голосов
/ 05 апреля 2013

Библиотека svg.js имеет плагин svg.textflow.js . Это не очень быстро, но это делает свое дело. Он даже хранит переполненный текст в атрибуте данных, так что вы можете использовать его для создания непрерывно текущих столбцов. Вот пример страницы с текстовым потоком .

0 голосов
/ 16 июля 2012

Я искал решение о переносе слов в svg так много часов (или много дней). Если вы можете в своем приложении отредактировать код, добавив в него tspan или любой другой метод, перейдите в него.

Обтекание текстом будет реализовано в версии 1.2, но, за исключением Opera, браузер пока полностью не реализует его (4 года, спецификация на W3 ...).

Поскольку мне приходилось использовать некоторые настройки выравнивания, я не мог использовать какой-либо код, который могут предоставить многие форумы (без посторонних объектов, без скриптов и т. Д.).

Если я отправлю это сообщение, это просто для того, чтобы быть полезным для некоторых других людей, когда гуглит слово, упаковывающее svg, потому что этот пост - лучший результат, и во многих случаях этот пост не помогает.

Вот классное, простое и легкое решение: http://dev.w3.org/SVG/profiles/1.1F2/test/svg/text-dom-01-f.svg

0 голосов
/ 19 февраля 2011

В наши дни flowPara может выполнять перенос слов, но мне еще не удалось найти браузер, который бы правильно его поддерживал.

0 голосов
/ 28 января 2009

Альтернативный метод - использовать текстовое поле Андреаса Неймана объект.

...