Как использовать несколько элементов SVG

1

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

Первоначально у меня был список файлов SVG, каждый из которых имеет элемент. Но, похоже, есть две проблемы с этим подходом:

1) Слишком много HTTP-запросов;

2) Эти элементы содержат идентификаторы с определениями стилей и градиентов (а не классы - стили, уже установленные в строке при экспорте из Illustrator), а некоторые из них в конечном итоге влияют на другие элементы. Решение обеих проблем состояло бы в том, чтобы все элементы были только в одном файле SVG, поэтому Adobe Illustrator назначит разные идентификаторы для каждого элемента, и стили не будут конфликтовать.

Моя идея заключается в том, чтобы загрузить большой SVG файл со всеми этими элементами, извлечь их с помощью select() и добавить их в элементы DOM.

Все это звучит разумно?

Могу ли я использовать JavaScript для загрузки одного SVG, управления элементами, содержащимися в этом, и добавлять их в DOM по желанию, или это ужасная идея?

Я пытался, но это было очень больно. Например, мне пришлось использовать SnapSVG, чтобы иметь возможность находить эти внутренние элементы внутри моего SVG, но я не могу добавить их в DOM. Вероятно, SnapSVG не подходит для этого. Я видел другие инструменты SVG, но они, похоже, скорее предназначены для создания форм SVG с использованием JavaScript, но это не мой случай, я просто хочу извлекать элементы и использовать их (добавлять к другим элементам, позиции, пути доступа к ним и изменять цвет, переводить и т.д.).

  • 0
    Это совершенно разумный подход, который давно используется с изображениями. Посмотрите на это ... css-tricks.com/css-sprites
  • 0
    @ Арчер, ты думаешь, мой комментарий не помог? Я не думаю, что есть что добавить, и я не думаю, что это стоит ответа.
Показать ещё 3 комментария
Теги:
svg

1 ответ

2
Лучший ответ

Следуя моему ответу на ваш другой вопрос, вы можете захватить элементы из одного SVG в <use/> в другом.

function grabSVGElement(selector) {
    var svg = document.createElementNS('http://www.w3.org/2000/svg','svg');
    var use = document.createElementNS('http://www.w3.org/2000/svg','use');
    use.setAttributeNS('http://www.w3.org/1999/xlink','href',selector);
    svg.appendChild(use);

    document.body.appendChild(svg);
    var bbox = use.getBBox();
    svg.setAttribute("viewBox",[bbox.x,bbox.y,bbox.width,bbox.height].join(" "));
    document.body.removeChild(svg);
    return svg;
}

Это должно создать необходимый SVG и соответствующим образом изменить его ограничивающий прямоугольник, прежде чем возвращать его. (Он временно добавляется в тело, чтобы рассчитать BBox)

Затем вы можете appendChild в любой ваш реальный контейнер и дать ему координаты X, Y по желанию.

  • 0
    Потрясающие. Я бы взял целую вечность, чтобы придумать это. Я не думаю, что нам нужно полагаться на DOM, чтобы делать такие вещи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню