सीएसएस प्रदर्शन संपत्ति पर संक्रमण


1445

मैं वर्तमान में CSS 'मेगा ड्रॉपडाउन' मेनू तैयार कर रहा हूं - मूल रूप से एक नियमित सीएसएस-केवल ड्रॉपडाउन मेनू, लेकिन एक जिसमें विभिन्न प्रकार की सामग्री होती है।

फिलहाल, यह है कि सीएसएस 3 संक्रमण 'प्रदर्शन' संपत्ति के लिए लागू नहीं दिखाई देता है , यानी, आप से संक्रमण के किसी भी प्रकार नहीं कर सकते display: noneकरने के लिए display: block(या किसी भी संयोजन)।

क्या उपरोक्त उदाहरण से 'फीका' होने के लिए दूसरे स्तर के मेनू का कोई तरीका है जब कोई शीर्ष मेनू मेनू आइटमों में से किसी एक पर हो सकता है?

मुझे पता है कि आप visibility:संपत्ति पर संक्रमण का उपयोग कर सकते हैं, लेकिन मैं प्रभावी ढंग से उपयोग करने का तरीका नहीं सोच सकता।

मैंने भी ऊंचाई का उपयोग करने की कोशिश की है, लेकिन यह सिर्फ बुरी तरह से विफल रहा है।

मुझे यह भी पता है कि जावास्क्रिप्ट का उपयोग करके इसे हासिल करना तुच्छ है, लेकिन मैं खुद को सीएसएस का उपयोग करने के लिए चुनौती देना चाहता था, और मुझे लगता है कि मैं थोड़ा कम कर रहा हूं।


यदि आप प्रदर्शन के बजाय इसे अस्पष्टता संपत्ति पर लागू करते हैं, तो क्या सीएसएस संक्रमण काम करता है?
पॉल डी। वेट

13
स्थिति: निरपेक्ष; दृश्यता: छिपी हुई; प्रदर्शन के समान है: कोई नहीं;
जावद

8
@ जवाद: केवल अगर आप कुछ के z-index:0साथ भी जोड़ते हैं ।
दानमेन

7
@ जवाद: इसका उपयोग visibility: hiddenतब तक कभी न करने की सलाह दी जाती है जब तक कि आप स्क्रीन्रेडर्स इसे नहीं पढ़ना चाहते (जबकि विशिष्ट ब्राउज़र नहीं होंगे)। यह केवल तत्व की दृश्यता को परिभाषित करता है (जैसे कहना opacity: 0), और यह अभी भी चयन करने योग्य है, क्लिक करने योग्य है, और जो भी इसका उपयोग करता था; यह अभी दिखाई नहीं दे रहा है।
वन काट्स

1
pointer-eventsIE 8,9,10 में कोई समर्थन नहीं है , इसलिए यह हमेशा ठीक नहीं होता है
स्टीवन प्रिबिलिनस्की

जवाबों:


1350

आप दो बदलाव या अधिक स्थानांतरित कर सकते हैं, और visibilityइस बार काम आता है।

div {
  border: 1px solid #eee;
}
div > ul {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity 0.5s linear;
}
div:hover > ul {
  visibility: visible;
  opacity: 1;
}
<div>
  <ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
  </ul>
</div>

(विक्रेता को transitionसंपत्ति के लिए उपसर्ग न भूलें ।)

अधिक विवरण इस लेख में हैं


10
यह उत्तर दूसरों की तुलना में कम काम की तरह लगता है और यह प्रदर्शित करता है कि हम प्रदर्शन से क्या उम्मीद करेंगे: कोई नहीं / ब्लॉक; धन्यवाद। मुझे एक टन समय बचा लिया।
ब्रेंडन

21
हाँ, इसके साथ समस्या यह है कि इसके पीछे कुछ भी दिखाई देगा भले ही यह दिखाई न दे। मैंने ऊंचाई का उपयोग करते हुए पाया: 0 बहुत बेहतर समाधान
जोश बेडो

739
यह अच्छा है, लेकिन समस्या यह है कि "दृश्यता छिपे हुए" तत्व अभी भी अंतरिक्ष पर कब्जा कर रहे हैं, जबकि "प्रदर्शन कोई नहीं" नहीं करता है।
रुई मरकज

41
मैं शायद कुछ याद कर रहा हूं, लेकिन आप दृश्यता और अस्पष्टता दोनों को क्यों बदलते हैं? तत्व को छिपाने के लिए अपारदर्शिता को सेट नहीं करना होगा - आपको दृश्यता को छिपे हुए पर भी सेट करने की आवश्यकता क्यों है?
GMA

21
@GeorgeMillo यदि आप केवल अस्पष्टता निर्धारित करते हैं, तो तत्व वास्तव में पेज रेंडरिंग पर है (आप उदाहरण के लिए सोचा नहीं जा सकता)।
एड्रिएन्डेनैट

800

इस कार्य को करने के लिए आपको अन्य माध्यमों से तत्व को छिपाने की आवश्यकता है।

मैं <div>पूरी तरह से दोनों की स्थिति के प्रभाव को पूरा करता है और छिपे हुए को स्थापित करता हूं opacity: 0

तुम भी टॉगल हैं displayसे संपत्ति noneके लिए block, अन्य तत्वों पर अपने संक्रमण घटित नहीं होगा।

इसके चारों ओर काम करने के लिए, हमेशा तत्व की अनुमति दें display: block, लेकिन इनमें से किसी भी साधन को समायोजित करके तत्व को छिपाएं:

  1. सेट heightकरने के लिए 0
  2. सेट opacityकरने के लिए 0
  3. दूसरे तत्व के फ्रेम के बाहर तत्व को रखें overflow: hidden

अधिक समाधान होने की संभावना है, लेकिन यदि आप तत्व को टॉगल करते हैं तो आप संक्रमण नहीं कर सकते display: none। उदाहरण के लिए, आप कुछ इस तरह की कोशिश कर सकते हैं:

div {
    display: none;
    transition: opacity 1s ease-out;
    opacity: 0;
}
div.active {
    opacity: 1;
    display: block;
}

लेकिन वह काम नहीं करेगा । अपने अनुभव से, मुझे यह कुछ भी नहीं करने के लिए मिला है।

इस वजह से, आपको हमेशा तत्व रखने की आवश्यकता होगी display: block- लेकिन आप कुछ इस तरह से कर सकते हैं:

div {
    transition: opacity 1s ease-out;
    opacity: 0;
    height: 0;
    overflow: hidden;
}
div.active {
    opacity: 1;
    height: auto;
}

29
जिम पूरी तरह से उत्तर के लिए धन्यवाद। आप इस तथ्य के बारे में बिल्कुल सही हैं कि यदि प्रदर्शन: संपत्ति बिल्कुल बदल जाती है, तो आपके सभी संक्रमण काम नहीं करेंगे। जो एक शर्म की बात है - मुझे आश्चर्य है कि इसके पीछे तर्क क्या है। एक साइड नोट पर, उसी लिंक पर जिसे मैंने मूल प्रश्न में पोस्ट किया था, आप देख सकते हैं कि मैं इसके साथ कहां हूं। Chrome में मेरी एकमात्र (छोटी) समस्या है [5.0.375.125] जब पृष्ठ लोड होता है, तो आप मेनू को जल्दी से लुप्त होते देख सकते हैं क्योंकि पृष्ठ पर तत्व लोड होते हैं। फ़ायरफ़ॉक्स 4.0b2 और सफारी 5.0 बिल्कुल ठीक हैं ... बग या कुछ मैं याद किया है?
रिचर्डटैप

7
मैं सहमत हूं कि यह सही है और इसमें योगदान देगा; भविष्य के यात्रियों के लिए एक सिर। मुझे Chrome में एक कार्यशील समाधान मिला, लेकिन मैंने पाया कि यह iPhone 4 पर विफल रहता है: visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out;न केवल यह सही तरीके से संक्रमण नहीं करता है, लेकिन लक्ष्य तत्व कभी भी समाप्त नहीं होगा। QA आपको, मुझे और आपकी माँ को विफल कर देगा।
सिंपलजी

1
आप वास्तव में दृश्यता संपत्ति को भी बदल सकते हैं .. बस कह रहे हैं
Cu7l4ss

2
यदि आप अपनी छिपी हुई स्थिति को निर्धारित करते हैं height: 0;और उसे संक्रमित नहीं करते हैं, तो संक्रमण काम नहीं करेगा। मैंने इसे केवल अस्पष्टता को बदलने की कोशिश की। मैं दूर करने के लिए किया थाheight: 0;
chovy

10
आपने अभी overflow: hiddenबहुत धन्यवाद के कारण वोट जीता है !
थियागोह

277

यदि आप displayसंपत्ति को बदलने का प्रयास करते हैं तो इस पोस्ट के समय सभी प्रमुख ब्राउज़र CSS बदलावों को अक्षम कर देते हैं, लेकिन CSS एनिमेशन अभी भी ठीक काम करते हैं इसलिए हम उन्हें वर्कअराउंड के रूप में उपयोग कर सकते हैं।

उदाहरण कोड (आप इसे अपने मेनू में तदनुसार लागू कर सकते हैं) डेमो :

अपनी स्टाइलशीट में निम्नलिखित सीएसएस जोड़ें:

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}
@keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

फिर fadeInमूल होवर (और निश्चित रूप से सेट display: block) पर बच्चे को एनीमेशन लागू करें :

.parent:hover .child {
    display: block;
    -webkit-animation: fadeIn 1s;
    animation: fadeIn 1s;
}

अद्यतन 2019 - विधि जो लुप्त होती का भी समर्थन करती है:

(कुछ जावास्क्रिप्ट कोड की आवश्यकता है)

// We need to keep track of faded in elements so we can apply fade out later in CSS
document.addEventListener('animationstart', function (e) {
  if (e.animationName === 'fade-in') {
      e.target.classList.add('did-fade-in');
  }
});

document.addEventListener('animationend', function (e) {
  if (e.animationName === 'fade-out') {
      e.target.classList.remove('did-fade-in');
   }
});
div {
    border: 5px solid;
    padding: 10px;
}

div:hover {
    border-color: red;
}

.parent .child {
  display: none;
}

.parent:hover .child {
  display: block;
  animation: fade-in 1s;
}

.parent:not(:hover) .child.did-fade-in {
  display: block;
  animation: fade-out 1s;
}

@keyframes fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes fade-out {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
  }
}
<div class="parent">
    Parent
    <div class="child">
        Child
    </div>
</div>


3
इसके लिए धन्यवाद। height: 0ऊपर बताई गई ट्रिक (संक्रमण के लिए) काम नहीं करती है क्योंकि ऊँचाई फीका होने वाले संक्रमण पर 0 पर सेट हो जाती है, लेकिन यह चाल ठीक काम करने लगती है।
इलियट विंकलर

41
धन्यवाद, बहुत उपयोगी है। लेकिन इसे कैसे मिटाना है?
इलियू

1
इस उत्तर के पहले पैराग्राफ का कोई मतलब नहीं है। ब्राउज़र्स केवल उसी क्षण सभी संक्रमणों को अक्षम नहीं करते हैं जब आप displayसंपत्ति का उपयोग करते हैं - वास्तव में कोई कारण नहीं है। और अगर उन्होंने किया भी , तो एनिमेशन क्यों काम करेगा? आप displayसीएसएस एनिमेशन में संपत्ति का उपयोग नहीं कर सकते ।
BoltClock

7
सर्वोत्तम उत्तर, बदलाव के साथ संभव नहीं है, लेकिन एनिमेशन के साथ हाँ।
मिकेल

6
कैसे रिवर्स एनीमेशन के बारे में, कि जब तत्व धीरे-धीरे गायब हो जाना चाहिए?
ग्रीन

77

मुझे लगता है कि कारण है कि संक्रमण विकलांग अगर कर रहे हैं displayकि क्या प्रदर्शित करता है वास्तव में बदल गया है की वजह से है। यह ऐसा कुछ भी नहीं बदलता है जो गर्भधारण करने में आसानी से एनिमेटेड हो सकता है।

display: none;और visibility: hidden;दो पूरी तरह से अलग चीजें हैं।
दोनों तत्व अदृश्य बनाने का प्रभाव है, लेकिन साथ visibility: hidden;यह अभी भी लेआउट में प्रदान की गई है, लेकिन अभी नहीं दिख तो।
छिपे हुए तत्व अभी भी जगह लेता है, और अभी भी इनलाइन या एक ब्लॉक या ब्लॉक-इनलाइन या टेबल के रूप में या जो कुछ भी displayतत्व इसे प्रस्तुत करने के लिए कहता है, और उसके अनुसार जगह लेता है।
अन्य तत्व स्वचालित रूप से उस स्थान पर कब्जा करने के लिए आगे नहीं बढ़ते हैं। छिपा हुआ तत्व अपने वास्तविक पिक्सेल को आउटपुट के लिए प्रस्तुत नहीं करता है।

display: noneदूसरी ओर वास्तव में तत्व को पूरी तरह से प्रस्तुत करने से रोकता है । यह किसी भी लेआउट स्थान को नहीं लेता है। अन्य तत्व जो इस तत्व द्वारा उठाए गए कुछ या सभी स्थान पर कब्जा कर चुके हैं, अब उस स्थान पर कब्जा करने के लिए समायोजित करते हैं, जैसे कि तत्व बस मौजूद नहीं था

displayकेवल एक और दृश्य विशेषता नहीं है।
यह तत्व की पूरी प्रतिपादन मोड, स्थापित करता है जैसे कि यह एक block, inline, inline-block, table, table-row, table-cell, list-item, या जो कुछ भी!
उनमें से प्रत्येक के पास बहुत अलग लेआउट में बदलाव हैं, और उन्हें चेतन या सुचारू रूप से संक्रमण करने का कोई उचित तरीका नहीं होगा ( उदाहरण के blockलिए inlineया इसके विपरीत से एक चिकनी संक्रमण की कल्पना करने की कोशिश करें !)।

यही कारण है कि यदि परिवर्तन परिवर्तित होते हैं, तो भी परिवर्तन अक्षम होते हैं (भले ही परिवर्तन के लिए या से है none- noneकेवल अदर्शन नहीं है, यह इसका अपना तत्व रेंडरिंग मोड है जिसका मतलब है कि कोई प्रतिपादन नहीं!)।


8
उपर्युक्त समाधान जितना अच्छा हो सकता है, यह समझदार स्पष्टीकरण प्राप्त करने के लिए बहुत संतोषजनक था क्योंकि संक्रमण विशेषताओं को प्रदर्शित करने के लिए संक्रमण क्यों लागू नहीं होते हैं।
kqr

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

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

2
ट्रिनिको: डिस्प्ले: कोई भी तत्व के आकार को 0 x 0 के आयत में नहीं बदलता है - यह इसे DOM से हटा देता है। आप आयत से एक बिंदु तक चौड़ाई और ऊँचाई गुणों को शून्य करके एनिमेट कर सकते हैं और फिर अन्य तत्व इसके चारों ओर प्रवाहित होंगे जैसे कि इसमें 'डिस्प्ले: कोई नहीं' लेकिन इसकी 'डिस्प्ले' विशेषता 'ब्लॉक' रहेगी; तत्व अभी भी DOM में है। प्रदर्शन: ब्लॉक और डिस्प्ले के बीच की एनिमेशन की अवधारणा: कोई भी हास्यास्पद नहीं है: कोई मध्यवर्ती राज्य नहीं हैं। एक तत्व या तो डोम में मौजूद है या यह कोई फर्क नहीं पड़ता कि यह कितना छोटा या अदृश्य है।
स्टीव थॉर्प

1
यह असतत गुणों को चेतन करने के लिए हास्यास्पद नहीं है। अन्य गुणों की तरह असतत गुणों को displayसुचारू रूप से परिवर्तित नहीं किया जा सकता है, लेकिन इसका मतलब यह नहीं है कि समय महत्वपूर्ण नहीं है। नियंत्रित करने में सक्षम होने के नाते जब से संक्रमण disply:blockके लिए display:noneहोता है बहुत महत्वपूर्ण है। जैसे @CurtisYallop ने इसका वर्णन किया। अगर मैं से संक्रमण के लिए चाहते opacity:1करने के लिए opacity:0और उसके बाद परिवर्तन display:blockकरने के लिए display:noneमैं यह करने के लिए सक्षम होना चाहिए।
जेन्स

55

कॉलबैक के बजाय, जो CSS में मौजूद नहीं है, हम transition-delayसंपत्ति का उपयोग कर सकते हैं।

#selector {
    overflow: hidden; // Hide the element content, while height = 0
    height: 0; opacity: 0;
    transition: height 0ms 400ms, opacity 400ms 0ms;
}
#selector.visible {
    height: auto; opacity: 1;
    transition: height 0ms 0ms, opacity 600ms 0ms;
}

तो, यहाँ क्या हो रहा है?

  1. जब visibleवर्ग जोड़ा जाता है, दोनों heightऔर opacityदेरी के बिना एनीमेशन शुरू (0 एमएस), हालांकि heightपूरा एनीमेशन 0 एमएस (के बराबर लेता है display: block) और opacity600 एमएस लेता है।

  2. जब visibleकक्षा को हटा दिया जाता है, तो opacityएनीमेशन शुरू होता है (0 एमएस विलंब, 400 एमएस अवधि), और ऊंचाई 400 एमएस प्रतीक्षा करता है और उसके बाद ही तुरंत (0 एमएस) प्रारंभिक मूल्य ( display: noneएनीमेशन कॉलबैक के बराबर) को पुनर्स्थापित करता है ।

ध्यान दें, यह दृष्टिकोण उपयोग करने वाले लोगों की तुलना में बेहतर है visibility। ऐसे मामलों में, तत्व अभी भी पृष्ठ पर स्थान रखता है, और यह हमेशा उपयुक्त नहीं होता है।

अधिक उदाहरणों के लिए कृपया इस लेख को देखें ।


8
आश्चर्य की बात यह है कि अधिक upvotes नहीं है - यह चतुर समाधान किसी तरह पूरी तरह से काम करता है।
धूमधाम से

3
यह केवल उसी के साथ काम करता है height:100%जो कुछ मामलों में लेआउट को नष्ट कर सकता है। महान समाधान, अगर यह एक समस्या नहीं है। कुछ द्विदिश काम करने वालों में से एक।
फेबियन वॉन एलर्ट्स

यह भी खूब रही! मैं अपने मामले में इसे और भी सरल बनाने में सक्षम था क्योंकि मैं चाहता था कि फीका-आउट एनीमेशन समय फीका-समय के समान हो। उपयोग करने के बजाय transition: height 0ms 0ms, opacity 600ms 0ms, मैंने अभी उपयोग किया है transition-delay: 0s
जैकब लॉकार्ड

52

display संक्रमण में काम करने वाले गुणों में से एक नहीं है।

सीएसएस गुणों की सूची के लिए एनिमेटेबल सीएसएस गुण देखें जो उन पर लागू संक्रमण हो सकते हैं। सीएसएस मान और इकाइयां देखें मॉड्यूल स्तर 4, संयोजन मान: वे कैसे प्रक्षेपित होते हैं , इसके लिए प्रक्षेप, जोड़ और संचय

सीएसएस 3 तक 9.1 में सूचीबद्ध किया गया था CSS से गुण (बस चेतावनी पॉपअप बंद करें)

मैंने भी ऊंचाई का उपयोग करने की कोशिश की है, लेकिन यह सिर्फ बुरी तरह से विफल रहा है।

पिछली बार जब मुझे ऐसा करना पड़ा, तो मैंने max-heightइसके बजाय इस्तेमाल किया, जो एक एनिमेटेबल प्रॉपर्टी है (हालाँकि यह थोड़ा हैक था, यह काम किया), लेकिन खबरदार कि यह कॉम्प्लेक्स पेज या यूज़र्स के लिए बहुत ही जानदार हो सकता है, जिसमें लो-एंड मोबाइल हो उपकरण।


लिंक अब सीधे एनिमेट करने योग्य गुण अनुभाग की ओर इशारा नहीं करता है।
एंड्रयू लैम

1
@AndrewLam फिक्स्ड। धन्यवाद।
रोबोकट

34

अब आप ब्लॉक प्रॉपर्टी में एक कस्टम एनीमेशन जोड़ सकते हैं।

@keyframes showNav {
  from {opacity: 0;}
  to {opacity: 1;}
}
.subnav-is-opened .main-nav__secondary-nav {
  display: block;
  animation: showNav 250ms ease-in-out both;
}

डेमो

इस डेमो में उप-मेनू से परिवर्तन होता display:noneहै display:blockऔर फिर भी फीका पड़ जाता है।


यहाँ होना myfirstचाहिए showNav? और फ़ायरफ़ॉक्स के बारे में क्या? दुर्भाग्य से मैं आपके द्वारा बताए गए डेमो पेज पर संबंधित कुछ नहीं पा सकता हूं।
सेबस्टियन उल मीर

थैंक्स @SebastianG मैंने सुधार किया है और ऊपर कुछ और जानकारी जोड़ी है।
मनीष प्रधान

@ सेबेस्टियन वोम मीर: पुराने फ़ायरफ़ॉक्स संस्करणों को "-मोज़-" विक्रेता उपसर्ग की आवश्यकता है, संपादित कोड देखें
Herr_Schwabullek

23
जब तक मुझे कुछ याद नहीं आ रहा है "डेमो" लिंक अब उप-मेनू संक्रमण नहीं दिखाता है।
यथार्थवादी

1
किसी चीज़ के लिए सही संक्रमण जो कि कोई स्थान नहीं रखता है (जैसा कि प्रदर्शन के साथ होता है: कोई नहीं) अंतरिक्ष में रहने वाली चीज़ (प्रदर्शन: ब्लॉक), आयामों का विस्तार है, न कि फीका-इन। यदि दृश्यता छिपी हुई होती है (जो स्थान घेरती है, लेकिन दृश्यमान नहीं है) तो दृश्यमान होती है, तो आकार समान रहता है और फीका होना उचित है। इनमें से कोई भी उत्तर समस्या का समाधान नहीं करता है।
त्रिकोको

21

W3C वर्किंग ड्राफ्ट के अनुसार 19 नवंबर 2013display एक एनिमेटेबल प्रॉपर्टी नहीं है । सौभाग्य से, visibilityएनिमेटेबल है। आप अपारदर्शिता ( JSFiddle ) के संक्रमण के साथ इसके संक्रमण की श्रृंखला बना सकते हैं :

  • HTML:

    <a href="http://example.com" id="foo">Foo</a>
    <button id="hide-button">Hide</button>
    <button id="show-button">Show</button>
  • सीएसएस:

    #foo {
        transition-property: visibility, opacity;
        transition-duration: 0s, 1s;
    }
    
    #foo.hidden {
        opacity: 0;
        visibility: hidden;
        transition-property: opacity, visibility;
        transition-duration: 1s, 0s;
        transition-delay: 0s, 1s;
    }
  • परीक्षण के लिए जावास्क्रिप्ट:

    var foo = document.getElementById('foo');
    
    document.getElementById('hide-button').onclick = function () {
        foo.className = 'hidden';
    };
    
    document.getElementById('show-button').onclick = function () {
        foo.className = '';
    };

ध्यान दें कि यदि आप लिंक को बिना सेटिंग के पारदर्शी बनाते हैं visibility: hidden, तो यह क्लिक करने योग्य रहेगा।


1
मुझे jsfiddle उदाहरण में कोई संक्रमण नहीं दिखता है
गीनो

@ चीन मैंने इसे बदलकर तय 0किया 0s। जाहिरा तौर पर, अतीत में उस ब्राउज़र का उपयोग किया गया था जिसका मैंने समर्थित यूनिटलेस शून्य बार परीक्षण किया था। हालांकि, यूनिटलेस बार W3C कैंडिडेट की सिफारिश का हिस्सा नहीं हैं , 29 सितंबर 2016
फेकली

इसे और बढ़ाना चाहिए। मैंने इसे सर्वश्रेष्ठ समाधानों में से एक पाया।
आर्थर तारासोव

यह काम कैसे होता है, इसे समझने के लिए देरी का उपयोग सबसे अच्छा तर्क है। चेतन, और छिपाना। अनहद, और चेतन। मेरे लिए सही समाधान
ब्रूको पिटेली गोंकोलेव्स

14

संपादित करें: प्रदर्शन कोई भी इस उदाहरण में लागू नहीं किया जा रहा है।

@keyframes hide {
  0% {
    display: block;
    opacity: 1;
  }
  99% {
    display: block;
  }
  100% {
    display: none;
    opacity: 0;
  }
}

ऊपर जो हो रहा है, वह यह है कि 99% एनीमेशन डिस्प्ले ब्लॉक करने के लिए सेट है, जबकि अपारदर्शिता फीकी पड़ जाती है। अंतिम क्षण में प्रदर्शन संपत्ति किसी के लिए भी सेट नहीं है।

और एनीमेशन-फिल-मोड: फॉरवर्ड का उपयोग करके एनीमेशन समाप्त होने के बाद सबसे महत्वपूर्ण बिट अंतिम फ्रेम को बनाए रखना है

.hide {
   animation: hide 1s linear;
   animation-fill-mode: forwards;
}

यहाँ दो उदाहरण हैं: https://jsfiddle.net/qwnz9tqg/3/


इस समाधान के साथ display: noneतब काम नहीं करता है?
बार्ट कैलिक्सो

Not एनीमेशन-फिल-मोड: फॉरवर्ड ’होना चाहिए - फॉरवर्ड’ नहीं
एलेक्स

संपादन में छह पात्र होने चाहिए और मैं केवल सुझाव दे सकता हूं इसलिए टिप्पणी संपादित करें
एलेक्स

1
@ अलेक्स ओके। टाइपो तय। मजे की बात यह है कि मेरा जवाब उम्मीद के मुताबिक भी काम नहीं करता है, लेकिन यह सोचना तर्कसंगत है कि ऐसा मैं तब तक करूंगा जब तक कि ब्राउज़र इसका समर्थन नहीं करेंगे।
पावेल

3
जैसा कि आप इस फिडल में शापर्स सेट के साथ देख सकते हैं, display: noneवास्तव में कभी लागू नहीं होता है। jsfiddle.net/3e6sduqh
10:18 बजे लुटेरा

13

मेरा साफ जावास्क्रिप्ट चाल पूरे परिदृश्य को दो अलग-अलग कार्यों में अलग करना है !

चीजों को तैयार करने के लिए, एक वैश्विक चर घोषित किया जाता है और एक घटना हैंडलर को परिभाषित किया जाता है:

  var tTimeout;
  element.addEventListener("transitionend", afterTransition, true);//firefox
  element.addEventListener("webkitTransitionEnd", afterTransition, true);//chrome

फिर, जब तत्व को छिपाते हुए, मैं कुछ इस तरह का उपयोग करता हूं:

function hide(){
  element.style.opacity = 0;
}

function afterTransition(){
  element.style.display = 'none';
}

तत्व को फिर से दिखाने के लिए, मैं कुछ इस तरह कर रहा हूं:

function show(){
  element.style.display = 'block';
  tTimeout = setTimeout(timeoutShow, 100);
}

function timeoutShow(){
  element.style.opacity = 1;
}

यह काम करता है, अब तक!


यह समय की देरी के कारण काम करता है और इसलिए नहीं कि जावास्क्रिप्ट कमांड अलग-अलग कार्यों में हैं। समय की देरी बहुत सारे मामलों में एक अच्छा समाधान प्रतीत होती है :)

10

मैं आज इसमें भाग गया, एक position: fixedमोडल के साथ जिसका मैं पुन: उपयोग कर रहा था। मैं इसे नहीं रख सका display: noneऔर फिर इसे चेतन कर दिया, क्योंकि यह सिर्फ उपस्थिति में कूद गया, और z-index(नकारात्मक मूल्यों आदि) ने अजीब चीजें भी कीं।

मैं भी एक height: 0का उपयोग कर रहा था height: 100%, लेकिन यह केवल तब काम किया जब मोडल दिखाई दिया। यह वैसा ही है जैसे आपने इस्तेमाल किया left: -100%या कुछ और।

तब इसने मुझ पर प्रहार किया कि एक सरल उत्तर था। वेटिला:

सबसे पहले, आपके छिपे हुए मोडल। सूचना heightहै 0, और heightसंक्रमण में घोषणा की जाँच करें ... यह एक है 500ms, जो मेरे opacityसंक्रमण से लंबा है । याद रखें, यह बाहर जाने वाले फीका-आउट संक्रमण को प्रभावित करता है: मोडल को उसकी डिफ़ॉल्ट स्थिति में लौटाता है।

#modal-overlay {
    background: #999;
    background: rgba(33,33,33,.2);
    display: block;
    overflow: hidden;
    height: 0;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    opacity: 0;
    z-index: 1;
    -webkit-transition: height 0s 500ms, opacity 300ms ease-in-out;
       -moz-transition: height 0s 500ms, opacity 300ms ease-in-out;
            -ms-transition: height 0s 500ms, opacity 300ms ease-in-out;
         -o-transition: height 0s 500ms, opacity 300ms ease-in-out;
        transition: height 0s 500ms, opacity 300ms ease-in-out;
}

दूसरा, आपका दृश्यमान मोडल। यदि आप एक स्थापित कर रहे हैं का कहना है कि .modal-activeकरने के लिए body। अब heightहै 100%, और मेरा परिवर्तन भी बदल गया है। मैं चाहता हूं कि heightतुरंत बदला जाए, और opacityलेने के लिए 300ms

.modal-active #modal-overlay {
    height: 100%;
    opacity: 1;
    z-index: 90000;
    -webkit-transition: height 0s, opacity 300ms ease-in-out;
       -moz-transition: height 0s, opacity 300ms ease-in-out;
        -ms-transition: height 0s, opacity 300ms ease-in-out;
         -o-transition: height 0s, opacity 300ms ease-in-out;
            transition: height 0s, opacity 300ms ease-in-out;
}

यही है, यह एक आकर्षण की तरह काम करता है।


वेंडर उपसर्ग गुणों को संरेखित करने की अपनी शैली के लिए अपवोटिंग
जॉर्ज ग्रीन

9

इनमें से कुछ उत्तरों और कुछ सुझावों को कहीं और से लेते हुए, निम्नलिखित हॉवर मेनू के लिए महान काम करता है (मैं बूटस्ट्रैप  3 के साथ इसका उपयोग कर रहा हूं , विशेष रूप से):

nav .dropdown-menu {
    display: block;
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    transition: max-height 500ms, opacity 300ms;
    -webkit-transition: max-height 500ms, opacity 300ms;
}
nav .dropdown:hover .dropdown-menu {
    max-height: 500px;
    opacity: 1;
    transition: max-height 0, opacity 300ms;
    -webkit-transition: max-height 0, opacity 300ms;
}

यदि आप s के साथ अनुमति नहीं है height, max-heightतो आप दोनों मान निर्दिष्ट करने के स्थान पर उपयोग कर सकते हैं । संभवतया मेनू से अधिक होने की जरूरत का हॉवर मूल्य हो सकता है।height:autotransitionmax-heightheight


2
यह एक अच्छी चाल है लेकिन एक कमी है। संक्रमण का समय ऊंचाई पर निर्भर करता है। यदि चर ऊंचाई के साथ कई मेनू हैं, तो अधिकतम ऊंचाई के करीब ऊंचाई वाले तत्व अच्छी तरह से चेतन करेंगे। हालांकि, छोटे लोग बहुत तेजी से चेतन करेंगे, एक असंगत अनुभव देंगे।
यूजर

8

मुझे इस मुद्दे का बेहतर तरीका मिला, आप सीएसएस एनीमेशन का उपयोग कर सकते हैं और आइटम दिखाने के लिए अपना भयानक प्रभाव बना सकते हैं।

    .item {
     display: none;
}

.item:hover {
     display: block;
     animation: fade_in_show 0.5s
}

@keyframes fade_in_show {
     0% {
          opacity: 0;
          transform: scale(0)
     }
     100% {
          opacity: 1;
          transform: scale(1)
     }
}

इस उपयोगी टिप के लिए धन्यवाद। यह सही काम कर रहा है।
सेदत कुमकु

6

मैं इस मुद्दे पर कई बार आया हूं और अब बस साथ गया:

.block {
  opacity: 1;
  transition: opacity 250ms ease;
}

.block--invisible {
  pointer-events: none;
  opacity: 0;
}

कक्षा block--invisibleको जोड़ने से पूरे तत्व क्लिक करने योग्य नहीं होंगे, लेकिन इसके पीछे सभी तत्व होंगे क्योंकि pointer-events:noneसभी प्रमुख ब्राउज़रों (कोई IE <11) द्वारा समर्थित है।


क्या आप इसे एक उदाहरण में रख सकते हैं, कृपया
गारेथस

1
यह अच्छी तरह से काम करता है, लेकिन यह ध्यान दिया जाना चाहिए कि सूचक-घटनाएँ IE से नीचे 11 के साथ काम नहीं करती हैं
user1702965

11 से नीचे IE के लिए जोड़ा गया नोट
डोमिनिकनअनर

यदि आपको हर चीज के ऊपर तत्व की आवश्यकता है (उदाहरण के लिए एक मेनू) तो यह ईमानदारी से अब तक का सबसे साफ तरीका है कि 2019 में समर्थन के लिए ठोस हैpointer-events
जोश डेवनपोर्ट

5

बदलें overflow:hiddenकरने के लिए overflow:visible। यह बेहतर काम करता है। मैं इस तरह का उपयोग करता हूं:

#menu ul li ul {
    background-color:#fe1c1c;
    width:85px;
    height:0px;
    opacity:0;
    box-shadow:1px 3px 10px #000000;
    border-radius:3px;
    z-index:1;
    -webkit-transition:all 0.5s ease;
    -moz-transition:all 0.6s ease;
}

#menu ul li:hover ul  {
    overflow:visible;
    opacity:1;
    height:140px;
}

visibleबेहतर है क्योंकि overflow:hiddenवास्तव में एक की तरह काम करते हैं display:none


यह एक मेरे लिए टिकट था। धन्यवाद!
Dan Loewenherz

5

जावास्क्रिप्ट की आवश्यकता नहीं है, और कोई अपमानजनक रूप से विशाल अधिकतम ऊंचाई की आवश्यकता नहीं है। इसके बजाय, max-heightअपने टेक्स्ट एलिमेंट्स पर सेट करें , और एक फ़ॉन्ट रिलेटिव यूनिट जैसे कि remया का उपयोग करें em। इस तरह, आप अपने कंटेनर से अधिक से अधिक ऊंचाई सेट कर सकते हैं, जबकि मेनू बंद होने पर देरी या "पॉपिंग" से बचते हैं:

एचटीएमएल

<nav>
  <input type="checkbox" />
  <ul>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
  </ul>
</nav>

सीएसएस

nav input + ul li { // Notice I set max-height on li, not ul
   max-height: 0;
}

nav input:checked + ul li {
   max-height: 3rem; // A little bigger to allow for text-wrapping - but not outrageous
}

यहां एक उदाहरण देखें: http://codepen.io/mindfullsilence/pen/DtzjE


इसके समान आप अपने पाठ पर लाइन-ऊँचाई सेट कर सकते हैं और इसे शून्य में बदल सकते हैं। अगर अंदर केवल पाठ है, तो यह कंटेनर को छिपा देगा।
विस्मॉर्टेलमंस

इतने कम वोट क्यों? यह वास्तव में एक अच्छा जवाब है और मैं इसका उपयोग कर सकता हूं।
मेलविक्स

@mwilcox क्योंकि यह एक निश्चित ऊंचाई का उपयोग करता है, जो गतिशील सामग्री (एक अनुमानित ऊंचाई भी) के साथ काम करते समय खराब है। और यह केवल पाठ सामग्री पर उपयोगी है।
फेबियन वॉन एलर्ट्स

5

गुइलेर्मो से स्वीकृत उत्तर लिखे जाने के बाद, 2012-04-03 के सीएसएस संक्रमण विनिर्देशन ने दृश्यता संक्रमण के व्यवहार को बदल दिया और अब संक्रमण-विलंब के उपयोग के बिना, इस समस्या को छोटे तरीके से हल करना संभव है :

.myclass > div {
                   transition:visibility 1s, opacity 1s;
                   visibility:hidden;  opacity:0
               }
.myclass:hover > div
               {   visibility:visible; opacity:1 }

दोनों संक्रमणों के लिए निर्दिष्ट रन समय आमतौर पर समान होना चाहिए (हालांकि दृश्यता के लिए थोड़ा लंबा समय एक समस्या नहीं है)।

एक रनिंग वर्जन के लिए, मेरे ब्लॉग पोस्ट सीएसएस ट्रांजिशन विजिबिलिटी को देखें

प्रश्न का शीर्षक "प्रदर्शन पर संक्रमण: संपत्ति" और स्वीकृत जवाब के लिए रुई मार्केस और जोश की टिप्पणियों के जवाब में लिखें :

यह समाधान उन मामलों में काम करता है जहां यह अप्रासंगिक है यदि प्रदर्शन या दृश्यता संपत्ति का उपयोग किया जाता है (जैसा कि शायद इस प्रश्न में मामला था)।

यह तत्व को पूरी तरह से हटा नहीं देगा display:none, बस इसे अदृश्य बना देगा, लेकिन यह अभी भी दस्तावेज़ प्रवाह में रहता है और निम्नलिखित तत्वों की स्थिति को प्रभावित करता है।

संक्रमण जो पूरी तरह से तत्व को समान रूप से हटाते हैं, उन्हें display:noneऊंचाई का उपयोग करके किया जा सकता है (जैसा कि अन्य उत्तरों और टिप्पणियों द्वारा इंगित किया गया है), अधिकतम ऊंचाई, या मार्जिन-टॉप / बॉटम, लेकिन यह भी देखें कि मैं ऊंचाई कैसे बदल सकता हूं: 0; ऊंचाई तक: ऑटो; CSS का उपयोग कर रहे हैं? और मेरा ब्लॉग प्रदर्शन और ऊँचाई गुणों पर CSS बदलावों के लिए Workarounds पोस्ट करता है ।

जॉर्जमिलो की टिप्पणी के जवाब में: दोनों गुणों और दोनों संक्रमणों की आवश्यकता है: अस्पष्टता संपत्ति का उपयोग फीका-इन और फीका-आउट एनीमेशन बनाने के लिए किया जाता है और माउस घटनाओं पर प्रतिक्रिया करने वाले तत्व से बचने के लिए दृश्यता संपत्ति। दृश्य प्रभाव के लिए अस्पष्टता और दृश्यता पर संक्रमण को छिपाने की आवश्यकता होती है जब तक कि फीका-आउट समाप्त न हो जाए।


4

मैंने आखिरकार मेरे लिए एक समाधान ढूंढ लिया, जिसके opacityसाथ संयोजन करके position absolute(छिपी हुई जगह पर कब्जा न करने के लिए)।

.toggle {
  opacity: 0;
  position: absolute;
  transition: opacity 0.8s;
}

.parent:hover .toggle {
  opacity: 1;
  position: static;
}

4

मुझे संदेह है कि सीएसएस संक्रमण शुरू करने वाले किसी को भी जल्दी से पता चलता है कि यदि आप एक ही समय में प्रदर्शन संपत्ति (ब्लॉक / कोई नहीं) को संशोधित कर रहे हैं तो वे काम नहीं करते हैं। एक वर्कअराउंड जिसका अभी तक उल्लेख नहीं किया गया है, वह यह है कि आप display:block/noneएलिमेंट को छिपाने / दिखाने के लिए उपयोग करना जारी रख सकते हैं , लेकिन इसकी अपारदर्शिता को 0 पर सेट करते हैं ताकि जब यह display:blockअभी भी अदृश्य हो, तब भी।

फिर इसे फीका करने के लिए, "जैसे" पर एक और सीएसएस वर्ग जोड़ें जो अपारदर्शिता को 1 पर सेट करता है और अपारदर्शिता के लिए संक्रमण को परिभाषित करता है। जैसा कि आप कल्पना कर सकते हैं, आपको तत्व में उस "वर्ग" को जोड़ने के लिए जावास्क्रिप्ट का उपयोग करना होगा, लेकिन कम से कम आप अभी भी वास्तविक संक्रमण के लिए सीएसएस का उपयोग कर रहे हैं।

PS यदि आप अपने आप को ऐसी स्थिति में पाते हैं जहाँ आपको दोनों करने की आवश्यकता है display:block, और कक्षा को "पर" जोड़ें, उसी समय, सेटटाइमआउट का उपयोग करके उत्तरार्द्ध को हटा दें। अन्यथा, ब्राउज़र एक ही बार में दोनों चीजों को देखता है और संक्रमण को निष्क्रिय करता है।


उत्कृष्ट धन्यवाद! मैंने एक उदाहरण के साथ एक और उत्तर लिखा जो वास्तव में साथ काम करता है display:none
मोजुबा

4

यह निम्नलिखित के रूप में सरल है :)

@keyframes fadeout {
    0% { opacity: 1; height: auto; }
    90% { opacity: 0; height: auto; }
    100% { opacity: 0; height: 0;
}
animation: fadeout linear 0.5s 1 normal forwards !important;

इसे फीका करने के लिए जाओ, और फिर इसे बनाओ height 0;। इसके अलावा फॉरवर्ड का उपयोग करना सुनिश्चित करें ताकि यह अंतिम स्थिति में रहे।


कक्षा को हटाते समय यह तुरंत रीसेट हो जाएगा, इसलिए यह अच्छा विचार नहीं है
शॉन टी

2

इस समाधान में उत्कृष्ट संगतता है, और मैंने इसे अभी तक नहीं देखा है:

.hidden-element {
  position: absolute;
  z-index: -1;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity .5s ease-out;
}

.hidden-element.visible {
  position: static;
  z-index: auto;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}

स्पष्टीकरण : यह visibility: hiddenचाल का उपयोग करता है (जो एक चरण में "शो-और-चेतन" के साथ संगत है), लेकिन यह संयोजन का उपयोग यह position: absolute; z-index: -1; pointer-events: none;सुनिश्चित करने के लिए करता है कि छिपा हुआ कंटेनर अंतरिक्ष नहीं लेता है और उपयोगकर्ता की बातचीत का जवाब नहीं देता है


1
लेकिन positionअभी भी परिवर्तन के चारों ओर तत्व झटका होगा, नहीं?
अर्सिलियम

ठीक है, बेशक: position: absoluteइसका मतलब है कि तत्व किसी भी स्थान को नहीं लेता है, जैसा कि स्पष्टीकरण में वर्णित है। जब यह स्विच करता है position: staticऔर प्रकट होता है, तो यह एक सामान्य तत्व की तरह जगह लेगा, जो इस प्रश्न का बिंदु है। मेरा सुझाव है कि आप इसे आज़माएं!
क्रिस्टोफ मारोस

2
मैंने किया। लेकिन अगर मैं सही समझता हूं तो सवाल संक्रमण के बारे में था । के रूप में "चिकनी एनिमेशन"।
अर्सिलियम

2

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

https://jsfiddle.net/b9chris/hweyecu4/17/

बॉक्स के साथ शुरू करना जैसे:

<div id="box" class="hidden">Lorem</div>

एक छुपा हुआ डब्बा।

div.hidden {
    display: none;
}
#box {
    transition: opacity 1s;
}

हम संबंधित q / a में पाए जाने वाले ट्रिक का उपयोग करने जा रहे हैं, ब्राउज़र की तुरंत जांच करने के लिए ऑफ़सेट की जाँच कर रहे हैं:

https://stackoverflow.com/a/16575811/176877

सबसे पहले, उपरोक्त चाल को औपचारिक रूप देने वाला एक पुस्तकालय:

$.fn.noTrnsn = function () {
    return this.each(function (i, tag) {
        tag.style.transition = 'none';
    });
};
$.fn.resumeTrnsn = function () {
    return this.each(function (i, tag) {
        tag.offsetHeight;    
        tag.style.transition = null;
    });
};

अगला, हम एक बॉक्स को प्रकट करने के लिए इसका उपयोग करने जा रहे हैं, और इसे इसमें फीका कर सकते हैं:

$('#button').on('click', function() {
    var tag = $('#box');
    if (tag.hasClass('hidden'))
        tag.noTrnsn().removeClass('hidden')
        .css({ opacity: 0 })
        .resumeTrnsn().css({ opacity: 1 });
    else
        tag.css({ opacity: 0 });
});

यह बॉक्स को अंदर और बाहर फेकता है। इसलिए, .noTrnsn()संक्रमण को बंद कर देता है, फिर हम उस hiddenवर्ग को हटा देते हैं , जो अपने डिफ़ॉल्ट displayसे फ़्लिप करता है । फिर हम 0 में अस्पष्टता सेट करते हैं ताकि आप फ़ेडिंग के लिए तैयार हो सकें। अब जब हमने स्टेज सेट कर लिया है, तो हम बदलावों को वापस चालू करते हैं । और अंत में, अपारदर्शिता को 1 पर सेट करके संक्रमण को किक करें।noneblock.resumeTrnsn()

पुस्तकालय के बिना, प्रदर्शन में परिवर्तन और अपारदर्शिता में परिवर्तन से हमें अवांछनीय परिणाम प्राप्त होंगे। यदि हमने लाइब्रेरी कॉल को केवल हटा दिया है, तो हमें कोई संक्रमण नहीं होगा।

ध्यान दें कि उपर्युक्त फ़ेडआउट एनीमेशन के अंत में फिर से कोई भी प्रदर्शित नहीं करता है। हम हालांकि कट्टरपंथी हो सकते हैं। आइए एक के साथ ऐसा करें कि 0 से बढ़ता है और बढ़ता है।

फैंसी!

https://jsfiddle.net/b9chris/hweyecu4/22/

#box {
    transition: height 1s, opacity 1s;
}

अब हम ऊंचाई और अपारदर्शिता दोनों को बदल रहे हैं। नोट हम, ऊंचाई, जो यह डिफ़ॉल्ट है इसका मतलब है की स्थापना नहीं कर रहे हैं कि auto। परंपरागत रूप से यह संक्रमण नहीं किया जा सकता है - ऑटो से पिक्सेल मूल्य (जैसे 0) पर जाने से आपको कोई संक्रमण नहीं मिलेगा। हम लाइब्रेरी के साथ, और एक और लाइब्रेरी विधि के साथ काम करने जा रहे हैं:

$.fn.wait = function (time, fn) {
    if (time)
        this.delay(time);
    if (!fn)
        return this;

    var _this = this;
    return this.queue(function (n) {
        fn.call(_this);
        n();
    });
};

यह एक सुविधा विधि है जो हमें jQuery के मौजूदा fx / एनीमेशन कतार में भाग लेने की सुविधा देती है, बिना किसी एनीमेशन ढांचे की आवश्यकता के जो अब jQuery 3.x में बाहर रखा गया है। मैं यह समझाने नहीं जा रहा हूं कि jQuery कैसे काम करता है, लेकिन यह कहना पर्याप्त है, .queue()और .stop()jQuery प्रदान करता है जो हमें एक दूसरे पर कदम रखने से हमारे एनिमेशन को रोकने में मदद करता है।

आइए स्लाइड डाउन इफेक्ट को चेतन करें।

$('#button').on('click', function() {
    var tag = $('#box');
    if (tag.hasClass('hidden')) {
        // Open it
        // Measure it
        tag.stop().noTrnsn().removeClass('hidden').css({
            opacity: 0, height: 'auto'
        });
        var h = tag.height();
        tag.css({ height: 0 }).resumeTrnsn()
        // Animate it
        .css({ opacity: 1, height: h })
        .wait(1000, function() {
            tag.css({ height: 'auto' });
        });
    } else {
        // Close it
        // Measure it
        var h = tag.noTrnsn().height();
        tag.stop().css({ height: h })
        .resumeTrnsn()
        // Animate it
        .css({ opacity: 0, height: 0 })
        .wait(1000, function() {
            tag.addClass('hidden');
        });
    }
});

इस कोड की जाँच शुरू होती है #boxऔर क्या यह वर्तमान में छिपा हुआ है, इसकी कक्षा पर जाँच करके। लेकिन यह wait()लाइब्रेरी कॉल का उपयोग करके अधिक पूरा करता है , hiddenस्लाइडआउट / फीका एनीमेशन के अंत में कक्षा को जोड़कर , जिसे आप यह खोजने की उम्मीद करेंगे कि क्या यह वास्तव में छिपा हुआ है - उपरोक्त सरल उदाहरण कुछ नहीं कर सकता है। यह तत्व को बार-बार छिपाने / छिपाने में सक्षम करता है, जो पिछले उदाहरण में एक बग था, क्योंकि छिपे हुए वर्ग को कभी भी बहाल नहीं किया गया था।

आप सीएसएस और वर्ग परिवर्तन भी देख सकते हैं जिसे .noTrnsn()आम तौर पर एनिमेशन के लिए चरण निर्धारित करने के बाद बुलाया जा रहा है , जिसमें माप लेना शामिल है, जैसे कि माप, #boxउपयोगकर्ता को कॉल करने से पहले .resumeTrnsn()यह दिखाने के बिना कि अंतिम ऊंचाई क्या होगी , और इसे पूरी तरह से सेट से एनिमेट करना सीएसएस मूल्यों को अपने लक्ष्य के लिए मंच।

पुराना उत्तर

https://jsfiddle.net/b9chris/hweyecu4/1/

आप इसे क्लिक से बदल सकते हैं:

function toggleTransition() {
  var el = $("div.box1");

  if (el.length) {
    el[0].className = "box";
    el.stop().css({maxWidth: 10000}).animate({maxWidth: 10001}, 2000, function() {
        el[0].className = "box hidden";
    });
  } else {
    el = $("div.box");
    el[0].className = "box";
    el.stop().css({maxWidth: 10001}).animate({maxWidth: 10000}, 50, function() {
        el[0].className = "box box1";
    });
  }

  return el;
}

someTag.click(toggleTransition);

CSS वह है जो आप अनुमान लगाएंगे:

.hidden {
    display: none;
}
.box {
    width: 100px;
    height: 100px;
    background-color: blue;
    color: yellow;
    font-size: 18px;
    left: 20px;
    top: 20px;
    position: absolute;
    -webkit-transform-origin: 0 50%;
    transform-origin: 0 50%;
    -webkit-transform: scale(.2);
    transform: scale(.2);
    -webkit-transition: transform 2s;
    transition: transform 2s;
}
.box1{
    -webkit-transform: scale(1);
    transform: scale(1);
}

कुंजी प्रदर्शन गुण को थ्रॉटलिंग कर रही है। छिपा वर्ग को हटाने और फिर 50 एमएस इंतजार कर, तक तो करने के जोड़ा वर्ग के माध्यम से संक्रमण शुरू करने के बाद, हम इसे प्रकट करना चाहते हैं और फिर जैसा हम चाहते थे, इसके बजाय इसका विस्तार करें, इसके बिना स्क्रीन पर बिना किसी एनीमेशन के चमक रहा है। इसी तरह से दूसरे तरीके से जाना होता है, जब तक कि हम छिपे हुए को लागू करने से पहले एनीमेशन खत्म होने तक इंतजार करते हैं।

नोट: मैं दौड़ की स्थिति .animate(maxWidth)से बचने के लिए यहाँ दुर्व्यवहार कर रहा हूँ setTimeoutsetTimeoutजब आप या कोई और इससे अनजान कोड उठाता है, तो छिपे हुए बग को पेश करने की जल्दी होती है। .animate()आसानी से मारा जा सकता है .stop()। मैं इसका उपयोग मानक fx कतार में 50 ms या 2000 ms देरी करने के लिए कर रहा हूँ, जहाँ इसके शीर्ष पर अन्य कोडर्स बिल्डिंग द्वारा इसे खोजना / हल करना आसान है।


1

मेरे पास एक समान मुद्दा था जिसका जवाब मुझे नहीं मिला। कुछ Google खोजों ने बाद में मुझे यहां पहुंचाया। यह देखते हुए कि मुझे वह सरल उत्तर नहीं मिला जिसकी मैं उम्मीद कर रहा था, मैं एक समाधान पर ठोकर खा गया जो कि सुरुचिपूर्ण और प्रभावी दोनों है।

यह पता चलता है कि visibilityसीएसएस संपत्ति का एक मूल्य है collapseजो आम तौर पर टेबल आइटम के लिए उपयोग किया जाता है। हालांकि, अगर किसी अन्य तत्वों पर उपयोग किया जाता है, तो यह प्रभावी रूप से उन्हें छिपे हुए के रूप में प्रस्तुत करता है , बहुत अधिक display: hiddenलेकिन उसी तरह की क्षमता के साथ जो तत्व किसी भी स्थान को नहीं लेता है और आप अभी भी प्रश्न में तत्व को एनिमेट कर सकते हैं।

नीचे कार्रवाई में इसका एक सरल उदाहरण है।

function toggleVisibility() {
  let exampleElement = document.querySelector('span');
  if (exampleElement.classList.contains('visible')) {
    return;
  }
  exampleElement.innerHTML = 'I will not take up space!';
  exampleElement.classList.toggle('hidden');
  exampleElement.classList.toggle('visible');
  setTimeout(() => {
    exampleElement.classList.toggle('visible');
    exampleElement.classList.toggle('hidden');
  }, 3000);
}
#main {
  display: flex;
  flex-direction: column;
  width: 300px;
  text-align: center;
}

.hidden {
  visibility: collapse;
  opacity: 0;
  transition: visibility 2s, opacity 2s linear;
}

.visible {
  visibility: visible;
  opacity: 1;
  transition: visibility 0.5s, opacity 0.5s linear;
}
<div id="main">
  <button onclick="toggleVisibility()">Click Me!</button>
  <span class="hidden"></span>
  <span>I will get pushed back up...</span>
</div>


1

समस्या का सबसे सरल सार्वभौमिक समाधान यह है: display:noneअपने सीएसएस में निर्दिष्ट करने के लिए स्वतंत्र महसूस करें , हालांकि आपको blockजावास्क्रिप्ट का उपयोग करके इसे (या जो कुछ भी) बदलना होगा , और फिर आपको अपने तत्व में एक वर्ग जोड़ना होगा जो वास्तव में है सेटटाइमआउट () के साथ संक्रमण करता है । बस इतना ही।

अर्थात:

<style>
    #el {
        display: none;
        opacity: 0;
    }
    #el.auto-fade-in {
        opacity: 1;
        transition: all 1s ease-out; /* Future, future, please come sooner! */
        -webkit-transition: all 1s ease-out;
        -moz-transition: all 1s ease-out;
        -o-transition: all 1s ease-out;
    }
</style>

<div id=el>Well, well, well</div>

<script>
    var el = document.getElementById('el');
    el.style.display = 'block';
    setTimeout(function () { el.className = 'auto-fade-in' }, 0);
</script>

यह नवीनतम समझदार ब्राउज़रों में परीक्षण किया गया था। जाहिर है कि यह इंटरनेट एक्सप्लोरर 9 या उससे पहले काम नहीं करना चाहिए।


1

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

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

@-webkit-keyframes fadeOut {
    from { opacity: 1; }
      to { opacity: 0; }
}

यदि आप डिस्प्ले ब्लॉक से आगे बढ़ने वाले तत्व को प्रदर्शित नहीं करना चाहते हैं, तो मैं यह नहीं देख सकता कि यह वर्तमान में सीएसएस के साथ ही संभव है। आपको ऊंचाई प्राप्त करनी होगी और ऊंचाई कम करने के लिए CSS एनीमेशन का उपयोग करना होगा। यह सीएसएस के साथ संभव है जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है, लेकिन यह एक तत्व के लिए चेतन करने के लिए आवश्यक सटीक ऊंचाई मूल्यों को जानने के लिए मुश्किल होगा।

jsFiddle उदाहरण

सीएसएस

@-webkit-keyframes pushDown {
  0% {
    height: 10em;
  }
  25% {
    height: 7.5em;
  }
  50% {
    height: 5em;
  }
  75% {
    height: 2.5em;
  }
  100% {
    height: 0em;
  }
}

.push-down {
    -webkit-animation: pushDown 2s forwards linear;
}

जावास्क्रिप्ट

var element = document.getElementById("element");

// Push item down
element.className = element.className + " push-down";

1

आप इसे संक्रमण घटनाओं के साथ कर सकते हैं, इसलिए आप संक्रमण के लिए दो सीएसएस कक्षाओं का निर्माण करते हैं, एक एनीमेशन को दूसरे पर रखता है, प्रदर्शन को कोई भी स्थिति नहीं रखता है। और एनीमेशन समाप्त होने के बाद आप उन्हें स्विच करते हैं? यदि मैं एक बटन दबाता हूं, और दोनों वर्गों को हटा देता हूं, तो मेरे मामले में मैं फिर से डिव प्रदर्शित कर सकता हूं।

नीचे दिए गए स्निपेट को आज़माएं ...

$(document).ready(function() {
  // Assign transition event
  $("table").on("animationend webkitAnimationEnd", ".visibility_switch_off", function(event) {
    // We check if this is the same animation we want
    if (event.originalEvent.animationName == "col_hide_anim") {
      // After the animation we assign this new class that basically hides the elements.
      $(this).addClass("animation-helper-display-none");
    }

  });

  $("button").click(function(event) {

    $("table tr .hide-col").toggleClass(function() {
      // We switch the animation class in a toggle fashion...
      // and we know in that after the animation end, there
      // is will the animation-helper-display-none extra
      // class, that we nee to remove, when we want to
      // show the elements again, depending on the toggle
      // state, so we create a relation between them.
      if ($(this).is(".animation-helper-display-none")) {
        // I'm toggling and there is already the above class, then
        // what we want it to show the elements , so we remove
        // both classes...
        return "visibility_switch_off animation-helper-display-none";
      }
      else {
        // Here we just want to hide the elements, so we just
        // add the animation class, the other will be added
        // later be the animationend event...
        return "visibility_switch_off";
      }
    });
  });
});
table th {
  background-color: grey;
}

table td {
  background-color: white;
  padding: 5px;
}

.animation-helper-display-none {
  display: none;
}

table tr .visibility_switch_off {
  animation-fill-mode: forwards;
  animation-name: col_hide_anim;
  animation-duration: 1s;
}

@-webkit-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-moz-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-o-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@keyframes col_hide_anim {
  0%   {opacity: 1;}
  100% {opacity: 0;}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <theader>
    <tr>
      <th>Name</th>
      <th class='hide-col'>Age</th>
      <th>Country</th>
    </tr>
  </theader>
  <tbody>
    <tr>
      <td>Name</td>
      <td class='hide-col'>Age</td>
      <td>Country</td>
    </tr>
  </tbody>
</table>

<button>Switch - Hide Age column with fadeout animation and display none after</button>


0

यदि आप अपनी कक्षाओं को सेट करने के लिए jQuery का उपयोग कर रहे हैं, तो यह 100% काम करेगा:

$(document).ready(function() {
  $('button').click(function() {
    var container = $('.container');
    
    if (!container.hasClass('active')) {
      container.addClass('show').outerWidth();
      container.addClass('active');
    }
    else {
      container.removeClass('active').one('transitionend', function() {
        container.removeClass('show');
      });
    }
  });
});
.container {
  display: none;
  opacity: 0;
  transition: opacity 0.3s ease;
}

.container.show {
  display: flex;
}
 
.container.active {
  opacity: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Toggle</button>

<div class="container">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

बेशक आप सिर्फ jQuery .fadeIn()और .fadeOut()फ़ंक्शंस का उपयोग कर सकते हैं , लेकिन इसके बजाय कक्षाओं को सेट करने का लाभ उस स्थिति में है जब आप प्रदर्शन मूल्य के अलावा block(जैसा कि डिफ़ॉल्ट के साथ .fadeIn()और .fadeOut())।

यहाँ मैं flexएक अच्छा फीका प्रभाव के साथ प्रदर्शित करने के लिए संक्रमण कर रहा हूँ ।


0

उपयोग करने के बजाय displayआप, ऑफ-स्क्रीन ’तत्व को तब तक स्टोर कर सकते हैं जब तक आपको इसकी आवश्यकता न हो, और फिर अपनी स्थिति को उस स्थान पर सेट करें जहाँ आप इसे चाहते हैं और उसी समय इसे रूपांतरित कर सकते हैं। यह हालांकि अन्य डिजाइन मुद्दों की एक पूरी मेजबान लाता है, इसलिए आपके लाभ भिन्न हो सकते हैं।

आप शायद displayवैसे भी उपयोग नहीं करना चाहेंगे , जैसा कि आप चाहते हैं कि सामग्री स्क्रीन पाठकों के लिए सुलभ हो, जो कि अधिकांश भाग दृश्यता के नियमों का पालन करने की कोशिश करते हैं - अर्थात, यदि यह आंख को दिखाई नहीं देना चाहिए, तो एजेंट को सामग्री के रूप में नहीं दिखाया जाएगा।


0

आप बस सीएसएस दृश्यता का उपयोग कर सकते हैं : प्रदर्शन के बजाय छिपा हुआ / दृश्यमान : कोई नहीं / ब्लॉक

div {
    visibility:hidden;
    -webkit-transition: opacity 1s ease-out;
    -moz-transition: opacity 1s ease-out;
    -o-transition: opacity 1s ease-out;
    transition: opacity 1s ease-out;
    opacity: 0;
}

parent:hover > div {
    opacity: 1;
    visibility: visible;
}

5
यह खाली जगह छोड़ते हुए अंतरिक्ष को सुरक्षित रखता है। यदि आप किसी स्थान को गिराना चाहते हैं तो आपको ऊंचाई या कुछ अन्य संपत्ति को चेतन करना होगा।
मर्सी सटन

0

मैंने एक ओपन सोर्स कंकाल परियोजना शुरू की, जिसे टॉगल डिस्प्ले एनामेट कहा जाता है ।

यह कंकाल सहायक आपको आसानी से jQuery शो / छिपाने की नकल करने की अनुमति देगा, लेकिन सीएसएस 3 संक्रमण एनिमेशन के साथ / बाहर।

यह क्लास टॉगल का उपयोग करता है ताकि आप प्रदर्शन के अलावा किसी भी सीएसएस विधियों का उपयोग कर सकें जो आप तत्वों के अलावा चाहते हैं: कोई नहीं | ब्लॉक | टेबल | इनलाइन, साथ ही अन्य वैकल्पिक उपयोगों के बारे में सोचा जा सकता है।

इसका मुख्य डिजाइन उद्देश्य तत्व टॉगल राज्यों के लिए है, और यह एक पलटा राज्य का समर्थन करता है जहां ऑब्जेक्ट को छिपाने से आप अपने कीफ़्रेम को रिवर्स में चला सकते हैं या तत्व को छिपाने के लिए एक वैकल्पिक एनीमेशन खेल सकते हैं।

मैं जिस कॉन्सेप्ट पर काम कर रहा हूं, उसके लिए ज्यादातर मार्कअप सीएसएस है, और वास्तव में बहुत कम जावास्क्रिप्ट का उपयोग किया जाता है।

यहाँ एक डेमो है: http://marcnewton.co.uk/projects/toggle-display-animate/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.