एसवीजी में निश्चित स्ट्रोक चौड़ाई


103

मैं एक SVG तत्व पर "पिक्सेल-जागरूक" होने के लिए स्ट्रोक-चौड़ाई सेट करने में सक्षम होना चाहूंगा, जो कि लागू स्केलिंग ट्रांसफॉर्मेशन की परवाह किए बिना हमेशा 1px चौड़ा होगा। मुझे पता है कि यह अच्छी तरह से असंभव हो सकता है, क्योंकि एसवीजी का पूरा बिंदु पिक्सेल स्वतंत्र होना है।

संदर्भ इस प्रकार है:

मेरे पास इसके व्यूबॉक्स के साथ एक SVG एलिमेंट है और प्रॉटेक्टस्पेक्टर रेशियो सेट्स हैं। यह कुछ इस तरह दिखता है

<svg version="1.1" baseProfile="full"
    viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet"
    xmlns="http://www.w3.org/2000/svg" >
</svg>

इसका मतलब यह है कि जब मैं उस तत्व को मापता हूं, तो उसके अंदर की वास्तविक आकृतियां उस हिसाब से मापती हैं (अब तक बहुत अच्छी)।

जैसा कि आप देख सकते हैं, मैंने व्यूबॉक्स सेट किया है ताकि मूल केंद्र में हो। मैं उस तत्व के भीतर एक x- और y- अक्ष बनाना चाहूंगा, जो मैं इस प्रकार करता हूं:

<line x1="-1000" x2="1000" y1="0" y2="0" />

फिर, यह ठीक काम करता है। आदर्श रूप से, हालांकि, यह अक्ष हमेशा 1px चौड़ा होगा। जब मैं मूल svg तत्व को मापता हूं तो मुझे धुरी पाने में कोई दिलचस्पी नहीं है।

तो क्या मैं खराब हूँ?

जवाबों:


128

आप डॉक्स को देखने केvector-effect लिए सेट की गई संपत्ति का उपयोग कर सकते हैं । दूसरा तरीका उपयोग करना है ।non-scaling-stroketransform(ref)

यह उन ब्राउज़रों में काम करेगा जो एसवीजी टिनी 1.2 से उन हिस्सों का समर्थन करते हैं, उदाहरण के लिए ओपेरा 10.। फ़ॉलबैक में ऐसा करने के लिए एक छोटी स्क्रिप्ट लिखना, मूल रूप से CTM को निष्क्रिय करना और इसे उन तत्वों पर लागू करना शामिल है जो पैमाने नहीं होने चाहिए।

यदि आप तेज रेखाएँ चाहते हैं, तो आप एंटीएलियासिंग ( shape-rendering=optimizeSpeedया shape-rendering=crispEdges) और / या पोज़िशनिंग के साथ खेल सकते हैं।


1
दुर्भाग्य से यह एक एक्सयूएल ऐप में है, और यह अभी तक वेक्टर-प्रभाव का समर्थन नहीं करता है। ओह अच्छा।
wxs

1
यह फ़ायरफ़ॉक्स 15 में दिखाई देनी चाहिए सब कुछ ठीक किया जा रहा है ताकि आप इसे उपयोग करने के लिए एक बार आप छिपकली 15. पर अपने XUL अनुप्रयोग निर्माण में सक्षम होना चाहिए
रॉबर्ट Longson

2
IE11 अभी भी vector-effectसंपत्ति का समर्थन नहीं करता है। क्या vector-effect: non-scaling-strokeIE11 में जैसा प्रभाव प्राप्त करना संभव है ?
मर्लिन

1
@merlin हाँ, js के साथ यह IE में इसका अनुकरण करना संभव है।
एरिक डहलस्ट्रम

3
@merlin तत्व (सेटिंग के fillलिए noneऔर इसके विपरीत stroke) की गणना, उपयुक्त ट्रांसफ़ॉर्म (सेट भाग के लिए एक और स्ट्रोक भाग के लिए एक ) की गणना और सेट करें। यह सुनिश्चित करने के लिए थोड़ा गड़बड़ हो रहा है, लेकिन यह है - आप Microsoft से इसके लिए समर्थन जोड़ने के लिए भी कह सकते हैं। किसी भी मामले में मुझे लगता है कि आपका सवाल खुद का सवाल होने का हकदार है।
एरिक डहलस्ट्रम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.