2011-09-13 18 views
25

मैं svg साथ शेयर चार्ट बना रहा हूं और जब मैं लाइनों अधिक संकीर्ण बनाने के बजाय 1. करने के लिए अपने पथ तत्वों के स्ट्रोक-चौड़ाई सेट मैं समस्या आ रही है, यह सिर्फ यह स्ट्रोक-चौड़ाई के रूप में एक ही आकार में आता है : 2 लेकिन थोड़ा पारदर्शी। मैं इसके बारे में एक छवि पोस्ट नहीं कर सकते, क्योंकि मैं काफी प्रतिष्ठा अंक नहीं है ...एसवीजी स्ट्रोक-चौड़ाई क्यों है: 1 लाइनों को पारदर्शी बनाना?

मेरे svg टैग तो दिखाई देता है:

<div style="height:300px; width:400px; overflow:hidden"> 
<svg style="position:relative" height="10000" width="10000" version="1.1" xmlns="http://www.w3.org/2000/svg"> 
</svg> 
</div> 

और मैं जावास्क्रिप्ट का उपयोग करते हुए पथ तत्वों को जोड़ने कर रहा हूँ गतिशील/jQuery:

var shape = document.createElementNS("http://www.w3.org/2000/svg", "path"); 
$(shape).attr({"d":"...", 
       "fill":"none", 
       "stroke":color, 
       "stroke-width":"1"}); 
$("svg").append(shape); 

मैं पथ के d विशेषता के लिए मूल्य बाहर छोड़ दिया के रूप में यह एक तरह से लंबी थी। इसके अलावा, color एक स्ट्रिंग चर है कि या तो "हरी", "लाल", या "काला" के रूप में पहले से निर्धारित होता है।

वहाँ कुछ मेरी कोड है कि इस कारण या यह एक अलग मुद्दा है में गलत है?

+2

आप एक तस्वीर पोस्ट नहीं कर सकते, तो आप शायद एक jsfiddle पोस्ट कर सकते हैं। – Marcin

उत्तर

28

यह शायद विरोधी aliasing सबसे एसवीजी कार्यान्वयन में लागू की वजह से है। जब रेखा की चौड़ाई 1 के करीब या नीचे जाती है, तो एंटीअलाइजिंग इसे बनाता है ताकि आधा कवर पिक्सेल आंशिक रूप से अपारदर्शी हो। डिफ़ॉल्ट रूपांतरण और जगह में व्यूपोर्ट के साथ, अपने एक-पिक्सेल लाइन शायद ठीक दो भौतिक पिक्सल के बीच की सीमा पर बैठता है, ताकि वे एक आधा कवर कर रहे हैं, एक समग्र 50% पारदर्शिता के लिए अग्रणी। एक सफेद पृष्ठभूमि पर एक काला रेखा के साथ, यह 50% ग्रे पैदा करता है।

+1

क्या कोई तरीका है कि मैं इसे बदल सकता हूं? जब मैं w3schools.com पर svg उदाहरण, स्ट्रोक-चौड़ाई के साथ लाइनों के साथ चारों ओर खेला: 1 पारदर्शिता के बिना ठीक दिख रहा थे। – MattL922

+0

यह रेंडरर पर निर्भर करता है; इस पर प्रभाव डालने का कोई तरीका नहीं है। एंटी-एलाइजिंग को चालू करने का एक तरीका हो सकता है, लेकिन कोई मानक तरीका नहीं है जिसे मैं जानता हूं। – tdammers

+47

ठीक है, मैंने इसे गुगल किया और इसे समझने में सक्षम था। सभी मैं क्या करना है जोड़ने के आकार-प्रतिपादन है: पथ तत्व की शैली के लिए crispEdges और यह अब एक 1px विस्तृत पंक्ति के रूप में दिखाई देता है। सहायता के लिए धन्यवाद! – MattL922

54

लाइनों सीधे क्षैतिज या लम्बवत बस, आधे से एक पिक्सेल बंद पर लाइनों जगह x="1.5px" की तरह कर रहे हैं।

एक और तरीका है लाइनों के लिए कुछ सीएसएस लागू करने के लिए है:

.thelines{ 
    shape-rendering:crispEdges 
} 

The spec chapter on shape-rendering property.

+1

धन्यवाद, szamil! लेकिन वास्तव में यह धोखा नहीं है क्योंकि यदि वास्तविक रेखा को सटीक निर्देशांक पर रखा गया है तो स्ट्रोक को इसके दोनों किनारों पर चित्रित किया जाता है, और आप वास्तव में दो-पिक्सेल आधा पारदर्शी रेखा देखते हैं, न कि एक पिक्सेल अपारदर्शी। –

17

शायद एक छोटे से देर से, लेकिन इस के लिए असली कारण है कि जब आप एक ग्रिड लाइन है, जिस पर आकर्षित है अनंत छोटे स्ट्रोक-चौड़ाई 1 के साथ लाइन (या/नीचे से ऊपर) ग्रिड लाइन से एक आधा पिक्सेल छोड़ दिया और सही के रूप में प्रदान की गई है। मैंने 0.5,0.5 को बदलने के साथ सभी ऑब्जेक्ट्स के चारों ओर एक समूह जोड़कर इसे हल किया ताकि सब कुछ आधे ग्रिड लाइन को स्थानांतरित कर दिया जा सके।

तो सब कुछ आप आकर्षित अब ठीक 2 ग्रिड लाइनों के बीच बीच में है। स्ट्रोक की चौड़ाई 1 Wil के साथ एक लाइन है अब छोड़ दिया और बाईं ओर आधे से एक पिक्सेल, लेकिन बीच में से दोनों को आधा पिक्सेल। वास्तव में मोटाई आप चाहते थे के साथ एक पंक्ति में जिसके परिणामस्वरूप: 1 पिक्सेल ...

उदाहरण:

<g transform="translate(0.5,0.5)"> 
<g> 
    <path /> 
    <path /> 
</g> 
<g> 
    <path /> 
    <path /> 
</g> 
</g> 
2

जवाब user616586 से ठीक लग रहा है।

समस्या मैं देख

कि लाइनों आकार के केंद्र से समान दूरी की जरूरत नहीं है क्योंकि उनमें से एक 1 पिक्सल की भरपाई कर रहा है। अधिकांश स्थितियों में शायद स्वीकार्य thats, लेकिन कभी कभी ऐसा नहीं है।

एक अन्य विकल्प:

  • 2px की एक स्ट्रोक-चौड़ाई का उपयोग करें (होने 1px बाहर प्रदान की गई और 1px आकार के भीतर प्रस्तुत किये)
  • एक क्लिप-पथ के रूप में खुद को आकार लागू (प्रतिपादन को हटा बाहरी 1px) की
2

तो इसकी D3js फिर अपने d3 तत्व को शैली विशेषता नीचे जोड़ने का प्रयास करें:

.style('shape-rendering','crispEdges') 

इस लाइन पतली बनाता है।

आप, सीएसएस के साथ एक ही प्राप्त करने के लिए फिर नीचे दिए गए शैली को जोड़ने चाहते हैं:

.the_Line_CLass{ 
    shape-rendering: crispEdges; 
} 
संबंधित मुद्दे