मैं अपने मूल कंटेनर के साथ svg स्केल कैसे बना सकता हूं?


235

जब आकार गैर-देशी हो तो मुझे इनलाइन svg तत्व की सामग्री स्केल चाहिए। बेशक, मैं इसे एक अलग फ़ाइल के रूप में ले सकता था और इसे इस तरह से स्केल कर सकता था।

index.html: <img src="foo.svg" style="width: 100%;" />

foo.svg: <svg width="123" height="456"></svg>

हालांकि, मैं एसवीजी थ्रू सीएसएस में अतिरिक्त शैलियों को जोड़ना चाहता हूं, इसलिए किसी बाहरी को लिंक करना एक विकल्प नहीं है। मैं इनलाइन एसवीजी स्केल कैसे बनाऊं?


2
svg चौड़ाई और ऊंचाइयों में शिकारियों की कोशिश करो।
ncm

@ncm जेएस के साथ कैसे किया जाएगा?
मावग का कहना है कि मोनिका

जवाबों:


457

स्वतंत्र रूप से छवि के स्केल किए गए आकार के स्वतंत्र रूप से एसवीजी छवि के भीतर निर्देशांक निर्दिष्ट करने के लिए, viewBoxछवि के समन्वय प्रणाली में छवि के बाउंडिंग बॉक्स क्या है, यह परिभाषित करने के लिए एसवीजी तत्व पर विशेषता का उपयोग करें, और परिभाषित करने के लिए छवि widthऔर heightविशेषताओं का उपयोग करें चौड़ाई या ऊंचाई वाले पृष्ठ के संबंध में हैं।

उदाहरण के लिए, यदि आपके पास निम्नलिखित हैं:

<svg>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

यह 20px त्रिकोण द्वारा 10px के रूप में प्रस्तुत करेगा:

10x20 त्रिकोण

अब, यदि आप केवल चौड़ाई और ऊंचाई निर्धारित करते हैं, तो यह एसवीजी तत्व के आकार को बदल देगा, लेकिन त्रिभुज को स्केल नहीं करेगा:

<svg width=100 height=50>
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

10x20 त्रिकोण

यदि आप दृश्य बॉक्स सेट करते हैं, तो यह छवि को बदलने का कारण बनता है जैसे दिए गए बॉक्स (छवि के समन्वय प्रणाली में) को दिए गए चौड़ाई और ऊंचाई (पृष्ठ के समन्वय प्रणाली में) के भीतर फिट करने के लिए बढ़ाया जाता है। उदाहरण के लिए, त्रिकोण को 50px से 100px करने के लिए:

<svg width=100 height=50 viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

100x50 त्रिकोण

यदि आप इसे HTML व्यूपोर्ट की चौड़ाई तक मापना चाहते हैं:

<svg width="100%" viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

300x150 त्रिकोण

ध्यान दें कि डिफ़ॉल्ट रूप से, पहलू अनुपात संरक्षित है। इसलिए यदि आप निर्दिष्ट करते हैं कि तत्व की चौड़ाई 100% होनी चाहिए, लेकिन 50px की ऊँचाई, तो यह वास्तव में केवल 50px की ऊँचाई तक ही बढ़ेगी (जब तक कि आपके पास बहुत संकरी खिड़की न हो):

<svg width="100%" height="50px" viewBox="0 0 20 10">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

100x50 त्रिकोण

यदि आप वास्तव में इसे क्षैतिज रूप से फैलाना चाहते हैं, तो इसके साथ पहलू अनुपात संरक्षण को अक्षम करें preserveAspectRatio=none:

<svg width="100%" height="50px" viewBox="0 0 20 10" preserveAspectRatio="none">
    <polygon fill=red stroke-width=0 
             points="0,10 20,10 10,0" />
</svg>

300x50 त्रिकोण

(ध्यान दें कि मेरे उदाहरणों में मैं वाक्यविन्यास का उपयोग करता हूं जो HTML एम्बेडिंग के लिए काम करता है, उदाहरणों को StackOverflow में छवि के रूप में शामिल करने के लिए मैं दूसरे SVG के भीतर एम्बेड कर रहा हूं, इसलिए मुझे मान्य XML सिंटैक्स का उपयोग करने की आवश्यकता है)


1
आप न केवल व्यूबॉक्स को कैसे सुरक्षित रखते हैं, लेकिन यह भी मुख्य बॉक्स है? मुझे चौड़ाई चाहिए: 100%; ऊंचाई: इसके लिए ऑटो।
bjb568

1
@ दोस्त: मुझे लगता है कि उदाहरण width="100%"और निर्दिष्ट कोई ऊँचाई वह नहीं है जो आप चाहते हैं। मैंने चित्र प्रदर्शित करने के लिए जोड़े हैं। इसकी 100% चौड़ाई है, और समानुपातिक रूप से ऊंचाई को बढ़ाता है। यदि वह नहीं है जिसे आप खोज रहे हैं, तो क्या आप स्पष्ट करने का प्रयास कर सकते हैं कि आपका क्या मतलब है?
ब्रायन कैंपबेल

1
ओह। वास्तव में कोई समस्या नहीं। यह सिर्फ एक वेबकिट बग है। सफारी और क्रोम में "वास्तविक" ऊंचाई डिफ़ॉल्ट रूप से 100% है, ऑटो नहीं। मैं इसके आसपास कैसे पहुंचूंगा?
bjb568

4
@ दोस्त आह, हां, मैं देख रहा हूं। यह फ़ायरफ़ॉक्स में ठीक काम करता है, लेकिन कोई क्रोम या सफारी नहीं। एसवीजी विनिर्देश के अनुसार , फ़ायरफ़ॉक्स सही प्रतीत होता है; जबकि का डिफ़ॉल्ट मान widthऔर heightएक एसवीजी तत्व के लिए 100% है, यह 100% (युक्त ब्लॉक का 100%) की सीएसएस परिभाषा नहीं है, लेकिन व्यूपोर्ट कि कर दिया गया है निर्दिष्ट आंतरिक पहलू अनुपात के आधार पर करने के बजाय 100% ( जो viewBoxकि जब दिया जाता है) से गणना की जाती है । मुझे अभी तक उस समस्या का हल नहीं मिला है जो Chrome / Safari में काम करती है।
ब्रायन कैंपबेल

1
यह मेरे लिए काम करता है। मैं पहली बार एसवीजी तत्व पर एक व्यूबॉक्स विशेषता बनाता हूं और "0 0 [मूल svg चौड़ाई] [मूल svg ऊंचाई" पर मान सेट करता हूं। अगला मैं एसवीजी तत्व की चौड़ाई विशेषता को "ऑटो" और ऊंचाई विशेषता को "100%" में बदल देता हूं। कंटेनर में एक परिभाषित ऊंचाई भी होनी चाहिए। यह वेक्टर को 100% कंटेनर की ऊंचाई तक ले जाता है, जिससे चौड़ाई तैरने लगती है। अंत में, कंटेनर की निगरानी करने के लिए SVG की CSS अधिकतम-चौड़ाई को 100% पर सेट करें।
रयान ग्रिग्स

28

48 घंटे के शोध के बाद, मैंने आनुपातिक स्केलिंग प्राप्त करने के लिए ऐसा किया।

नोट: यह नमूना प्रतिक्रिया के साथ लिखा गया है। आप का उपयोग नहीं कर रहे हैं, तो हाइफ़न को ऊंट मामले सामान वापस बदलने (यानी: परिवर्तन backgroundColorकरने के लिए background-colorऔर शैली बदलने के Objectएक करने के लिए वापस String)।

<div
  style={{
    backgroundColor: 'lightpink',
    resize: 'horizontal',
    overflow: 'hidden',
    width: '1000px',
    height: 'auto',
  }}
>
  <svg
    width="100%"
    viewBox="113 128 972 600"
    preserveAspectRatio="xMidYMid meet"
  >
    <g> ... </g>
  </svg>
</div>

यहाँ ऊपर नमूना कोड में क्या हो रहा है:

VIEWBOX

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox

मिन-एक्स, मिन-वाई, चौड़ाई और ऊंचाई

अर्थात: व्यूबॉक्स = "0 0 1000 1000"

व्यूबॉक्स एक महत्वपूर्ण विशेषता है क्योंकि यह मूल रूप से एसवीजी को बताता है कि किस आकार को आकर्षित करना है और कहां। यदि आपने एसवीजी 1000x1000 पीएक्स बनाने के लिए सीएसएस का उपयोग किया था लेकिन आपका व्यूबॉक्स 2000x2000 था, तो आपको अपने एसवीजी के शीर्ष-बाएँ क्वार्टर दिखाई देगा ।

पहले दो नंबर, मिन-एक्स और मिन-वाई, यह निर्धारित करते हैं कि एसवीजी व्यूबॉक्स के अंदर ऑफसेट होना चाहिए या नहीं।

मेरे SVG को ऊपर / नीचे या बाएँ / दाएँ शिफ़्ट करना होगा

इसे देखें: व्यूबॉक्स = "50 50 450 450"

पहले दो नंबर आपके SVG को 50px और 50px ऊपर छोड़ देंगे, और दूसरे दो नंबर व्यूबॉक्स का आकार हैं: 450x450 xx। यदि आपका SVG 500x500 है, लेकिन इस पर कुछ अतिरिक्त पैडिंग है, तो आप "व्यूबॉक्स" के अंदर इसे स्थानांतरित करने के लिए उन नंबरों को जोड़ सकते हैं।

इस बिंदु पर आपका लक्ष्य उन नंबरों में से एक को बदलना है और देखना है कि क्या होता है।

आप व्यूबॉक्स को पूरी तरह से छोड़ भी सकते हैं, लेकिन तब आपका माइलेज उस समय आपके पास मौजूद हर दूसरी सेटिंग के आधार पर अलग-अलग होगा। मेरे अनुभव में, आप पहलू अनुपात को संरक्षित करने के मुद्दों का सामना करेंगे क्योंकि व्यूबॉक्स पहलू अनुपात को परिभाषित करने में मदद करता है।

संभावित अनुपात को बनाए रखें

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio

मेरे शोध के आधार पर, कई अलग-अलग पहलू अनुपात सेटिंग्स हैं, लेकिन डिफ़ॉल्ट को कहा जाता है xMidYMid meet। मैंने स्पष्ट रूप से खुद को याद दिलाने के लिए इसे खदान पर रखा। xMidYMid meetयह मध्य बिंदु X और Y के आधार पर समानुपातिक रूप से बनाता है। इसका मतलब है कि यह व्यूबॉक्स में केंद्रित रहता है।

चौड़ाई

MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/Net

ऊपर मेरा उदाहरण कोड देखें। ध्यान दें कि मैंने केवल चौड़ाई कैसे निर्धारित की, कोई ऊँचाई नहीं। मैंने इसे 100% पर सेट किया है ताकि यह कंटेनर को भर दे। यह वही है जो इस स्टैक ओवरफ्लो प्रश्न का उत्तर देने में सबसे अधिक योगदान दे रहा है।

आप इसे चाहे जितने पिक्सेल मूल्य में बदल सकते हैं, लेकिन मैं 100% का उपयोग करने की सलाह दूंगा जैसे मैंने इसे अधिकतम आकार तक उड़ाने और फिर इसे पेरेंट कंटेनर के माध्यम से सीएसएस के साथ नियंत्रित किया। मैं यह सलाह देता हूं क्योंकि आपको "उचित" नियंत्रण मिलेगा। आप मीडिया क्वेरी का उपयोग कर सकते हैं और आप पागल जावास्क्रिप्ट के बिना आकार को नियंत्रित कर सकते हैं।

सीएसएस के साथ स्कोरिंग

फिर से ऊपर मेरे उदाहरण कोड को देखें। ध्यान दें कि मेरे पास ये गुण कैसे हैं:

resize: 'horizontal', // you can safely omit this
overflow: 'hidden',   // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',

यह अतिरिक्त है, लेकिन यह आपको दिखाता है कि उचित पहलू अनुपात को बनाए रखते हुए उपयोगकर्ता को एसवीजी का आकार बदलने की अनुमति कैसे दी जाए। क्योंकि एसवीजी अपने स्वयं के पहलू अनुपात को बनाए रखता है, आपको केवल मूल कंटेनर पर चौड़ाई बदलने योग्य बनाने की आवश्यकता है, और यह वांछित के रूप में आकार बदल जाएगा।

हम अकेले ऊंचाई छोड़ते हैं और / या इसे ऑटो पर सेट करते हैं, और हम चौड़ाई के साथ आकार को नियंत्रित करते हैं। मैंने चौड़ाई को उठाया क्योंकि यह उत्तरदायी डिजाइनों के कारण अक्सर अधिक सार्थक है।

यहां इन सेटिंग्स की एक छवि का उपयोग किया जा रहा है:

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

यदि आप इस प्रश्न का हर हल पढ़ते हैं और अभी भी उलझन में हैं या आपको जो कुछ भी चाहिए, वह नहीं देख रहे हैं, तो इस लिंक को यहाँ देखें। मैंने इसे बहुत उपयोगी पाया:

https://css-tricks.com/scale-svg/

यह एक विशाल लेख है, लेकिन यह सीवीजी के साथ या बिना सीएसएस के हेरफेर करने के लिए हर संभव तरीके से टूट जाता है। मैं आपको कॉफ़ी पीते समय या चुनिंदा तरल पदार्थों का चयन करते हुए इसे पढ़ने की सलाह देता हूं।


यह किसी भी एसवीजी के लिए काम नहीं करता है - यदि आपके पास एसवीजी स्रोत का नियंत्रण नहीं है, तो एसवीजी की निश्चित चौड़ाई होने पर यह विधि विफल हो जाती है।
user48956

@ user48956 आप जावास्क्रिप्ट के साथ इस तथ्य के बाद हमेशा इसमें हेरफेर कर सकते हैं।
एंड्रयू

हां - आप हमेशा एक प्रोग्रामिंग के साथ विभिन्न फ़ाइल स्वरूपों के सराय में प्रहार कर सकते हैं - लेकिन आपको उम्मीद है कि एक ऐसी विधि होगी जो सभी प्रकार की संपत्ति (जैसे पीएनजी) के लिए काम करती है और जावास्क्रिप्ट प्रोग्रामिंग की आवश्यकता नहीं होती है।
user48956

21

आप इस तरह से एक परिवर्तन करना चाहते हैं:

जावास्क्रिप्ट के साथ:

document.getElementById(yourtarget).setAttribute("transform", "scale(2.0)");

सीएसएस के साथ:

#yourtarget {
  transform:scale(2.0);
  -webkit-transform:scale(2.0);
}

अपने एसवीजी पेज को ग्रुप टैग में लपेटें और इसे पूरे पेज को मैनिप्युलेट करने के लिए लक्षित करें:

<svg>
  <g id="yourtarget">
    your svg page
  </g>
</svg>

नोट : स्केल १०% है


7
ठीक। मैं इसमें JS नहीं चाहता। क्या माता-पिता को फिट करने के लिए इसे बदलने का कोई तरीका है?
bjb568

@bj setAttribute <टैग विशेषता = "मान">
जॉन ktejik

17

ऐसा प्रतीत होता है कि इस सीएसएस को क्रोम ब्राउज़र में SVG सम्‍मिलित किया गया है, जहां कंटेनर छवि से बड़ा है:

div.inserted-svg-logo svg { max-width:100%; }

FF + IE 11 में भी काम कर रहा है।


इससे मेरे लिए समस्या हल हो गई। मैं केवल iOS में अतिप्रवाह देख रहा था। धन्यवाद!
इवान मैटसन

5
दोनों का उपयोग करना max-width: 100%और max-height: 100%कभी भी अतिप्रवाह या उसके पहलू अनुपात को खोए बिना svg को हमेशा पैमाने पर बनाएगा।
गविन

2
@ गेविन max-height: 100%मेरे लिए काम नहीं करता है, इसका उपयोग करके हल किया vhगया है%
पावेल

2

एसवीजी फ़ाइल को बदलना मेरे लिए उचित समाधान नहीं था, इसके बजाय, मैंने रिश्तेदार सीएसएस इकाइयों का उपयोग किया ।

vh, vw, %बहुत आसान कर रहे हैं। मैंने height: 2.4vh;अपनी एसवीजी छवियों के लिए एक गतिशील आकार सेट करने के लिए सीएसएस का उपयोग किया ।



0

आईई (आईई 11 के साथ परीक्षण किया गया) में वर्तमानस्केल विशेषता कार्यों को समायोजित करना, लेकिन क्रोम में नहीं।

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