जो मैं करने की कोशिश कर रहा हूं वह सरल है: scale(0)
से से कुछ एसवीजी डॉट्स स्केल करें जब एक भाई तत्व वेनिला जेएस का उपयोग करके आच्छादित हो। वे the demoस्थानांतरित किए बिना एसवीजी स्केल
में लाल होते हैं यहाँ बुनियादी एसवीजी सेटअप
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px" viewBox="0 0 720 576" style="enable-background:new 0 0 720 576;" xml:space="preserve">
<style type="text/css">
.st3 {
fill:red;
}
* {
-webkit-transition:.3s;
transition:.3s;
}
</style>
<g id="Layer_4">
<!-- Shield -->
<path class="st8" d="M601,304.7c-32.4-15.4-68.6-24-106.8-24c-40.4,0-78.5,9.6-112.3,26.6c4.9,79.7,41.9,146.7,109.5,187.6
C559.8,454.1,597,385.6,601,304.7z" />
<path class="st9" d="M420.1,328.7c2.1-4.7,32.5-23.9,72.5-23.9c39.9,0,73.1,20,75.5,24.3c2.4,4.3,5.7,40-12.7,74.6
c-19.7,36.9-53.5,50.1-61.8,50.4c-6.4,0.2-41.8-14.3-62.5-51.6C411.5,367.4,418,333.4,420.1,328.7z" />
<circle class="st10" cx="494.9" cy="373.3" r="35.5" />
</g>
<g id="Layer_8">
<!-- Dots on shield -->
<circle class="st3" cx="578.8" cy="316.2" r="4.6" />
<circle class="st3" cx="543.4" cy="346.2" r="4.6" />
<circle class="st3" cx="505" cy="375.5" r="4.6" />
</g>
</svg>
मुद्दा कि एसवीजी तराजू मूल स्थान पर आधारित है, न कि वर्तमान स्थान, है इस प्रकार जब एक बदलने यह चाल लागू किया जाता है है इसे स्केल करने के अलावा तत्व। मैं BBox()
ऑफसेट, स्केलिंग, फिर अनुवाद का अनुवाद करके इस स्थिति को ठीक करने का प्रयास कर रहा हूं, लेकिन यह केवल मदद करने लग रहा था और पूरी तरह से इस मुद्दे को ठीक नहीं करता था।
var shield = document.getElementById("Layer_4"),
dots = document.querySelectorAll("#Layer_8 .st3");
toggleTransform(false);
shield.onmouseover = function() { toggleTransform(true); }
shield.onmouseout = function() { toggleTransform(false); }
function toggleTransform(bool) {
if (!bool) {
for (var i = 0; i < dots.length; i++) {
var box = dots[i].getBBox(),
cx = box.x + box.width/10,
cy = box.y + box.height/10;
//dots[i].setAttribute("transform", "translate(" + cx + " " + cy + ") scale(0) translate(" + cx + " " + cy + ")");
dots[i].style.WebkitTransform = "translate(" + cx + "px, " + cy + "px) scale(0) translate(" + -cx + "px, " + -cy + "px)";
}
} else {
for (var i = 0; i < dots.length; i++) {
var box = dots[i].getBBox(),
cx = box.x + box.width/2,
cy = box.y + box.height/2;
//dots[i].setAttribute("transform", "translate(0 0) scale(1) translate(0 0)");
dots[i].style.WebkitTransform = "translate(0, 0) scale(1) translate(0, 0)";
}
}
}
मैं दोनों setAttribute
और सीएसएस के बदलने (मैं setAttribute
संक्रमण के लिए नहीं मिल सका, शायद क्योंकि यह सीएसएस द्वारा animatable नहीं है), लेकिन यह किसी के साथ नहीं मिल सका उपयोग करने की कोशिश। मैं केवल क्रोम
में परीक्षण कर रहा हूं किसी को भी पता है कि मैं कैसे स्केल कर सकता हूं, लाल बिंदुओं को नहीं चला रहा हूं?
Here's the demo फिर अगर आप इसे
याद संपादित
मैं यह काफी उपयोग करने के लिए सरल बनाने के लिए RashFlash के उत्तर के आधार पर एक समारोह बना दिया है और भी खाते ऑफसेट में ले जाता है और विभिन्न बदलने मूल
function scaleMe(elem, scaleX, scaleY, newOffsetX, newOffsetY, originX, originY) {
newOffsetX = null ? 0 : newOffsetX;
newOffsetY = null ? 0 : newOffsetY;
originX = null ? "center" : originX;
originY = null ? "center" : originY;
var bbox = elem.getBBox(),
cx = bbox.x + (bbox.width/2),
cy = bbox.y + (bbox.height/2),
tx = -cx * (scaleX - 1) + newOffsetX,
ty = -cy * (scaleY - 1) + newOffsetY;
if(originX === "left" || originX === "right") {
tx = newOffsetX;
}
if(originY === "top" || originY === "bottom") {
ty = newOffsetY;
}
var scalestr = scaleX + ',' + scaleY,
translatestr = tx + 'px,' + ty + 'px';
elem.style.WebkitTransformOrigin = originX + " " + originY;
elem.style.MozTransformOrigin = originX + " " + originY;
elem.style.msTransformOrigin = originX + " " + originY;
elem.style.transformOrigin = originX + " " + originY;
elem.style.WebkitTransform = "translate(" + translatestr + ") scale(" + scalestr + ")";
elem.style.MozTransform = "translate(" + translatestr + ") scale(" + scalestr + ")";
elem.style.msTransform = "translate(" + translatestr + ") scale(" + scalestr + ")";
elem.style.transform = "translate(" + translatestr + ") scale(" + scalestr + ")";
}
यह वास्तव में स्पष्ट आप क्या चाहते हो नहीं है। क्या आप चाहते हैं कि प्रत्येक लाल बिंदु माउसओवर पर बड़ा हो? –
@ बिगबाडबूम हां, मैं माउस पर लाल बिंदुओं को कहीं भी स्थानांतरित किए बिना स्केल करना चाहता हूं - बस बड़ी मदद –