2014-07-26 4 views
11

मैं सीएसएस ट्रांसफॉर्म के साथ एक JQuery सॉर्ट करने योग्य तत्व स्केल कर रहा हूं। सॉर्ट करने योग्य आइटम दोनों स्थिति और ऑफ़सेट शुरू करते हैं जबकि ड्रैगिंग गलत बीक्यूज हैं JQuery सीएसएस स्केल को ध्यान में नहीं लेता है। मैं इसे आंशिक रूप से हल किया कोड के साथ पाई गई:CSS3 स्केल लागू होने पर सॉर्टेबल गलत व्यवहार करता है

jQuery Drag/Resize with CSS Transform Scale

लेकिन बात मैं का समाधान नहीं कर खींचें शुरू होता है पर sortable आइटम की स्थिति है। यह ऊपर कूदता है और थोड़ा सा। मैं समझ नहीं क्या शुरू ईवेंट हैंडलर में लाना:

 start: function(e, ui) 
     { 
      // something is needed here to fix the initial offset 
     } 

यह फिडल समस्या दिखाता है: http://jsfiddle.net/adrianrosca/zbvLp/4/

+0

मैं इस सवाल के लिए एक इनाम शुरू कर दिया।हालांकि मुझे जरूरी नहीं लगता कि यह प्रश्न बड़े दर्शकों के लिए व्यापक रूप से लागू होता है, मैं * एक * कैननिकल उत्तर देखना चाहता हूं जो सॉर्ट करने योग्य ईवेंट हैंडलर में वास्तव में समायोजित करने की आवश्यकता है और क्यों jquery draggable समाधान, सुझाया गया था ओपी के [संदर्भित SO प्रश्न] में (https://stackoverflow.com/q/10212683/165154), jquery sortables पर लागू नहीं है। –

उत्तर

8

एक साथ अंतर खींचने योग्य कि बदलने पर नहीं है तत्व खुद, लेकिन माता-पिता पर। तो यह थोड़ा तर्क बदलता है।

यहां इस विशिष्ट मामले का समाधान है, लेकिन आप देखेंगे कि स्थिति के आधार पर यह बदल सकता है। उदाहरण के लिए, यदि आप ट्रांसफॉर्म-मूल बदलते हैं, या यदि आपके पास क्षैतिज क्रमबद्ध है, तो इसे अनुकूलित करना होगा। लेकिन तर्क ही रहता है:

var zoomScale = 0.5; 

$(".container") 
    .sortable({ 

    sort: function(e, ui) { 
    console.log(ui.position.left) 
     var changeLeft = ui.position.left - ui.originalPosition.left; 
     // For left position, the problem here is not only the scaling, 
     // but the transform origin. Since the position is dynamic 
     // the left coordinate you get from ui.position is not the one 
     // used by transform origin. You need to adjust so that 
     // it stays "0", this way the transform will replace it properly 
     var newLeft = ui.originalPosition.left + changeLeft/zoomScale - ui.item.parent().offset().left; 

     // For top, it's simpler. Since origin is top, 
     // no need to adjust the offset. Simply undo the correction 
     // on the position that transform is doing so that 
     // it stays with the mouse position 
     var newTop = ui.position.top/zoomScale; 

     ui.helper.css({ 
     left: newLeft, 
     top: newTop 
     }); 
    } 
    }); 

http://jsfiddle.net/aL4ntzsh/5/

संपादित करें:

पिछला जवाब स्थिति के लिए काम करेंगे, लेकिन के रूप में सभ्य प्रेमी द्वारा बताया, वहाँ चौराहे समारोह है कि जब सत्यापित करता है के साथ एक दोष है एक सॉर्टिंग होना चाहिए। असल में, पदों की सही गणना की जाती है, लेकिन आइटम चौड़ाई और ऊंचाई मान जो परिवर्तित नहीं होते हैं, जो समस्या पैदा कर रहे हैं। आप खाते में स्केल फैक्टर लेने के लिए प्रारंभिक ईवेंट पर उन्हें संशोधित करके इन मानों को समायोजित कर सकते हैं। उदाहरण के लिए इस तरह:

start: function(e, ui) { 
     var items = $(this).data()['ui-sortable'].items; 
     items.forEach(function(item) { 
     item.height *= zoomScale; 
     item.width *= zoomScale; 
     }); 
    } 

http://jsfiddle.net/rgxnup4v/2/

+0

आपके और [user3765122 का उत्तर] दोनों (https://stackoverflow.com/a/36715198/165154) ओपी की समस्या को हल करने के लिए प्रतीत होता है, उतनी ही बड़ी सीमा तक। हालांकि, एक सूक्ष्म समस्या, जो मुझे संदेह है, मेरी समस्या के लिए अपराधी है, दोनों में रहना प्रतीत होता है: सॉर्ट डिटेक्शन दाईं ओर स्थानांतरित हो जाता है। यदि आप क्षैतिज केंद्र में कोई तत्व लेते हैं और इसे दूसरों पर खींचते हैं, जबकि ध्यान से बाएं और दाएं स्थानांतरित करते हैं, तो आप इसे देखेंगे। चूंकि मैं कनेक्टेड सॉर्टेबल्स का उपयोग करता हूं, जो कि बहुत व्यापक * और * क्षैतिज भाई बहन भी हैं, यह सूक्ष्म समस्या बेहद बढ़ी है। क्या आप जानते हैं कि इसके लिए क्षतिपूर्ति कैसे करें? –

+0

शायद मुझे अपने विशिष्ट मामले के लिए एक नया प्रश्न शुरू करना होगा, क्योंकि यह ओपी की तुलना में अधिक जटिल है, लेकिन अगर आप इस सूक्ष्म मुद्दे को ठीक करने के बारे में जानते हैं तो मेरी समस्या गायब हो सकती है। किसी भी मामले में: चूंकि आपके उत्तर दोनों अब तक एक समान पैर पर दिखते हैं, इसलिए मुझे पूरी तरह से यकीन नहीं है कि अभी तक बकाया पुरस्कार देने का कौन सा जवाब है। मैं दोनों को बक्षीस देने का फैसला कर सकता हूं। लेकिन शायद आप समझा सकते हैं कि दोनों उत्तरों का एक ही परिणाम क्यों दिखता है? पीएस .: अब तक आपके समाधान के लिए बहुत बहुत धन्यवाद! –

+0

ठीक है, अतिरिक्त के लिए आपको बहुत बहुत धन्यवाद! ओपी के मामले के लिए यह * हल * हल करता है। दुर्भाग्यवश यह मेरे मामले को मेरे कनेक्टेड सॉर्टेबल्स के साथ हल नहीं करता है (कनेक्ट किए गए आइटम सभी '{चौड़ाई: 0, ऊंचाई: 0, बाएं: 0, शीर्ष: 0}') के रूप में दिखाए जाते हैं, लेकिन जैसा कि मैंने कहा, मेरा मामला बहुत अधिक है अधिक जटिल। तो, या तो मैं इसके साथ कुछ समय तक खुद को पोजीशनिंग/ऑफ़सेट/इत्यादि की जटिलताओं को समझने की कोशिश कर रहा हूं, या अगर मैं इसे समझने में असमर्थ हूं तो मैं इसके बारे में एक नया सवाल शुरू करूंगा। लेकिन बक्षीस अच्छी तरह से योग्य है, और आपने मुझे कहां देखना है इसके बारे में बहुत सारे संकेत दिए हैं। एक बार फिर धन्यवाद! –

1

वहाँ तुम्हारी समस्या में दो बातें कर रहे हैं: एक तत्व की

  1. स्थिति संपत्ति माता पिता निकटतम के आधार पर गणना की जाती है जो स्थिति पूर्ण या संबंधित है। अभी आधारित माता-पिता शरीर है जो अच्छा नहीं है इसलिए आपको कंटेनर के लिए position:relative; जोड़ना होगा।
  2. क्योंकि, जैसा कि आप पहले ही नोटिस करते हैं, JQuery ui.position और ui.originalPosition दोनों की गणना करते समय सीएसएस स्केल को ध्यान में नहीं लेता है, इसलिए आपको दोनों को zoomScale "लागू" करना होगा।

सीएसएस

.container 
{ 
    position: relative; 
    transform: scale(0.5); 
    transform-origin: center top; 
} 

स्क्रिप्ट

var changeLeft = ui.position.left - ui.originalPosition.left; 
var newLeft = (ui.originalPosition.left + changeLeft)/zoomScale; 
var changeTop = ui.position.top - ui.originalPosition.top; 
var newTop = (ui.originalPosition.top + changeTop)/zoomScale; 

यह वह जगह है अद्यतन कोड: http://jsfiddle.net/zbvLp/9/

+0

आपके और [जूलियन ग्रेगोयर का उत्तर] (https://stackoverflow.com/a/36684822/165154) ओपी की समस्या को हल करने के लिए प्रतीत होता है, उतनी ही बड़ी सीमा तक। हालांकि, एक सूक्ष्म समस्या, जो मुझे संदेह है, मेरी समस्या के लिए अपराधी है, दोनों में रहना प्रतीत होता है: सॉर्ट डिटेक्शन दाईं ओर स्थानांतरित हो जाता है। यदि आप क्षैतिज केंद्र में कोई तत्व लेते हैं और इसे दूसरों पर खींचते हैं, जबकि ध्यान से बाएं और दाएं स्थानांतरित करते हैं, तो आप इसे देखेंगे। चूंकि मैं कनेक्टेड सॉर्टेबल्स का उपयोग करता हूं, जो कि बहुत व्यापक * और * क्षैतिज भाई बहन भी हैं, यह सूक्ष्म समस्या बेहद बढ़ी है। क्या आप जानते हैं कि इसके लिए क्षतिपूर्ति कैसे करें? –

+0

शायद मुझे अपने विशिष्ट मामले के लिए एक नया प्रश्न शुरू करना होगा, क्योंकि यह ओपी की तुलना में अधिक जटिल है, लेकिन अगर आप इस सूक्ष्म मुद्दे को ठीक करने के बारे में जानते हैं तो मेरी समस्या गायब हो सकती है। किसी भी मामले में: चूंकि आपके उत्तर दोनों अब तक एक समान पैर पर दिखते हैं, इसलिए मुझे पूरी तरह से यकीन नहीं है कि अभी तक बकाया पुरस्कार देने का कौन सा जवाब है। मैं दोनों को बक्षीस देने का फैसला कर सकता हूं। लेकिन शायद आप समझा सकते हैं कि दोनों उत्तरों का एक ही परिणाम क्यों दिखता है? पीएस .: अब तक आपके समाधान के लिए बहुत बहुत धन्यवाद! –

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