2013-02-15 19 views
6

के साथ बूटस्ट्रैप ढहने जैसा कुछ मैं एक छोटा ऐप बना रहा हूं और मैं AngularJS का उपयोग कर रहा हूं। ऐप के अंदर मुझे एक ढीला तत्व चाहिए और ट्विटर बूटस्ट्रैप का उपयोग करना लाइब्रेरी और मेरे लक्षित तत्व और ट्रिगर पर कुछ टैग जोड़ने जितना आसान होगा।कोणीय

लेकिन मैं बूटस्ट्रैप या किसी अन्य की तरह अन्य बाहरी पुस्तकालयों लोड करने के लिए नहीं कोशिश कर रहा हूँ, इसलिए मैं कोणीय के साथ समान व्यवहार प्राप्त करने के लिए कोशिश कर रहा था:

$scope.collapse = function(target) { 

     var that = angular.element(document).find(target), 

      transitioned = { 
       'WebkitTransition' : 'webkitTransitionEnd', 
       'MozTransition' : 'transitionend', 
       'OTransition'  : 'oTransitionEnd otransitionend', 
       'msTransition'  : 'MSTransitionEnd', 
       'transition'  : 'transitionend' 
      }, 

      _transitioned = transitioned[ Modernizr.prefixed('transition') ], 

      height = that.outerHeight(true); 

     if (angular.element(that).hasClass("in")) { 
      that.height(0); 
     } else { 
      that.height(height); 
     }; 

     that.on(_transitioned, function() { 
      that.toggleClass("in"); 
     }); 
    }; 

आप मैं संक्रमण के लिए कोशिश कर रहा हूँ देख सकते हैं ऊंचाई (क्योंकि तत्व की ऊंचाई पर एक संक्रमण है) और अंत में कक्षा in जोड़ें। लेकिन यह बहुत अच्छी तरह से काम नहीं कर रहा है क्योंकि अगर मैं संक्रमण के अंत में सुन रहा हूं तो यह उस तत्व के अंदर किसी भी संक्रमण अंत में ट्रिगर होगा।

मुझे इसके साथ कुछ मदद की ज़रूरत होगी, मैं केवल कोणीय के साथ बूटस्ट्रैप को ढीला कैसे लिख सकता हूं? मुझे उन घटनाओं की आवश्यकता नहीं है जो बूटस्ट्रैप को shown, hidden या show, hide पर पसंद करते हैं, मुझे संक्रमण के साथ तत्व का एक सरल पतन ट्रिगर करने की आवश्यकता है और मेरे तत्वों को गतिशील गति रखने की आवश्यकता है (अन्यथा निश्चित ऊंचाई नहीं है, अन्यथा मैं पतन प्राप्त करने के लिए बस सीएसएस का उपयोग करूंगा)। मुझे बस सही दिशा में pinpointed की जरूरत है :)

उत्तर

7

ऐसा लगता है कि आप CSS3 संक्रमण के साथ कुछ तोड़ना चाहते हैं?

अच्छा, आप ऐसा कर सकते हैं, लेकिन नियंत्रक ऐसा करने के लिए गलत जगह है। आपको निर्देशों या कस्टम निर्देश में ऐसा करना चाहिए। सौभाग्य से, आप इसे एनजी-क्लास जैसे कोणीय मूल निर्देशों के साथ कर सकते हैं।

HTML:

<button ng-click="open = !open">Toggle</button>  
<div ng-class="{ showMe: open }" class="collapsable"> 
    <h3>This should collapse</h3> 
</div> 

और सबसे महत्वपूर्ण बात, अपने सीएसएस:

.collapsable { 
    display: inline-block; 
    overflow: hidden; 
    height: 0; 
    transition: height 1s; 
    -webkit-transition: height 1s;   
    -moz-transition: height 1s;   
    -o-transition: height 1s;   
    } 
    .collapsable.showMe { 
    height: 100px; 
    } 

And here is a plunker of it working.

महत्वपूर्ण, ध्यान दें CSS3 के संक्रमण सभी ब्राउज़रों में काम नहीं करेगा करने के लिए। विशेष रूप से आईई में। अंत में, मुझे लगता है कि आप शायद एक प्लगइन का उपयोग करके बेहतर हो जाएंगे जो किसी और ने पहले ही बनाया है, और फिर इसे एक कस्टम निर्देश में लेवरेज किया है जो कुछ बूलियन मान देखता है।

मुझे उम्मीद है कि इससे मदद मिलती है।


संपादित

height: auto (कम से कम इस पोस्ट के समय के रूप में) सीएसएस संक्रमण के साथ काम नहीं करता। तो, यही कारण है कि आप पहिया को फिर से शुरू करने के बजाय, किसी और की प्लगइन का उपयोग करना चाहेंगे। भले ही यह सिर्फ JQuery की एनिमेट() विधि है। अपने स्वयं के निर्देश रोलिंग के लिए छद्म-कोड इसलिए की तरह कुछ होगा: (आप JQuery का उपयोग कर रहे मानते हुए)

app.directive('collapseWhen', function() { 
    return function(scope, elem, attr) { 
    scope.$watch(attr.collapseWhen, function(val) { 
     var clone = elem.clone().appendTo('body'); 
     var h = clone.height(); 
     clone.remove(); 
     scope.animate({ height: (val ? h : 0) + 'px' }, 1000); 
    } 
    } 
}); 

और फिर आप इसे पसंद का उपयोग करेंगे:

<button ng-click="foo = !foo">Toggle</button> 
<div collapse-when="foo"> 

फिर से, उपर्युक्त psuedo-code है, मुझे नहीं पता कि यह काम करेगा या नहीं, अगर आप वास्तव में अपना खुद का रोल करना चाहते हैं तो यह आपको एक विचार देने के लिए है।

+0

मैं अपने विवरण, 'collapsable.showMe {ऊंचाई में उल्लेख किया है लिंक में है: 100px; } ', ऊंचाई 'ऑटो' होनी चाहिए, इसलिए मेरी सामग्री ऊंचाई गतिशील हो सकती है, क्योंकि अधिक तत्वों को बाद में जोड़ा जा सकता है ... – Roland

+0

यही कारण है कि आप किसी और की प्लगइन का उपयोग करना चाहेंगे। आपको क्या करना होगा जावास्क्रिप्ट के साथ अपनी आंतरिक सामग्री की ऊंचाई की जांच करें, और फिर उस ऊंचाई को फ्लाई पर सीएसएस के साथ सेट करें। मैं जानता हूं कि किसी भी ब्राउज़र में 'ऑटो' सीएसएस संक्रमण के साथ काम नहीं करता है। –

+0

क्या मैंने अभी वर्णन में क्या कहा था? जब मैं सीएसएस संक्रमण चाहता हूं तो ऑटो ऊंचाई होने पर इस मामले में काम नहीं करेगा। इसलिए मैं पहली बार ऊंचाई निर्धारित करने की कोशिश कर रहा था और फिर 'कक्षा' को जोड़ता हूं जिसमें ऊंचाई: ऑटो' है। बस संक्रमणित अंत पर उपयोग करने से काम नहीं करेगा। तत्व की ऊंचाई प्राप्त करने से कक्षा 'पतन' सेट के बाद से यह '0px' तक काम करेगा। इसलिए यही कारण है कि मैं यहां पूछ रहा हूं कि बूटस्ट्रैप की घटनाओं के बिना ऐसा करने का कोई तरीका है और केवल पतन हो। – Roland

1

रोलैंड, कोणीय-UI टीम से Bootstrap Project पर एक नज़र डालें।

+0

मुझे पहले से ही इसके बारे में पता है;) accordion मेरी ज़रूरतों को पूरा नहीं करता है, मुझे करना है मार्कअप में कहीं से भी पतन ट्रिगर करने में सक्षम हो, इस मामले में बूटस्ट्रैप प्रोजेक्ट में एक निर्देश है जो उसमें शामिल है लेकिन आप निर्देश संदर्भ के बाहर अपना ट्रिगर नहीं कर सकते हैं – Roland

2

यदि मैं प्रश्नों को समझता हूं, तो मेरा समाधान कोणीय $ animateCss का उपयोग करना है। यहां दस्तावेज़ और उदाहरण https://docs.angularjs.org/api/ngAnimate/service/ $ एनिमेट सीएसएस

$ animateCss सेवा के साथ आप ngAnimate का उपयोग करके अपना स्वयं का एनीमेशन बना सकते हैं। यह कोणीय मॉड्यूल का एक उदाहरण है। डेमो नीचे

var AppModule = angular.module('myApp', ['ngAnimate']) 
    .controller('collapseCtrl', ['$scope', function($scope) { 
    $scope.btn1 = $scope.btn2 = $scope.btn3 = false; 
    }]).animation('.my-collapse', ['$animateCss', function($animateCss) { 
    return { 
     enter: function(element, doneFn) { 
     var height = element[0].offsetHeight; 
     return $animateCss(element, { 
      from: { 
      height: '0px', 
      overflow: 'hidden' 
      }, 
      to: { 
      height: height + 'px' 
      }, 
      cleanupStyles: true, 
      duration: 0.3 // one second 
     }); 
     }, 
     leave: function(element, doneFn) { 
     var height = element[0].offsetHeight; 
     return $animateCss(element, { 
      to: { 
      height: '0px', 
      overflow: 'hidden' 
      }, 
      from: { 
      height: height + 'px' 
      }, 
      cleanupStyles: true, 
      duration: 0.3 // one second 
     }); 
     } 
    }; 
    }]); 

https://plnkr.co/edit/DjU1A2vmiBB1dYXjkiN1

+0

जबकि यह लिंक प्रश्न का उत्तर दे सकता है, तो यह बेहतर है कि इसमें शामिल होना बेहतर है यहां उत्तर के आवश्यक भाग और संदर्भ के लिए लिंक प्रदान करते हैं। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/12532441) – DhiaTN

+0

मैंने एक उदाहरण के साथ जवाब संपादित किया। – user3083618