2013-09-03 7 views
10

मेरे पास आईडी = 'मेनमेनू' के साथ div है। मैं बटन क्लिक के बाद जावास्क्रिप्ट द्वारा CSS3 संक्रमण जोड़ रहा हूं (#mainmenu में 'संक्रमण' जोड़कर और कक्षा बनाकर। Fadein और .fadeout जिसे div तत्व में जोड़ा जाएगा)। कोड:जावास्क्रिप्ट डिस्प्ले CSS3 एनीमेशन के बाद कोई नहीं

<div id='mainmenu'></div> 
<button id="btn1">Click me1</button> 
<button id="btn2">Click me2</button> 

#mainmenu { 
    width:100px; 
    height:100px; 
    background:#eee; 
    -webkit-transition: opacity 1s; 
    -moz-transition: opacity 1s; 
    transition: opacity 1s; 
} 

.fadeout { 
    opacity:0; 
} 
.fadein { 
    opacity:1; 
} 


var menu = document.getElementById('mainmenu'), 
    btn1 = document.getElementById('btn1'), 
    btn2 = document.getElementById('btn2'); 

btn1.addEventListener('click', function() { 
    menu.className = 'fadeout'; 
} 
btn2.addEventListener('click', function() { 
    menu.className = 'fadein'; 
} 

समस्या यह है कि अब मैं डिस्प्ले को जोड़ना चाहता हूं और फीडआउट और फेडेन विकल्प को ब्लॉक करना चाहता हूं। तो बाद fadeout एनीमेशन div प्रदर्शन से कोई भी मिलना चाहिए, और प्रदर्शन ब्लॉक fadein के बाद:

btn1.addEventListener('click', function() { 
    menu.className = 'fadeout'; 
    menu.style.display = 'none'; 
} 
btn2.addEventListener('click', function() { 
    menu.className = 'fadein'; 
    menu.style.display = 'block'; 
} 

दुर्भाग्य से, प्रदर्शन कोई और ब्लॉक एनीमेशन के साथ निष्पादित करता है, तो एनीमेशन काम नहीं कर रहा (तत्व, प्रदर्शन कोई भी हो जाता है बिना अस्पष्टता एनीमेशन)। मैं पहले अस्पष्टता के साथ एनीमेशन चाहता हूं, और उसके बाद तत्व के लिए कोई भी ब्लॉक/ब्लॉक नहीं करता है। इसे करने का कोई तरीका है? मैं केवल शुद्ध जावास्क्रिप्ट (कोई jQuery आदि) का उपयोग कर सकते हैं।

+0

आप कोड के साथ एक fiddle.js जोड़ने कृपया सकते हैं।? – jayM

उत्तर

8

आप क्रम में menu.style.display = "none"; साथ setTimeout() उपयोग करने के लिए फीका होने देना होता है यह काम है इससे पहले कि आप style.display को गति प्रदान करते हैं।

btn1.addEventListener('click', function() { 
    menu.className = 'fadeout'; 
    setTimeout(function() { 
     $(menu).css('display', 'none'); 
    }, 1000); 
} 
btn2.addEventListener('click', function() { 
    menu.className = 'fadein'; 
    setTimeout(function() { 
     $(menu).css('display', 'block'); 
    }, 1000); 
} 
+0

एक छोटी सी समस्या है - जब आपके पास setTimeout (फ़ंक्शन (मेनू) {}) में 'मेनू' है, तो कंसोल 'अपरिभाषित' की 'संपत्ति नहीं पढ़ सकता' शैली दिखाता है। फ़ंक्शन से 'मेनू' को हटाने से उस समस्या को ठीक किया जाएगा। मदद के लिए शुक्रिया। – Amay

+0

बेशक, इस बारे में हिचकिचाहट है कि किसी सेकेंड के लिए पहली बार शामिल करना है और गलती हुई है – bogatyrjov

+0

कौन सा ब्राउज़र समर्थन करता है इसके बारे में उत्सुक है। छुपाएं() /। शो() - क्रोम में आपको 'अनकॉल्ड टाइप एरर: ऑब्जेक्ट # कोई विधि नहीं है 'छुपाएं' – dc5

11

मैं यहां गलत हो सकता हूं, हालांकि मुझे विश्वास है कि आपको एक संक्रमण-अंत ट्रिगर जोड़ने की आवश्यकता है जो प्रदर्शन करता है: ब्लॉक/डिस्प्ले: कोई भी परिवर्तन नहीं।

देखें: CSS3 transition events

1

एक संभावना transition-delay का उपयोग करना है। मैं इसे करने की कोशिश नहीं की है, लेकिन निम्नलिखित पर्याप्त हो सकता है:

.fadeout { 
    opacity:0; 
} 
.fadein { 
    opacity:1; 
    display: block; 
} 
.afterFadeOut { 
    transition-delay: 1s; 
    display: none; 
} 

और उसके बाद के लिए बाहर fading के लिए अपने वर्ग बदलने के लिए:

menu.className = 'fadeout afterFadeOut'; 

कि स्वचालित रूप से एक दूसरे के लिए display: none, के लिए पर्याप्त देरी चाहिए अस्पष्टता नीचे फीका है।

5

मैं कुछ मामलों के लिए प्रदर्शित करने के बजाय ऊंचाई 0 का उपयोग करता हूं लेकिन यह आपकी आवश्यकता के लिए लागू हो सकता है या नहीं भी हो सकता है।

1) संक्रमण का उपयोग करना (jQuerys fadeOut तरह दिखता है):

.fadeOut{ 
    opacity : 0; 
    height : 0; 
    transition : opacity 800ms, height 0 800ms; 
} 

क्या आप 0 भी चौड़ाई जोड़ सकते हैं चाहते हैं, तो वैसे भी यहाँ कोड है।

.fadeOut{ 
    opacity : 0; 
    width : 0; 
    height : 0; 
    transition : opacity 800ms, height 0 800ms, width 0 800ms; 
} 

2) का उपयोग करते हुए एनिमेशन (यह काम करता है, लेकिन बदलाव के लिए बेहतर है):

.fadeOut{ 
    animation : fadeout 800ms linear forwards; 
} 
@keyframes fadeout{ 
    99%{ 
    opacity : 0; 
    height : initial; 
    } 
    100%{ 
    opacity : 0; 
    height : 0; 
    } 
} 
+0

ओह! यह 'ऊंचाई: 0' का उपयोग करने के लिए बहुत ही स्मार्ट है ताकि आप तर्क को सीएसएस के साथ रख सकें जहां यह संबंधित है। मैं इसे 'मैं कर रहा हूँ! –

+1

ध्यान दें कि यह एक एक्सेसिबिलिटी समस्या हो सकती है। 'डिस्प्ले के बजाय 'ऊंचाई: 0' का उपयोग करते समय सामग्री सहायक तकनीक के लिए उपलब्ध होगी: कोई भी नहीं' – user729928

+0

मुझे लगता है कि यह सच है। Https://snook.ca/archives/html_and_css/hiding-content-for- पहुंच पढ़ने पर विचार करें –

3

हालांकि यह एक पुराने पोस्ट, भविष्य आगंतुक की खातिर है, तो आप transitionend घटना का उपयोग कर सकते हैं। आप उपयोग कर सकते हैं:

/*For when object has fully faded*/ 
 
menu.addEventListener("transitionend", function() { 
 
    if (this.className == "fadeout") { 
 
    this.style.display = "none"; 
 
    } 
 
}.bind(menu)); 
 

 
/*Show before animation starts*/ 
 
menu.addEventListener("click", function() { 
 
    this.style.display = "block"; 
 
}.bind(menu));

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