Bewahren untergeordneten Elemente' Größe und Skalierung des parent-Elements
Ich habe eine XHTML-Seite mit SVG-eingebettet in die Sie als <svg>
element. Ich brauche zu implementieren, skalieren, aber es ist eine Anforderung, die innere <text>
Elemente müssen nicht skalieren. Eine offensichtliche Lösung ist
<svg ...>
<!-- Root <g> to programmatically `setAttribute("transform", ...)` -->
<g transform="scale(0.5)">
<!-- Various inner elements here -->
<!-- Here is a text element.
Additional <g> is to apply text position which
*must* depend on the scaling factor set above -->
<g transform="translate(100 50)">
<!-- Apply the opposite scaling factor.
Must be done for every `<text>` element on each change of the scaling factor... -->
<text x="0" y="0" transform="scale(2)">Hello, World!</text>
</g>
</g>
</svg>
Gibt es eine bessere Lösung als das? Vielleicht gibt es eine Art "reset", die daraus resultierende Skalierungsfaktor für innere <text>
Elemente? Muss der code funktioniert in Firefox und Chrome.
UPD. Es gibt auch eine option, um text-Elemente, die außerhalb des element skaliert und manuell Steuern-text-Positionen. Es vermeidet visuelle Störungen, die auf den text, weil der Skalierung. Ich verwende derzeit diese Methode.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist
transform="ref(svg)"
definiert ist,SVG Tiny 1.2. Zu den besten meines Wissens ist dies nicht implementiert in jedem Browser außer Opera (Presto).In dem obigen Beispiel der text erscheinen soll, wo die graue Umrandung ist (in der oberen linken Ecke). Keine rotation oder Skalierung angewendet werden sollte, um das element, das
transform="ref(svg)"
für die Zwecke der Transformationen es ist, als ob es war ein direktes Kind des svg-root-element.ref(...)
funktioniert nicht in Firefox, in der Tat.Wenn es zulässig ist, um (a) die JavaScript verwenden und (b) geben Sie die position der einzelnen unscaling element über
transform="translate(…,…)"
entweder auf das element selbst oder in einer Verpackung-Gruppe (wie Sie getan haben), dann können Sie meine unscaling code:http://phrogz.net/svg/libraries/SVGPanUnscale.js
Demo: http://jsfiddle.net/uPSc4/
Wie man sehen kann in der demo es macht alle transformation mit Ausnahme der übersetzung (einschließlich Skalierung, Drehung und Neigung), während die Elemente positioniert, wo Sie sein sollen.
Siehe auch dieses demo, die Ihnen ermöglicht, zu Zoomen und schwenken Sie die Grafik mit SVGPan, während bestimmte Kennzeichnung nicht skalierten Elemente:
http://phrogz.net/svg/scale-independent-elements.svg
Hier ist der ganze code, den Sie benötigen:
Hier der demo-code, bei JSFiddle ist down:
for (var i=0;i<text.length;++i) unscale(text[i],i);
Versuchen, diese
HTML
Finden Sie die inverse matrix und fügen Sie erforderlichen Transformationen nur.
JsFiddle - http://jsfiddle.net/uPSc4/10/