Кажется, что указание координат линии SVG-линии в процентах делает эту координату существующей в системе координат видового экрана вместо пользовательской системы координат, установленной viewBox. Для меня это звучит странно, особенно после прочтения спецификации.
В приведенном ниже примере зеленая линия определяется координатами пространства пользователя, а координата y синей линии выражена в процентах (50%). Когда кнопка нажата, viewBox применяется - зеленая линия масштабируется правильно, а синяя линия отсутствует ... Что там происходит?
spec говорит:
Для любого значения координаты y или значения высоты, выраженного в процентах от области просмотра SVG, используемое значение должно быть процентом, в пользовательских единицах, от параметра высоты элемента viewBox, примененного к этому окну просмотра. Если viewBox не указан, то используемое значение должно быть в процентах, в пользовательских единицах, от высоты области просмотра SVG.
ОБНОВЛЕНИЕ: я сгруппировал все элементы в svg и предоставил transform = "scale (0.5 0.5)", и процентная координата работала как ожидалось. Я начинаю подозревать, что viewBox преобразует только координаты, указанные в пользовательских единицах, а не в явных единицах. Но я бы подумал, что процент не следует рассматривать как явную единицу, поскольку это не совсем физическая ценность. И это противоречило бы отрывку спецификации сверху. Так что же это?
function myFunction(){
document.getElementById("maxi").setAttribute("viewBox","0,0,492,124");
}
<svg id="maxi" version="1.2" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
y="0px" width="246" height="62" font-size="23px" xml:space="preserve" >
<line id="greenline" x1="0" y1="31" x2="232" y2="31" stroke="#00FF00" stroke-width="4"/>
<line id="blueline" x1="0" y1="50%" x2="232" y2="50%" stroke="#0000FF"/>
<path class="cutContour" fill="none" stroke="#EC008C" stroke-miterlimit="3.8637" d="M6.8,2.3H225
c2.3,0,4.3,1.9,4.3,4.3v48.2c0,2.3-1.9,4.3-4.3,4.3H6.8c-2.3,0-4.3-1.9-4.3-4.3V6.6C2.5,4.2,4.4,2.3,6.8,2.3z"/>
</svg>
<input type="button" value="Click Me" onClick="myFunction();">