2011-09-28 16 views
15

के बजाय 2px लाइनों का उत्पादन करता है मुझे पता है कि यह इस समस्या के कारण jQuery एसवीजी लाइब्रेरी नहीं है, लेकिन अभिन्न x, y निर्देशांक पर क्षैतिज या लंबवत एसवीजी लाइनों को प्रस्तुत करते समय, लाइनें 1px के बजाय 2px चौड़ी होती हैं। यह एंटी-एलाइजिंग के साथ संभवतः उन्हें ठीक करने के लिए है, और एक रेखा को पूरी तरह से 1px चौड़ा खींचें, मुझे 0.5px जोड़कर निर्देशांक समायोजित करने की आवश्यकता है।jQuery एसवीजी के साथ ड्राइंग ग्रिड 1px

क्या इस तरह उन्हें ट्विक किए बिना लाइन 1px मोटी पाने का कोई तरीका है?

उत्तर

31

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

.thelines{ 
    shape-rendering:crispEdges 
} 

The spec chapter on shape-rendering property.

मूल रूप से यह लाइनों के लिए antialiasing बंद हो जाती है, और लाइनों है कि सीधे नहीं हैं क्षैतिज या लम्बवत बहुत सुंदर नहीं लग सकता है।

लेकिन शायद आप लाइनों के निर्देशांक में 5 जोड़ने के लिए बेहतर चिपक जाएंगे, क्योंकि ब्राउजर जो करते हैं उन्हें करते हैं: रेखा सटीक निर्देशांक पर होती है और रेखा के दोनों किनारों पर स्ट्रोक चित्रित किया जाता है, आधा पिक्सेल यहाँ और आधे पिक्सेल वहाँ।

+0

यह काम कर सकता है, अगर मैं एए बंद कर सकता हूं, तो यह समस्या का समाधान करेगा। –

+0

ठीक है, यह काम करता है, केवल समस्या है, jQuery एसवीजी शैली ठीक से सेट नहीं होती है अगर आप इसे आकार कहते हैं, जैसे कि वे अपने दस्तावेज़ में संदर्भित करते हैं, इसे आकार-प्रतिपादन होना चाहिए, अन्यथा यह काम नहीं करता है। –

+0

मुझे लगता है कि इसे 'आकार रेंडरिंग' होना चाहिए जब आप उसे DOM ऑब्जेक्ट प्रॉपर्टी के रूप में सेट कर रहे हों: 'yourElement.style.shapeRendering = "crispEdges" ', लेकिन एक स्टाइल विशेषता के अंदर इसे अपना मूल नाम रखना चाहिए। –

10

तो आप एक पिक्सेल चौड़ी क्षैतिज और ऊर्ध्वाधर रेखाओं को अस्पष्ट किनारों के बजाय तेज के साथ प्रदर्शित करना चाहते हैं।

यदि आपका एसवीजी में सभी समन्वय पूर्णांकों हैं, हो सकता है अगर आप पूर्ण छवि 0.5 की भरपाई कर सकते हैं, एक को बदलने तत्व का उपयोग करके:

// first group has no transform 
// lines appear blurred, because they are centered on boundary of two pixels 
<g id = "blurred"> 
    <line x1="10" y1="10" x2="110" y2="10" stroke="black" stroke-width="1"/> 
    <line x1="10" y1="10" x2="10" y2="100" stroke="black" stroke-width="1"/> 
</g> 

    // second group has half pixel transform - 
    // lines will appear sharp because they are translated to a pixel centre 
    <g id="sharp" transform="translate(0.5,0.5)"> 
    <line x1="120" y1="10" x2="220" y2="10" stroke="black" stroke-width="1"/> 
    <line x1="120" y1="10" x2="120" y2="100" stroke="black" stroke-width="1"/> 
</g> 

svg renders like this

लेकिन इस इच्छा क्षैतिज/ऊर्ध्वाधर रेखाओं के लिए काम नहीं करते हैं जिन्हें पूर्णांक निर्देशांक के साथ परिभाषित नहीं किया जाता है, या जहां एक और परिवर्तन उन्हें पूर्णांक निर्देशांक से बाहर ले जाता है।

इसलिए यदि इस विचार का उपयोग आपकी समस्या को हल करने के लिए नहीं किया जा सकता है, तो आपको शायद 'पिक्सेल-स्नैपिंग' तकनीक की आवश्यकता हो। यह इसे चित्रित करने से पहले एक लाइन का विश्लेषण करेगा। यदि रेखा लंबवत या क्षैतिज (परिवर्तन के बाद) है तो आपको निर्देशांक समायोजित करने की आवश्यकता है ताकि वे परिवर्तन के बाद एक पिक्सेल केंद्र में समाप्त हो जाएंगे।

आप इस आम समस्या के बारे में पृष्ठभूमि जानकारी के लिए WPF Pixel Snapping स्पष्टीकरण को देखने में रुचि रखते हैं।

+0

यह एक अच्छा विचार की तरह लगता है! :) धन्यवाद –

+0

सेटटाइमआउट (फ़ंक्शन() { d3.selectAll ('। Cpu-stats .c3-ygrid-lines .c3-ygrid-line') .attr ('ट्रांसफॉर्म', फ़ंक्शन (डी, i) { वापसी 'अनुवाद (0.5,0.5)'; }); }, 300); – Ivan

0

बस भरने के साथ एक 1 पीएक्स चौड़ा आयताकार (केवल क्षैतिज/लंबवत रेखाओं के लिए) का उपयोग करें।

उदा। एक पूर्ण चौड़ाई क्षैतिज रेखा के लिए:

<rect x="0" y="0" width="100%" height="1" fill="#c2c2c2"></rect> 

हर बार सही 1px चौड़ी लाइनें।

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