10

जो मैं करने की कोशिश कर रहा हूं वह सरल है: 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 + ")"; 
} 
+0

यह वास्तव में स्पष्ट आप क्या चाहते हो नहीं है। क्या आप चाहते हैं कि प्रत्येक लाल बिंदु माउसओवर पर बड़ा हो? –

+0

@ बिगबाडबूम हां, मैं माउस पर लाल बिंदुओं को कहीं भी स्थानांतरित किए बिना स्केल करना चाहता हूं - बस बड़ी मदद –

उत्तर

7

यदि मैं गलत नहीं हूं, तो आप अपने केंद्र के साथ बिंदुओं को स्केल करना चाहते हैं, डॉट्स उनकी वर्तमान स्थिति बना रहता है और बस बड़ा हो जाता है।

अगर यह आप चाहते हैं, तो निम्न कोड की मदद से आप

var bbox=elementNode.getBBox(); 
var cx=bbox.x+(bbox.width/2), 
    cy=bbox.y+(bbox.height/2); // finding center of element 
var scalex=1.5, scaley=1.5; // your desired scale 
var saclestr=scalex+','+scaley; 
var tx=-cx*(scalex-1); 
var ty=-cy*(scaley-1);       
var translatestr=tx+','+ty; 

elementNode.setAttribute('transform','translate('+translatestr+') scale('+saclestr+')'); 

तो क्या किया था, मैं पहले डॉट अनुवाद और की तुलना में यह पैमाने। मैं Transforming Coordinate system

translate(-centerX*(factor-1), -centerY*(factor-1)) 
scale(factor) 
+1

आपकी मदद के लिए धन्यवाद! उस गणित का उपयोग करके और एक सीएसएस परिवर्तन का उपयोग करके संक्रमण को बरकरार रखा। [** कार्य डेमो **] (http://jsbin.com/vefahide/2/edit) (केवल वेबकिट) –

11

में वर्णित के रूप सूत्र निम्न का उपयोग कर आप वास्तव में जे एस के बिना इस प्रभाव को प्राप्त कर सकते हैं।

.st3 { 
    fill: red; 
    -webkit-transform: scale(1); 
    -webkit-transform-origin: 50% 50%; 
    -webkit-transition:.3s; 
    transform: scale(1); 
    transform-origin: 50% 50%; 
    transition:.3s; 
} 

#Layer_4:hover + g .st3 { 
    -webkit-transform: scale(2); 
    -webkit-transform-origin: 50% 50%; 
    -webkit-transition:.3s; 
    transform: scale(2); 
    transform-origin: 50% 50%; 
    transition:.3s; 
} 

Demo here

संबंधित मुद्दे