2017-01-25 2 views
0

Этот код SVG:SVG создается с JS обрезается

<div style="width: 25%; height: 100%; position: relative; background-color: orange;"> 
    <svg viewbox="0 0 1 1" width="100%" height="100%" preserveAspectRatio="xMidYMid meet"> 
    <circle cx="50%" cy="50%" r="50%" fill="teal" style="pointer-events: all;"> 
    </circle> 
    </svg> 
</div> 

производит это изображение:

teal circle in orange square

И был сгенерирован с этим кодом:

this.$el = document.createElement('div'); 
document.body.appendChild(this.$el); 
this.$svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 
this.$el.appendChild(this.$svg); 
this.$circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); 
this.$svg.appendChild(this.$circle); 

this.$el.style.width = '25%'; 
this.$el.style.height = '100%'; 
this.$el.style.position = 'relative'; 
this.$el.style.backgroundColor = 'orange'; 

this.$svg.setAttributeNS(null, 'viewbox', '0 0 1 1'); 
this.$svg.setAttributeNS(null, 'width', '100%'); 
this.$svg.setAttributeNS(null, 'height', '100%'); 
this.$svg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet'); 

this.$circle.setAttributeNS(null, 'cx', '50%'); 
this.$circle.setAttributeNS(null, 'cy', '50%'); 
this.$circle.setAttributeNS(null, 'r', '50%'); 
this.$circle.setAttributeNS(null, 'fill', 'teal'); 

Однако, когда этот код запускается и заполняет DOM, он делает следующее:

cropped teal circle in orange rectangle

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

Вот вопрос о codepen:

http://codepen.io/jedierikb/pen/VPzpwj


Чтобы увидеть проблему визуализации, не забудьте нажать 'Развернуть фрагмент' или 'Full Page':

this.$el = document.createElement('div'); 
 
document.body.appendChild(this.$el); 
 
this.$svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 
 
this.$el.appendChild(this.$svg); 
 
this.$circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); 
 
this.$svg.appendChild(this.$circle); 
 

 
this.$el.style.width = '25%'; 
 
this.$el.style.height = '100%'; 
 
this.$el.style.position = 'relative'; 
 
this.$el.style.backgroundColor = 'orange'; 
 

 
this.$svg.setAttributeNS(null, 'viewbox', '0 0 1 1'); 
 
this.$svg.setAttributeNS(null, 'width', '100%'); 
 
this.$svg.setAttributeNS(null, 'height', '100%'); 
 
this.$svg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet'); 
 

 
this.$circle.setAttributeNS(null, 'cx', '50%'); 
 
this.$circle.setAttributeNS(null, 'cy', '50%'); 
 
this.$circle.setAttributeNS(null, 'r', '50%'); 
 
this.$circle.setAttributeNS(null, 'fill', 'teal');
<div style="width: 25%; height: 100%; position: relative; background-color: orange;"> 
 
    <svg viewbox="0 0 1 1" width="100%" height="100%" preserveAspectRatio="xMidYMid meet"> 
 
    <circle cx="50%" cy="50%" r="50%" fill="teal" style="pointer-events: all;"> 
 
    </circle> 
 
    </svg> 
 
</div>

+0

Я вижу одинаковые круги, как ожидалось в OSX Chrome версии 55.0.2883.95 (64-разрядная версия) из вашего кода snippe t – haxxxton

+0

@haxxxton Нажмите «Расширить фрагмент» или «Полный экран». Я не уверен, почему это правильно отражается в сообщении ... – jedierikb

ответ

1

Два тонких гс. Во-первых, ваш процентный рост на самом деле ничего не делает, потому что родительские элементы (тело и html) не имеют указанной высоты. Однако, поскольку это является последовательным для обоих примеров, это не является источником несоответствия. У вас есть ошибка капитализации в этой строке:

this.$svg.setAttributeNS(null, 'viewbox', '0 0 1 1'); 

должен быть

this.$svg.setAttributeNS(null, 'viewBox', '0 0 1 1'); 

Смотрите ваш пример с этим изменением, внесенным:

this.$el = document.createElement('div'); 
 
document.body.appendChild(this.$el); 
 
this.$svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); 
 
this.$el.appendChild(this.$svg); 
 
this.$circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); 
 
this.$svg.appendChild(this.$circle); 
 

 
this.$el.style.width = '25%'; 
 
this.$el.style.height = '100%'; 
 
this.$el.style.position = 'relative'; 
 
this.$el.style.backgroundColor = 'orange'; 
 

 
this.$svg.setAttributeNS(null, 'viewBox', '0 0 1 1'); 
 
this.$svg.setAttributeNS(null, 'width', '100%'); 
 
this.$svg.setAttributeNS(null, 'height', '100%'); 
 
this.$svg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet'); 
 

 
this.$circle.setAttributeNS(null, 'cx', '50%'); 
 
this.$circle.setAttributeNS(null, 'cy', '50%'); 
 
this.$circle.setAttributeNS(null, 'r', '50%'); 
 
this.$circle.setAttributeNS(null, 'fill', 'teal');
<div style="width: 25%; height: 100%; position: relative; background-color: orange;"> 
 
    <svg viewbox="0 0 1 1" width="100%" height="100%" preserveAspectRatio="xMidYMid meet"> 
 
    <circle cx="50%" cy="50%" r="50%" fill="teal" style="pointer-events: all;"> 
 
    </circle> 
 
    </svg> 
 
</div>

+0

Интересно, что капитализация в предоставленном svg не вызывает никаких проблем - только тот, который создается js. почему это? – jedierikb

+0

@jedierikb Я подозреваю, что (некоторые браузеры) правильная заглавная строка встроенных атрибутов при построении DOM. Вы можете проверить это, выполнив что-то вроде 'someEl.innerHTML = '''. Результирующий узел DOM будет ''. Однако этого не происходит, если вы применяете атрибуты непосредственно к узлам с помощью JS. – Damon

+0

Теперь, когда я думаю об этом, довольно странно, что svg использует * чувствительный к регистру * camelcase attrs. Хотелось бы услышать более глубокое объяснение того, как/почему это произошло. – Damon