Ответ 1
Существует два способа получить/установить значения преобразования для элементов SVG в браузерах Chrome, Firefox, IE или любого пользователя, опасающегося в отношении стандартов:
Обработка преобразований через атрибуты
// Getting
var xforms = myElement.getAttribute('transform');
var parts = /translate\(\s*([^\s,)]+)[ ,]([^\s,)]+)/.exec(xforms);
var firstX = parts[1],
firstY = parts[2];
// Setting
myElement.setAttribute('transform','translate(30,100)');
Плюсы. Простота установки и понимания (такая же, как разметка).
Минусы: нужно проанализировать строковое значение, чтобы найти то, что вы хотите; для анимированных значений не может запрашивать базовое значение, когда анимация активна; чувствует себя грязным.
Обработка преобразований с помощью привязок DG SVG
// Getting
var xforms = myElement.transform.baseVal; // An SVGTransformList
var firstXForm = xforms.getItem(0); // An SVGTransform
if (firstXForm.type == SVGTransform.SVG_TRANSFORM_TRANSLATE){
var firstX = firstXForm.matrix.e,
firstY = firstXForm.matrix.f;
}
// Setting
myElement.transform.baseVal.getItem(0).setTranslate(30,100);
Профи: не нужно пытаться самостоятельно разбирать строки; сохраняет существующие списки преобразований (вы можете запрашивать или настраивать только одно преобразование в списке); вы получаете реальные значения, а не строки.
Минусы: может смущать понять сначала; более подробные для установки простых значений; нет удобного метода для извлечения значений поворота, масштабирования или перекоса из SVGTransform.matrix
, отсутствия поддержки браузера.
Вы можете найти инструмент, который я написал для изучения DOM, полезного в этом.
- Перейдите в http://objjob.phrogz.net/svg/object/131
- Нажмите "Показать унаследованные свойства/методы?". Флажок
- Посмотрите, что SVGRectElement имеет свойство
transform
, которое являетсяSVGAnimatedTransformList
. - Нажмите
SVGAnimatedTransformList
, чтобы увидеть свойства и методы, поддерживающие объект. - Исследовать!