Svg तत्वों में z-index का उपयोग कैसे करें?


154

मैं इस तरह से अपनी परियोजना में svg हलकों का उपयोग कर रहा हूँ,

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 120">
    <g>
        <g id="one">
            <circle fill="green" cx="100" cy="105" r="20" />
        </g>
        <g id="two">
            <circle fill="orange" cx="100" cy="95" r="20" />
        </g>
    </g>
</svg>

और मैं gतत्वों को पहले दिखाने के लिए टैग में z-index का उपयोग कर रहा हूं । मेरे प्रोजेक्ट में मुझे केवल z-index value का उपयोग करने की आवश्यकता है, लेकिन मैं अपने svg तत्वों को z-index का उपयोग नहीं कर सकता। मैंने बहुत कुछ जाना है, लेकिन मुझे अपेक्षाकृत कुछ नहीं मिला। तो कृपया मुझे मेरे svg में z-index का उपयोग करने में मदद करें।

यहाँ DEMO है।


जवाबों:


163

विशिष्टता

एसवीजी विनिर्देश संस्करण 1.1 में रेंडरिंग ऑर्डर दस्तावेज़ के आदेश पर आधारित है:

first element -> "painted" first

एसवीजी 1.1 का संदर्भ । विशिष्टता

३.३ प्रतिपादन आदेश

एसवीजी दस्तावेज़ टुकड़े में तत्वों का एक निहित ड्राइंग क्रम होता है, जिसमें एसवीजी दस्तावेज़ टुकड़ा में पहले तत्व पहले "पेंट" हो जाते हैं । बाद के तत्वों को पहले से चित्रित तत्वों के ऊपर चित्रित किया गया है।


समाधान (क्लीनर-तेज)

आपको खींची जाने वाली नवीनतम वस्तु के रूप में हरे रंग का चक्र लगाना चाहिए। इसलिए दो तत्वों को स्वैप करें।

<svg xmlns="http://www.w3.org/2000/svg" viewBox="30 70 160 120"> 
   <!-- First draw the orange circle -->
   <circle fill="orange" cx="100" cy="95" r="20"/> 

   <!-- Then draw the green circle over the current canvas -->
   <circle fill="green" cx="100" cy="105" r="20"/> 
</svg>

यहाँ आपके jsFiddle का कांटा ।

समाधान (वैकल्पिक)

useविशेषता के साथ टैग xlink:hrefऔर तत्व की आईडी मान के रूप में। ध्यान रखें कि परिणाम ठीक लगने पर भी सबसे अच्छा समाधान नहीं हो सकता है। थोड़ा समय होने पर, यहां विनिर्देश एसवीजी 1.1 का लिंक "एलीमेंट" का उपयोग करें

उद्देश्य:

मूल तत्व में एक आईडी जोड़ने के लिए संदर्भित दस्तावेज़ को संशोधित करने के लिए लेखकों की आवश्यकता से बचने के लिए।

<svg xmlns="http://www.w3.org/2000/svg" viewBox="30 70 160 120">
    <!-- First draw the green circle -->
    <circle id="one" fill="green" cx="100" cy="105" r="20" />
    
    <!-- Then draw the orange circle over the current canvas -->
    <circle id="two" fill="orange" cx="100" cy="95" r="20" />
    
    <!-- Finally draw again the green circle over the current canvas -->
    <use xlink:href="#one"/>
</svg>


एसवीजी 2 पर नोट्स

एसवीजी 2 विनिर्देश अगले प्रमुख रिलीज है और अभी भी उपरोक्त सुविधाओं का समर्थन करता है।

3.4। आदेश देना

एसवीजी में तत्व तीन आयामों में तैनात हैं। एसवीजी व्यूपोर्ट के एक्स और वाई अक्ष पर उनकी स्थिति के अलावा, एसवीजी तत्व भी जेड अक्ष पर तैनात हैं। जेड-अक्ष पर स्थिति उस आदेश को परिभाषित करती है जो उन्हें चित्रित किया गया है

Z अक्ष के साथ, तत्वों को स्टैकिंग संदर्भों में बांटा गया है।

3.4.1। एसवीजी में एक स्टैकिंग संदर्भ स्थापित करना

...

स्टैकिंग संदर्भ वे वैचारिक उपकरण हैं जिनका उपयोग उस क्रम का वर्णन करने के लिए किया जाता है जिसमें तत्वों को एक दूसरे के ऊपर तब चित्रित किया जाना चाहिए जब दस्तावेज़ प्रदान किया गया हो, ...


रेंडरिंग ऑर्डर को ओवरराइड करने के बारे में एक पुराना मसौदा भी है, लेकिन यह एक ऐसी सुविधा है जो उपलब्ध नहीं है। ड्राफ्ट संदर्भ
Maicolpt

12
ओह! यह हमेशा आसान नहीं होता है ताकि आप उन्हें चित्रित किए जाने के क्रम में तत्वों को आकर्षित कर सकें, खासकर यदि ऑब्जेक्ट प्रोग्राम के अनुसार उत्पन्न हो रहे हैं और नेस्टेड दिखाई दे सकते हैं (जैसे कि ऐसा प्रतीत होता है कि जी में ए, बी नहीं हो सकता है, जैसे कि जी सिबलिंग से नीचे है c लेकिन b इसके ऊपर है)
Michael

@ मिचेल: आपके परिदृश्य में, पहले मैं यह समझने की कोशिश करूंगा कि क्या वास्तव में तत्वों को समूहीकृत करना है।
Maicolpt

1
कि 'xlink का उपयोग करें: href' शांत और अजीब और जो मुझे चाहिए उसके लिए एकदम सही है !!
इयान

32

जैसा कि यहां अन्य लोगों ने कहा है, z- इंडेक्स उस तत्व द्वारा परिभाषित किया गया है जो तत्व DOM में दिखाई देता है। यदि मैन्युअल रूप से आपके html को फिर से व्यवस्थित करना एक विकल्प नहीं है या मुश्किल होगा, तो आप SVG समूहों / वस्तुओं को फिर से व्यवस्थित करने के लिए डी 3 का उपयोग कर सकते हैं।

डोम ऑर्डर और मिमिक जेड-इंडेक्स फंक्शनलिटी को अपडेट करने के लिए डी 3 का उपयोग करें

एसवीजी तत्व जेड-इंडेक्स को डी 3 के साथ अपडेट करना

सबसे बुनियादी स्तर पर (और यदि आप किसी और चीज के लिए आईडी का उपयोग नहीं कर रहे हैं), तो आप z- इंडेक्स के लिए स्टैंड-इन के रूप में उन लोगों के साथ तत्व आईडी का उपयोग कर सकते हैं। इससे परे कि आप बहुत हद तक अपनी कल्पना को जंगली बना सकते हैं।

कोड स्निपेट में उदाहरण

var circles = d3.selectAll('circle')
var label = d3.select('svg').append('text')
    .attr('transform', 'translate(' + [5,100] + ')')

var zOrders = {
    IDs: circles[0].map(function(cv){ return cv.id; }),
    xPos: circles[0].map(function(cv){ return cv.cx.baseVal.value; }),
    yPos: circles[0].map(function(cv){ return cv.cy.baseVal.value; }),
    radii: circles[0].map(function(cv){ return cv.r.baseVal.value; }),
    customOrder: [3, 4, 1, 2, 5]
}

var setOrderBy = 'IDs';
var setOrder = d3.descending;

label.text(setOrderBy);
circles.data(zOrders[setOrderBy])
circles.sort(setOrder);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 100"> 
  <circle id="1" fill="green" cx="50" cy="40" r="20"/> 
  <circle id="2" fill="orange" cx="60" cy="50" r="18"/>
  <circle id="3" fill="red" cx="40" cy="55" r="10"/> 
  <circle id="4" fill="blue" cx="70" cy="20" r="30"/> 
  <circle id="5" fill="pink" cx="35" cy="20" r="15"/> 
</svg>

मूल विचार है:

  1. एसवीजी डोम तत्वों का चयन करने के लिए डी 3 का उपयोग करें।

    var circles = d3.selectAll('circle')
  2. अपने एसवीजी तत्वों के साथ 1: 1 संबंध के साथ z- सूचकांकों के कुछ सरणी बनाएं (जिसे आप फिर से लिखना चाहते हैं)। नीचे दिए गए उदाहरणों में उपयोग किए जाने वाले जेड-इंडेक्स सरणियां आईडी, एक्सएंडवाई पोजिशन, रेडीआई आदि हैं।

    var zOrders = {
        IDs: circles[0].map(function(cv){ return cv.id; }),
        xPos: circles[0].map(function(cv){ return cv.cx.baseVal.value; }),
        yPos: circles[0].map(function(cv){ return cv.cy.baseVal.value; }),
        radii: circles[0].map(function(cv){ return cv.r.baseVal.value; }),
        customOrder: [3, 4, 1, 2, 5]
    }
  3. फिर, उस चयन के लिए अपने z- सूचकांकों को बांधने के लिए डी 3 का उपयोग करें।

    circles.data(zOrders[setOrderBy]);
  4. अंत में, डेटा के आधार पर DOM में तत्वों को फिर से व्यवस्थित करने के लिए D3.sort को कॉल करें।

    circles.sort(setOrder);

उदाहरण

यहाँ छवि विवरण दर्ज करें

  • आप आईडी द्वारा स्टैक कर सकते हैं

यहाँ छवि विवरण दर्ज करें

  • शीर्ष पर सबसे बाईं ओर एसवीजी के साथ

यहाँ छवि विवरण दर्ज करें

  • शीर्ष पर सबसे छोटी रेडी

यहाँ छवि विवरण दर्ज करें

  • या किसी विशिष्ट क्रम के लिए z- इंडेक्स लागू करने के लिए एक सरणी निर्दिष्ट करें - मेरे उदाहरण कोड में सरणी [3,4,1,2,5]3 डी सर्कल (मूल HTML आदेश में) 3 डी सर्कल (4 जी के मूल क्रम में) को स्थानांतरित करती है, 4 डी 2 के लिए, 1 से 3 होने के लिए। , और इसी तरह...


निश्चित रूप से सबसे अच्छा जवाब यहाँ ... 10/10। अब यह क्यों स्वीकार किया जाता है?
टाइगर्र्रर

1
@Tigerrrrrr स्टैकिंग ऑर्डर को नियंत्रित करने के लिए एक बाहरी लाइब्रेरी को कुछ सरल करने के लिए आयात करना पागलपन है। इसे और भी बदतर बनाने के लिए, डी 3 एक विशेष रूप से बड़ी लाइब्रेरी है।
iMe

2
@iMe, अच्छी तरह से कहा। हालांकि यह है एक एक समस्या का हल है, इसे यहाँ किया जा रहा है के योग्य है; यह, नहीं है, और हो सकता है कभी नहीं करना चाहिए जवाब। केवल एक चीज जो कभी-कभी वर्तमान उत्तर को बदलना चाहिए यदि कोई नया चश्मा निकलता है और ब्राउज़र बदलते हैं। कोई भी व्यक्ति इस उत्तर का उपयोग करना चाहता है, सभी डी 3 को आयात न करें, बस आपको आवश्यक मॉड्यूल आयात करें। सिर्फ इसके लिए डी 3 के सभी आयात न करें।
स्टीव लाडविच

31

उलटा करने की कोशिश करो #oneऔर #two। इस बेला पर एक नज़र: http://jsfiddle.net/hu2pk/3/

Update

एसवीजी में, जेड-इंडेक्स को उस क्रम से परिभाषित किया जाता है जो दस्तावेज़ में तत्व प्रकट होता है । आप चाहें तो इस पेज पर भी नज़र डाल सकते हैं: https://stackoverflow.com/a/482147/19323751


1
धन्यवाद, लेकिन मुझे z- इंडेक्स मान के आधार पर तत्व की आवश्यकता है।
कार्ति कीन

ठीक। और आप चाहते हैं कि # कोई #two पर है या इसके विपरीत?
लुकास विलेम्स

फिर यदि मैंने z- इंडेक्स मान को # 1 के लिए कहा है तो इसका मतलब है कि यह शीर्ष स्तर पर दिखाई देगा।
कार्ति कीन

10
एसवीजी विनिर्देशों में से किसी में कोई जेड-इंडेक्स संपत्ति नहीं है। यह परिभाषित करने का एकमात्र तरीका है कि कौन से तत्व शीर्ष पर दिखाई देते हैं और जो नीचे दिखाई देते हैं, वह DOM ऑर्डर का उपयोग करके है
nicholaswmin

9
d3.selection.prototype.moveToFront = function() { return this.each(function() { this.parentNode.appendChild(this); }); };और फिर आप stackoverflow.com/questions/14167863/… केselection.moveToFront() माध्यम से कह सकते हैं
mb21

21

आप उपयोग कर सकते हैं

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 120">
    <g>
        <g id="one">
            <circle fill="green" cx="100" cy="105" r="20" />
        </g>
        <g id="two">
            <circle fill="orange" cx="100" cy="95" r="20" />
        </g>
    </g>
    <use xlink:href="#one" />
</svg>

शीर्ष पर हरे रंग का चक्र दिखाई देता है।
jsFiddle


4
क्या इससे दो बार ड्रॉ होता है?
मआरोफ़ात

@ ममोरैफ्ट हाँ, #oneदो बार खींची गई है। लेकिन अगर आप चाहें, तो आप सीएसएस के माध्यम से पहला उदाहरण छिपा सकते हैं। useसंदर्भित डोम तत्व की क्लोनिंग के समान प्रभाव है
जोस रुई सैंटोस

+1 क्योंकि इसे कोई जावास्क्रिप्ट की आवश्यकता नहीं है, लेकिन -1 क्योंकि आप <g>वैसे भी लोड करने से पहले DOM को बदलते समय स्वयं के क्रम को बदल सकते हैं।
Hafenkranich

14

जैसा कि चर्चा है, svgs आदेश में प्रस्तुत करते हैं और z- इंडेक्स को ध्यान में नहीं रखते हैं (अभी के लिए)। हो सकता है कि केवल विशिष्ट तत्व को उसके माता-पिता के नीचे भेजें ताकि वह अंतिम प्रस्तुत करे।

function bringToTop(targetElement){
  // put the element at the bottom of its parent
  let parent = targetElement.parentNode;
  parent.appendChild(targetElement);
}

// then just pass through the element you wish to bring to the top
bringToTop(document.getElementById("one"));

मेरे लिए काम किया।

अपडेट करें

यदि आपके पास एक नेस्टेड एसवीजी है, जिसमें समूह हैं, तो आपको आइटम को उसके पेरेंटोड से बाहर लाना होगा।

function bringToTopofSVG(targetElement){
  let parent = targetElement.ownerSVGElement;
  parent.appendChild(targetElement);
}

एसवीजी की एक अच्छी विशेषता यह है कि प्रत्येक तत्व में वह स्थान होता है, भले ही वह किस समूह का हो, उसमें निहित है: +1:


नमस्ते, यह मेरे लिए काम किया है, लेकिन क्या 'नीचे लाने के लिए' बराबर होगा? धन्यवाद
gavin

@gavin एसवीजी तत्व ऊपर से नीचे क्रम में खींचे जाते हैं। एक तत्व को शीर्ष पर रखने के लिए, हम इसे जोड़ते हैं () ताकि यह अंतिम तत्व हो। इसके विपरीत, यदि हम नीचे तक भेजे गए किसी तत्व को चाहते हैं, तो हम इसे पहले तत्व के रूप में प्रस्तुत करते हैं ()। function bringToBottomofSVG (targetElement) {पैरेंट = targetElement.ownerSVGElement; parent.prepend (targetElement); }
बम्सोवरबोर्ड

13

डी 3 का उपयोग करना:

यदि आप प्रत्येक चयनित तत्व को फिर से सम्मिलित करना चाहते हैं, तो अपने माता-पिता के अंतिम बच्चे के रूप में।

selection.raise()

5
selection.raise()v4 के रूप में D3 में नया है।
tephyr

9

Svgs के लिए कोई z-index नहीं है। लेकिन svg यह निर्धारित करता है कि DOM में आपकी स्थिति में कौन से तत्व सबसे ऊपर हैं। इस प्रकार आप ऑब्जेक्ट को हटा सकते हैं और इसे svg के अंत में रख सकते हैं और इसे "अंतिम रेंडर" तत्व बना सकते हैं। उस एक को तब "सर्वोच्च" रूप से प्रस्तुत किया जाता है।


JQuery का उपयोग करना:

function moveUp(thisObject){
    thisObject.appendTo(thisObject.parents('svg>g'));
}

उपयोग:

moveUp($('#myTopElement'));

D3.js का उपयोग करना:

d3.selection.prototype.moveUp = function() {
    return this.each(function() {
        this.parentNode.appendChild(this);
    });
};

उपयोग:

myTopElement.moveUp();


2019 अब, क्या यह अभी भी सच है? एसवीजी 2.0 के रूप में आधुनिक ब्राउज़रों में दत्तक ग्रहण किया?
एंड्रयू एस



4

इस उत्तर की तारीख के रूप में पोस्ट किए गए स्वच्छ, तेज और आसान समाधान असंतोषजनक हैं। वे त्रुटिपूर्ण बयान पर निर्मित हैं कि एसवीजी दस्तावेजों में जेड ऑर्डर की कमी है। पुस्तकालय भी आवश्यक नहीं हैं। कोड की एक पंक्ति वस्तुओं के समूह या वस्तुओं के समूह के क्रम में हेरफेर करने के लिए अधिकांश संचालन कर सकती है जो कि एक ऐप के विकास में आवश्यक हो सकते हैं जो एक xyz अंतरिक्ष में 2 डी वस्तुओं को चारों ओर ले जाते हैं।

जेड ऑर्डर एसवीजी दस्तावेज़ फ़्रैगमेंट्स में निश्चित रूप से मौजूद है

एसवीजी दस्तावेज़ टुकड़ा क्या कहा जाता है आधार नोड प्रकार SVGElement से व्युत्पन्न तत्वों का एक पेड़ है। एसवीजी दस्तावेज़ टुकड़े का रूट नोड एक SVGSVGElement है, जो HTML5 <svg> टैग से मेल खाता है । SVGGElement <g> टैग से मेल खाता है और बच्चों को एकत्रित करने की अनुमति देता है।

एसवीजीएल पर जेड-इंडेक्स विशेषता के रूप में सीएसएस में एसवीजी रेंडरिंग मॉडल को पराजित किया जाएगा। W3C SVG अनुशंसा v1.1 2 संस्करण के अनुभाग 3.3 और 3.4 में कहा गया है कि SVG दस्तावेज़ के टुकड़े (एक SVGSVGElement से संतान के पेड़) का उपयोग करके प्रस्तुत किया जाता है जिसे पेड़ की गहराई से पहली खोज कहा जाता है । यह योजना अवधि के प्रत्येक अर्थ में az क्रम है।

Z ऑर्डर वास्तव में रे ट्रेसिंग की जटिलताओं और कंप्यूटिंग मांगों के साथ 3 डी रेंडरिंग की आवश्यकता से बचने के लिए एक कंप्यूटर विज़न शॉर्टकट है। एसवीजी दस्तावेज़ टुकड़े में तत्वों के निहित z- सूचकांक के लिए रैखिक समीकरण।

z-index = z-index_of_svg_tag + depth_first_tree_index / tree_node_qty

यह महत्वपूर्ण है क्योंकि यदि आप एक सर्कल को ऊपर ले जाना चाहते हैं जो इसके ऊपर एक वर्ग से नीचे था, तो आप बस सर्कल से पहले वर्ग डालें। यह जावास्क्रिप्ट में आसानी से किया जा सकता है।

सहायक विधियाँ

एसवीइग्लिमेंट इंस्टेंसेस में दो तरीके होते हैं जो सरल और आसान जेड ऑर्डर हेरफेर का समर्थन करते हैं।

  • parent.removeChild (बच्चे)
  • parent.insertBefore (बच्चा, चाइल्ड रीफ)

सही उत्तर जो मेस नहीं बनाता है

क्योंकि SVGGElement ( <g> टैग) को केवल SVGCircleElement या किसी अन्य आकृति की तरह ही आसानी से हटाया और डाला जा सकता है, Adobe उत्पादों और अन्य ग्राफिक्स टूल्स की विशिष्ट छवि परतों को SVGGElement का उपयोग करके आसानी से लागू किया जा सकता है। यह जावास्क्रिप्ट अनिवार्य रूप से एक चाल नीचे कमान है।

parent.insertBefore(parent.removeChild(gRobot), gDoorway)

अगर SVGGElement gRobot के बच्चों के रूप में SVGGElement gRobot के बच्चों के रूप में खींची गई एक रोबोट की परत एसवीजीग्लमेंट gDoorway के बच्चों के रूप में खींची गई थी, तो रोबोट अब दरवाजे के पीछे है क्योंकि द्वार का z ऑर्डर अब रोबोट के एक से अधिक z क्रम है।

एक चाल ऊपर कमान लगभग आसान है।

parent.insertBefore(parent.removeChild(gRobot), gDoorway.nextSibling())

इसे याद करने के लिए बस a = a और b = b सोचें।

insert after = move above
insert before = move below

डोम को राज्य के साथ दृश्य में छोड़ना

यह उत्तर सही होने का कारण यह है क्योंकि यह न्यूनतम और पूर्ण है और एडोब उत्पादों या अन्य अच्छी तरह से डिज़ाइन किए गए ग्राफिक्स संपादकों के आंतरिक की तरह, एक राज्य में आंतरिक प्रतिनिधित्व छोड़ देता है जो प्रतिपादन द्वारा बनाए गए दृश्य के अनुरूप है।

वैकल्पिक लेकिन सीमित दृष्टिकोण

आमतौर पर इस्तेमाल किया जाने वाला एक और तरीका है मल्टीपल एसवीजी डॉक्यूमेंट फ्रैगमेंट (एसवीजी टैग) के साथ सीएसएस जेड-इंडेक्स का इस्तेमाल करना, जिसमें ज्यादातर पारदर्शी बैकग्राउंड होते हैं लेकिन सबसे नीचे। फिर, यह SVG रेंडरिंग मॉडल की लालित्य को हरा देता है, जिससे z ऑर्डर में ऑब्जेक्ट्स को ऊपर या नीचे ले जाना मुश्किल हो जाता है।


टिप्पणियाँ:

  1. ( https://www.w3.org/TR/SVG/render.html v 1.1, द्वितीय संस्करण, 16 अगस्त 2011)

    3.3 एसवीजी दस्तावेज़ टुकड़े में आदेश देने वाले तत्वों में एक अंतर्निहित ड्राइंग ऑर्डर होता है, एसवीजी दस्तावेज़ टुकड़े में पहले तत्वों के साथ पहले "पेंट" किया जाता है। बाद के तत्वों को पहले से चित्रित तत्वों के ऊपर चित्रित किया गया है।

    3.4 समूह को कैसे प्रदान किया जाता है समूह तत्व जैसे कि 'g' तत्व (कंटेनर तत्व देखें) में पारदर्शी काले रंग के लिए एक अस्थायी अलग कैनवास के उत्पादन का प्रभाव होता है, जिस पर बाल तत्व चित्रित होते हैं। समूह के पूरा होने पर, समूह के लिए निर्दिष्ट कोई भी फ़िल्टर प्रभाव एक संशोधित अस्थायी कैनवास बनाने के लिए लागू किया जाता है। संशोधित अस्थायी कैनवास को समूह में किसी भी समूह-स्तरीय मास्किंग और अस्पष्टता सेटिंग्स को ध्यान में रखते हुए, पृष्ठभूमि में संकलित किया गया है।


4

हमारे पास 2019 पहले से ही है और z-indexअभी भी एसवीजी में समर्थित नहीं है।

आप साइट पर देख सकते हैं एसवीजी 2 का समर्थन मोज़िला में है कि राज्य के लिए z-index- लागू नहीं किया गया

आप साइट बग 360148 पर भी देख सकते हैं "एसवीजी तत्वों पर 'जेड-इंडेक्स' संपत्ति का समर्थन करें" (रिपोर्ट किया गया: 12 महीने पहले)।

लेकिन आपके पास इसे सेट करने के लिए SVG में 3 संभावनाएँ हैं:

  1. साथ में element.appendChild(aChild);
  2. साथ में parentNode.insertBefore(newNode, referenceNode);
  3. के साथ targetElement.insertAdjacentElement(positionStr, newElement);(SVG के लिए IE में कोई समर्थन नहीं)

इंटरएक्टिव डेमो उदाहरण

यह सब 3 कार्यों के साथ।

var state = 0,
    index = 100;

document.onclick = function(e)
{
    if(e.target.getAttribute('class') == 'clickable')
    {
        var parent = e.target.parentNode;

        if(state == 0)
            parent.appendChild(e.target);
        else if(state == 1)
            parent.insertBefore(e.target, null); //null - adds it on the end
        else if(state == 2)
            parent.insertAdjacentElement('beforeend', e.target);
        else
            e.target.style.zIndex = index++;
    }
};

if(!document.querySelector('svg').insertAdjacentElement)
{
    var label = document.querySelectorAll('label')[2];
    label.setAttribute('disabled','disabled');
    label.style.color = '#aaa';
    label.style.background = '#eee';
    label.style.cursor = 'not-allowed';
    label.title = 'This function is not supported in SVG for your browser.';
}
label{background:#cef;padding:5px;cursor:pointer}
.clickable{cursor:pointer}
With: 
<label><input type="radio" name="check" onclick="state=0" checked/>appendChild()</label>
<label><input type="radio" name="check" onclick="state=1"/>insertBefore()</label><br><br>
<label><input type="radio" name="check" onclick="state=2"/>insertAdjacentElement()</label>
<label><input type="radio" name="check" onclick="state=3"/>Try it with z-index</label>
<br>
<svg width="150" height="150" viewBox="0 0 150 150">
    <g stroke="none">
        <rect id="i1" class="clickable" x="10" y="10" width="50" height="50" fill="#80f"/>
        <rect id="i2" class="clickable" x="40" y="40" width="50" height="50" fill="#8f0"/>
        <rect id="i3" class="clickable" x="70" y="70" width="50" height="50" fill="#08f"/>
    </g>
</svg>


2

SVG एलिमेंट को लास्ट में रखें, ताकि उसका z- इंडेक्स टॉप में रहे। एसवीजी में, जेड-इंडेक्स नामक कोई संपत्ति नहीं है। तत्व को शीर्ष पर लाने के लिए जावास्क्रिप्ट के नीचे आज़माएं।

var Target = document.getElementById(event.currentTarget.id);
var svg = document.getElementById("SVGEditor");
svg.insertBefore(Target, svg.lastChild.nextSibling);

लक्ष्य: एक तत्व है जिसके लिए हमें इसे शीर्ष पर लाने की आवश्यकता है svg: तत्वों का कंटेनर है


0

यह करना आसान है:

  1. अपने आइटम क्लोन करें
  2. सॉर्ट किए गए आइटम सॉर्ट करें
  3. क्लोन द्वारा आइटम बदलें

function rebuildElementsOrder( selector, orderAttr, sortFnCallback ) {
	let $items = $(selector);
	let $cloned = $items.clone();
	
	$cloned.sort(sortFnCallback != null ? sortFnCallback : function(a,b) {
  		let i0 = a.getAttribute(orderAttr)?parseInt(a.getAttribute(orderAttr)):0,
  		    i1 = b.getAttribute(orderAttr)?parseInt(b.getAttribute(orderAttr)):0;
  		return i0 > i1?1:-1;
	});

        $items.each(function(i, e){
            e.replaceWith($cloned[i]);
	})
}

$('use[order]').click(function() {
    rebuildElementsOrder('use[order]', 'order');

    /* you can use z-index property for inline css declaration
    ** getComputedStyle always return "auto" in both Internal and External CSS decl [tested in chrome]
    
    rebuildElementsOrder( 'use[order]', null, function(a, b) {
        let i0 = a.style.zIndex?parseInt(a.style.zIndex):0,
  		    i1 = b.style.zIndex?parseInt(b.style.zIndex):0;
  		return i0 > i1?1:-1;
    });
    */
});
use[order] {
  cursor: pointer;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="keybContainer" viewBox="0 0 150 150" xml:space="preserve">
<defs>
    <symbol id="sym-cr" preserveAspectRatio="xMidYMid meet" viewBox="0 0 60 60">
        <circle cx="30" cy="30" r="30" />
        <text x="30" y="30" text-anchor="middle" font-size="0.45em" fill="white">
            <tspan dy="0.2em">Click to reorder</tspan>
        </text>
    </symbol>
</defs>
    <use order="1" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sym-cr" x="0" y="0" width="60" height="60" style="fill: #ff9700; z-index: 1;"></use>
    <use order="4" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sym-cr" x="50" y="20" width="50" height="50" style="fill: #0D47A1; z-index: 4;"></use>
    <use order="5" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sym-cr" x="15" y="30" width="50" height="40" style="fill: #9E9E9E; z-index: 5;"></use>
    <use order="3" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sym-cr" x="25" y="30" width="80" height="80" style="fill: #D1E163; z-index: 3;"></use>
    <use order="2" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sym-cr" x="30" y="0" width="50" height="70" style="fill: #00BCD4; z-index: 2;"></use>
    <use order="0" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sym-cr" x="5" y="5" width="100" height="100" style="fill: #E91E63; z-index: 0;"></use>
</svg>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.