मैं ऊंचाई कैसे बदल सकता हूं: 0; ऊंचाई तक: ऑटो; CSS का उपयोग कर रहे हैं?


2131

मैं <ul>सीएसएस बदलाव का उपयोग कर एक स्लाइड बनाने की कोशिश कर रहा हूं ।

<ul>पर शुरू होता है height: 0;। होवर पर, ऊँचाई पर सेट किया गया है height:auto;। हालांकि, यह केवल दिखाई देने के लिए पैदा कर रहा है, संक्रमण नहीं ,

अगर मैं इसे height: 40px;करने के लिए height: auto;, तो यह करने के लिए स्लाइड होगा height: 0;, और फिर अचानक सही ऊंचाई पर कूद।

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

#child0 {
  height: 0;
  overflow: hidden;
  background-color: #dedede;
  -moz-transition: height 1s ease;
  -webkit-transition: height 1s ease;
  -o-transition: height 1s ease;
  transition: height 1s ease;
}
#parent0:hover #child0 {
  height: auto;
}
#child40 {
  height: 40px;
  overflow: hidden;
  background-color: #dedede;
  -moz-transition: height 1s ease;
  -webkit-transition: height 1s ease;
  -o-transition: height 1s ease;
  transition: height 1s ease;
}
#parent40:hover #child40 {
  height: auto;
}
h1 {
  font-weight: bold;
}
The only difference between the two snippets of CSS is one has height: 0, the other height: 40.
<hr>
<div id="parent0">
  <h1>Hover me (height: 0)</h1>
  <div id="child0">Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>
  </div>
</div>
<hr>
<div id="parent40">
  <h1>Hover me (height: 40)</h1>
  <div id="child40">Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>Some content
    <br>
  </div>
</div>


मेरा मानना ​​है कि height:auto/max-heightसमाधान केवल तभी काम करेगा जब आप उस क्षेत्र का विस्तार कर रहे हों जो heightआप प्रतिबंधित करना चाहते हैं। यदि आपके पास एक max-heightहै 300px, लेकिन एक कॉम्बो बॉक्स ड्रॉपडाउन, जो वापस आ सकता है 50px, तो max-heightआपकी मदद नहीं करेगा, 50pxतत्वों की संख्या के आधार पर परिवर्तनशील है, आप एक असंभव स्थिति में आ सकते हैं जहां मैं इसे ठीक नहीं कर सकता क्योंकि यह heightनहीं है तय किया height:autoगया, समाधान था, लेकिन मैं इसके साथ बदलाव का उपयोग नहीं कर सकता।
क्रिस्टोफर थॉमस

51
ओपी सीएसएस समाधान के लिए कोशिश कर रहा है, जेएस नहीं, अन्यथा वे बस अतिप्रवाह और चेतन का उपयोग कर सकते हैं
टोनी लेह

5
@VIDesignz: लेकिन इनर डिव का -100% मार्जिन-टॉप रैपर div की चौड़ाई प्राप्त करता है , ऊंचाई नहीं। तो इस समाधान में एक ही तरह की समस्या है, वह है अधिकतम ऊंचाई का समाधान। इसके अलावा जब चौड़ाई सामग्री की ऊंचाई से छोटी होती है, तो सभी सामग्री -100% मार्जिन-टॉप द्वारा छिपाई नहीं जाती हैं। तो यह एक गलत समाधान है।
ग्रेगटॉम

1
एक उचित समाधान की कल्पना और कार्यान्वयन के बारे में चर्चा के लिए github.com/w3c/csswg-drafts/issues/626 देखें
बेन क्रीसी जुएल

जवाबों:


2743

max-heightसंक्रमण में उपयोग करें और नहीं height। और max-heightअपने बॉक्स की तुलना में कुछ बड़ा करने के लिए एक मूल्य निर्धारित करें।

यहां एक अन्य जवाब में क्रिस जॉर्डन द्वारा प्रदान की गई JSFiddle डेमो देखें ।

#menu #list {
    max-height: 0;
    transition: max-height 0.15s ease-out;
    overflow: hidden;
    background: #d5d5d5;
}

#menu:hover #list {
    max-height: 500px;
    transition: max-height 0.25s ease-in;
}
<div id="menu">
    <a>hover me</a>
    <ul id="list">
        <!-- Create a bunch, or not a bunch, of li's to see the timing. -->
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
    </ul>
</div>


323
यह बहुत अच्छा काम करता है! सिवाय इसके कि शुरू होने पर देरी हो रही है, क्योंकि यह अधिकतम ऊंचाई के लिए शुरू होता है, जो शुरू में बहुत अधिक है..हम्म, मुझे लगता है कि यह कुछ कष्टप्रद है
vsync

175
+1 महान समाधान! संक्रमण की गति की गणना तब की जाती है जब आप अधिकतम-ऊँचाई मान पर संक्रमण के लिए निर्दिष्ट समय के रूप में गणना करते हैं ... लेकिन चूंकि ऊँचाई अधिकतम-ऊँचाई से कम होगी, इसलिए वास्तविक ऊँचाई पर संक्रमण तेज़ी से (प्रायः उल्लेखनीय रूप से) होगा समय निर्दिष्ट किया गया।
किंगजेफ्रे

50
ध्यान दें कि इससे बदसूरत संक्रमण समाप्त हो सकता है जब आपको उन मूल्यों का उपयोग करना होगा जो वास्तविक गणना मूल्य से बहुत बड़े हैं। मैंने यह देखा है कि एक डिव को 0 ऊँचाई से कंटेंट की ऊँचाई तक बढ़ने की कोशिश करते हुए जो विभिन्न स्क्रीन साइज़ (स्मार्टफोन पर मेरी 2560x1440 मॉनिटर बनाम> 10 पंक्तियों पर 2 लाइनें) के कारण बहुत भिन्न होता है। इसके लिए मैंने js के साथ जाना समाप्त कर दिया।
जेपेल्टोनेमी

44
बहुत बदसूरत समाधान क्योंकि यह एक दिशा में देरी बनाता है, लेकिन दूसरा नहीं।
टिम

84
यह एक बहुत आलसी समाधान है। मैं मान रहा हूं कि ओपी ऊंचाई का उपयोग करना चाहता है: ऑटो क्योंकि कंटेनर की विस्तारित ऊंचाई कुछ अप्रत्याशित है। एनीमेशन के दिखाई देने से पहले इस समाधान में देरी होगी। इसके अतिरिक्त एनीमेशन की दृश्यमान अवधि अप्रत्याशित होगी। आपको कंटेनरों के प्रत्येक बच्चे के नोड्स की संयुक्त ऊंचाई की गणना करके और फिर एक सटीक ऊंचाई मूल्य में आसानी से गणना करने से बहुत अधिक अनुमानित (और संभावना चिकनी) परिणाम मिलेंगे।
शॉन व्हेनरी

314

आपको इसके बजाय पैमाने का उपयोग करना चाहिए।

ul {
  background-color: #eee;
  transform: scaleY(0);    
  transform-origin: top;
  transition: transform 0.26s ease;
}
p:hover ~ ul {
  transform: scaleY(1);
}
<p>Hover This</p>
<ul>
  <li>Coffee</li>
  <li>Tea</li>
  <li>Milk</li>
</ul>

मैंने jsfiddle पर उपरोक्त कोड का एक विक्रेता उपसर्ग संस्करण बनाया है , और ऊँचाई के बजाय स्केल का उपयोग करने के लिए अपने jsfiddle को बदल दिया है ।


6
मैं इस उत्तर को बढ़ा-चढ़ाकर बता रहा हूं क्योंकि यह css3- संक्रमण सक्षम ब्राउज़रों में अच्छी तरह से काम करता है, लेकिन यह ध्यान दिया जाना चाहिए कि यह IE <9 में बिल्कुल भी काम नहीं करेगा , और IE <10 में एनिमेटेड होगा (यह बस कूद जाएगा)
हैलवुड

215
इस विधि केवल आंशिक रूप से वांछित प्रभाव को प्राप्त होता है, लेकिन वास्तव में नहीं है को दूर अंतरिक्ष। तब्दील बॉक्स अपेक्षाकृत तैनात तत्व की तरह काम करता है - अंतरिक्ष को कोई फर्क नहीं पड़ता कि इसे कैसे बढ़ाया जाता है। की जाँच करें इस jsFiddle जो अपने पहले एक लेता है और सिर्फ निचले भाग में कुछ फर्जी पाठ कहते हैं। ध्यान दें कि जब बॉक्स की ऊंचाई शून्य हो जाती है, तो इसके नीचे का पाठ ऊपर नहीं जाता है।
animuson

9
अब यह करता है: jsfiddle.net/gNDX3/1 मूल रूप से आपको अपने तत्वों को अपनी ज़रूरत के अनुसार स्टाइल करने की आवश्यकता है। CSS / HTML में व्यवहार की तरह कोई चांदी की गोली या विजेट नहीं है।
डॉटनेटकारपेंटर

70
हालांकि मैं अलग-अलग तरीकों की कोशिश करने वाले किसी व्यक्ति की सराहना करता हूं, लेकिन इस समाधान को लाने वाली वास्तविक दुनिया की प्रभावकारिता और जटिलताएं पहले से ही भयानक अधिकतम ऊंचाई वाली हैक की तुलना में बहुत खराब हैं। कृपया उपयोग न करें।
19

2
@SquareCat बिलकुल ठीक। यहाँ एक है जो अधिक दराज है जैसे: jsfiddle.net/dotnetCarpenter/WTL2r
dotnetCarpenter

202

आप वर्तमान में ऊँचाई पर चेतन नहीं कर सकते हैं जब इसमें शामिल ऊंचाइयों में से एक है auto, तो आपको दो स्पष्ट ऊँचाइयाँ निर्धारित करनी होंगी ।


12
किसी समस्या को हल करने के लिए आमतौर पर कई तरीके होते हैं, और उनमें से सभी उपयुक्त या संभव नहीं होते हैं। मुझे नहीं पता कि क्यों @ जेडीदियाहर्ट और रयान ओरे क्यू एंड ए साइट पर संभावित जवाबों को सीमित करने की कोशिश कर रहे हैं। विशेष रूप से इस जवाब को देखते हुए पहले यहाँ था। निस्संदेह इसलिए कि स्वीकृत उत्तर एक समाधान है।
हुर्रे इम

5
@ जेक से जवाब न तो सुरुचिपूर्ण है और न ही सही है। यहां से जुड़ा हुआ उत्तर कहीं बेहतर है। यह सही ढंग से काम करता है और सभी आकार के मामलों को संभालता है - न तो स्वीकृत उत्तर के बारे में कहा जा सकता है।
ग्राफ़िक्समंच

5
युप: यह करता हैthis.$element[dimension](this.$element[dimension]())[0].offsetHeight
एंडी

4
क्या यह किसी तरह तय होने की योजना है? मेरा मतलब है, यह 0 ऊंचाई से संक्रमण करने में सक्षम होने की उम्मीद के लिए बहुत स्वाभाविक है auto...
ऑगस्टिन रीडिंगर

6
@Meliodas "नहीं / आप नहीं कर सकते" स्टैक ओवरफ्लो पर प्रश्नों का एक मान्य और स्वीकार्य उत्तर है।
टायलरएच

122

समाधान जो मैंने हमेशा उपयोग किया है, पहले बाहर फीका करना था, फिर सिकुड़ना font-size, paddingऔर marginमूल्य। यह पोंछे के समान नहीं दिखता है, लेकिन यह स्थिर heightया बिना काम करता है max-height

कार्य उदाहरण:

/* final display */
#menu #list {
    margin: .5em 1em;
    padding: 1em;
}

/* hide */
#menu:not(:hover) #list {
    font-size: 0;
    margin: 0;
    opacity: 0;
    padding: 0;
    /* fade out, then shrink */
    transition: opacity .25s,
                font-size .5s .25s,
                margin .5s .25s,
                padding .5s .25s;
}

/* reveal */
#menu:hover #list {
    /* unshrink, then fade in */
    transition: font-size .25s,
                margin .25s,
                padding .25s,
                opacity .5s .25s;
}
<div id="menu">
    <b>hover me</b>
    <ul id="list">
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
    </ul>
</div>

<p>Another paragraph...</p>


मेरे लिए बड़े करीने से काम किया। काफी नहीं jQuery के स्लाइडअप / डाउन की तरह। आप केवल कमजोर CPU, जैसे पुराने कंप्यूटर या मोबाइल, और एक ही समय में उनमें से कई को खोलना और बंद कर सकते हैं।
क्रूज नुनेज़

3
यदि आपके पास बटन या कोई अन्य गैर-पाठ तत्व हैं, तो आप मँडरा नहीं करते हुए अवांछित व्हाट्सएप के साथ समाप्त हो जाएंगे।
डेनिस डब्ल्यू

3
आप *अन्य परिवर्तनों के साथ सभी बाल तत्वों का चयन करके और इसे परिष्कृत कर सकते हैं। बटन मेरे उपरोक्त कोड से प्रभावित होने चाहिए, हालांकि, अगर वे सही ढंग से स्टाइल में थे em
स्टीवन वाचोन

1
मेरे मामले में, मैं भी जोड़ने के लिए की जरूरत है line-height: 0;औरborder-width: 0;
एंड्री शाटिनोव

1
line-heightअगर आपको सही ढंग से मूल्य पर इकाइयों से बचना है, तो आपको समायोजित करने की आवश्यकता नहीं है : developer.mozilla.org/en-US/docs/Web/CSS/…
Steven Vachon

93

मुझे पता है कि यह इस सवाल का तीसवाँ जवाब है, लेकिन मुझे लगता है कि यह इसके लायक है, इसलिए यहाँ जाता है। यह निम्नलिखित गुणों के साथ CSS-only समाधान है:

  • शुरुआत में देरी नहीं होती है, और संक्रमण जल्दी नहीं रुकता है। दोनों दिशाओं में (विस्तार और पतन), यदि आप अपने CSS में 300ms की संक्रमण अवधि निर्दिष्ट करते हैं, तो संक्रमण 300ms, अवधि लेता है।
  • यह वास्तविक ऊँचाई (विपरीत transform: scaleY(0)) का संक्रमण कर रहा है , इसलिए यह सही काम करता है अगर बंधनेवाला तत्व के बाद सामग्री हो।
  • जबकि (अन्य समाधानों की तरह) में मैजिक नंबर होते हैं (जैसे "एक लंबाई जो आपके बॉक्स की तुलना में अधिक है जो कभी भी होने जा रही है"), यह गलत नहीं है यदि आपकी धारणा गलत हो जाती है। संक्रमण उस मामले में आश्चर्यजनक नहीं लग सकता है, लेकिन संक्रमण से पहले और बाद में, यह कोई समस्या नहीं है: विस्तारित ( height: auto) स्थिति में, पूरी सामग्री में हमेशा सही ऊँचाई होती है (इसके विपरीत यदि आप उठाते हैं तो max-heightवह बाहर हो जाती है बहुत कम)। और ध्वस्त अवस्था में, ऊँचाई शून्य होनी चाहिए जैसी कि होनी चाहिए।

डेमो

यहां तीन संक्षिप्त तत्वों के साथ एक डेमो है, सभी अलग-अलग ऊंचाइयों पर हैं, जो सभी एक ही सीएसएस का उपयोग करते हैं। आप "रन स्निपेट" पर क्लिक करने के बाद "पूर्ण पृष्ठ" पर क्लिक करना चाह सकते हैं। ध्यान दें कि जावास्क्रिप्ट केवल collapsedCSS वर्ग को जन्म देता है , इसमें कोई माप शामिल नहीं है। (आप किसी चेकबॉक्स का उपयोग करके या किसी भी जावास्क्रिप्ट के बिना यह सटीक डेमो कर सकते हैं :target)। यह भी ध्यान दें कि संक्रमण के लिए जिम्मेदार सीएसएस का हिस्सा बहुत छोटा है, और HTML को केवल एक अतिरिक्त आवरण तत्व की आवश्यकता है।

$(function () {
  $(".toggler").click(function () {
    $(this).next().toggleClass("collapsed");
    $(this).toggleClass("toggled"); // this just rotates the expander arrow
  });
});
.collapsible-wrapper {
  display: flex;
  overflow: hidden;
}
.collapsible-wrapper:after {
  content: '';
  height: 50px;
  transition: height 0.3s linear, max-height 0s 0.3s linear;
  max-height: 0px;
}
.collapsible {
  transition: margin-bottom 0.3s cubic-bezier(0, 0, 0, 1);
  margin-bottom: 0;
  max-height: 1000000px;
}
.collapsible-wrapper.collapsed > .collapsible {
  margin-bottom: -2000px;
  transition: margin-bottom 0.3s cubic-bezier(1, 0, 1, 1),
              visibility 0s 0.3s, max-height 0s 0.3s;
  visibility: hidden;
  max-height: 0;
}
.collapsible-wrapper.collapsed:after
{
  height: 0;
  transition: height 0.3s linear;
  max-height: 50px;
}

/* END of the collapsible implementation; the stuff below
   is just styling for this demo */

#container {
  display: flex;
  align-items: flex-start;
  max-width: 1000px;
  margin: 0 auto;
}  


.menu {
  border: 1px solid #ccc;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
  margin: 20px;

  
}

.menu-item {
  display: block;
  background: linear-gradient(to bottom, #fff 0%,#eee 100%);
  margin: 0;
  padding: 1em;
  line-height: 1.3;
}
.collapsible .menu-item {
  border-left: 2px solid #888;
  border-right: 2px solid #888;
  background: linear-gradient(to bottom, #eee 0%,#ddd 100%);
}
.menu-item.toggler {
  background: linear-gradient(to bottom, #aaa 0%,#888 100%);
  color: white;
  cursor: pointer;
}
.menu-item.toggler:before {
  content: '';
  display: block;
  border-left: 8px solid white;
  border-top: 8px solid transparent;
  border-bottom: 8px solid transparent;
  width: 0;
  height: 0;
  float: right;
  transition: transform 0.3s ease-out;
}
.menu-item.toggler.toggled:before {
  transform: rotate(90deg);
}

body { font-family: sans-serif; font-size: 14px; }

*, *:after {
  box-sizing: border-box;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="container">
  <div class="menu">
    <div class="menu-item">Something involving a holodeck</div>
    <div class="menu-item">Send an away team</div>
    <div class="menu-item toggler">Advanced solutions</div>
    <div class="collapsible-wrapper collapsed">
      <div class="collapsible">
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
        <div class="menu-item">Ask Worf</div>
        <div class="menu-item">Something involving Wesley, the 19th century, and a holodeck</div>
        <div class="menu-item">Ask Q for help</div>
      </div>
    </div>
    <div class="menu-item">Sweet-talk the alien aggressor</div>
    <div class="menu-item">Re-route power from auxiliary systems</div>
  </div>

  <div class="menu">
    <div class="menu-item">Something involving a holodeck</div>
    <div class="menu-item">Send an away team</div>
    <div class="menu-item toggler">Advanced solutions</div>
    <div class="collapsible-wrapper collapsed">
      <div class="collapsible">
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
      </div>
    </div>
    <div class="menu-item">Sweet-talk the alien aggressor</div>
    <div class="menu-item">Re-route power from auxiliary systems</div>
  </div>

  <div class="menu">
    <div class="menu-item">Something involving a holodeck</div>
    <div class="menu-item">Send an away team</div>
    <div class="menu-item toggler">Advanced solutions</div>
    <div class="collapsible-wrapper collapsed">
      <div class="collapsible">
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
        <div class="menu-item">Ask Worf</div>
        <div class="menu-item">Something involving Wesley, the 19th century, and a holodeck</div>
        <div class="menu-item">Ask Q for help</div>
        <div class="menu-item">Separate saucer</div>
        <div class="menu-item">Send an away team that includes the captain (despite Riker's protest)</div>
        <div class="menu-item">Ask Worf</div>
        <div class="menu-item">Something involving Wesley, the 19th century, and a holodeck</div>
        <div class="menu-item">Ask Q for help</div>
      </div>
    </div>
    <div class="menu-item">Sweet-talk the alien aggressor</div>
    <div class="menu-item">Re-route power from auxiliary systems</div>
  </div>

</div>

यह कैसे काम करता है?

वास्तव में ऐसा होने में दो संक्रमण शामिल हैं। उनमें से एक ढह गई स्थिति margin-bottomमें 0px (विस्तारित अवस्था में) से संक्रमण करता है ( इस उत्तर के-2000px समान )। 2000 यहाँ पहली जादुई संख्या है, यह इस धारणा पर आधारित है कि आपका बॉक्स इससे अधिक नहीं होगा (2000 पिक्सेल एक उचित विकल्प की तरह लगता है)।

margin-bottomअकेले संक्रमण द्वारा दो मुद्दों का उपयोग करना :

  • यदि आपके पास वास्तव में एक बॉक्स है जो 2000 पिक्सेल से अधिक है, तो margin-bottom: -2000pxसब कुछ नहीं छिपाएगा - ढह गए मामले में भी सामान दिखाई देगा। यह एक मामूली सुधार है जिसे हम बाद में करेंगे।
  • यदि वास्तविक बॉक्स, 1000 पिक्सेल ऊंचा है, और आपका संक्रमण 300ms लंबा है, तो दृश्यमान संक्रमण लगभग 150ms (या, विपरीत दिशा में, 150ms देर से शुरू होता है) के बाद पहले से ही खत्म हो गया है।

इस दूसरे मुद्दे को ठीक करना वह जगह है जहाँ दूसरा संक्रमण आता है, और यह संक्रमण अवधारणात्मक रूप से आवरण की न्यूनतम ऊँचाई को लक्षित करता है ("वैचारिक रूप से" क्योंकि हम वास्तव में इसके लिए min-heightसंपत्ति का उपयोग नहीं कर रहे हैं; उस पर और बाद में)।

यहां एक एनीमेशन है जो दिखाता है कि न्यूनतम ऊंचाई संक्रमण के साथ नीचे के मार्जिन संक्रमण को कैसे जोड़ा जाए, दोनों समान अवधि में, हमें पूर्ण ऊंचाई से शून्य ऊंचाई तक एक संयुक्त संक्रमण देता है जिसमें समान अवधि होती है।

जैसा कि ऊपर वर्णित एनीमेशन

बाएं पट्टी से पता चलता है कि नकारात्मक ऊंचाई मार्जिन नीचे की ओर कैसे ऊपर की ओर धकेलती है, दृश्यमान ऊंचाई को कम करती है। मध्य पट्टी दिखाती है कि न्यूनतम ऊंचाई कैसे सुनिश्चित करती है कि ढहने के मामले में, संक्रमण जल्दी समाप्त नहीं होता है, और विस्तार के मामले में, संक्रमण देर से शुरू नहीं होता है। सही बार से पता चलता है कि कैसे दोनो के संयोजन से बॉक्स सही समय पर पूरी ऊंचाई से शून्य ऊंचाई तक संक्रमण का कारण बनता है।

अपने डेमो के लिए मैं ऊपरी न्यूनतम मूल्य के रूप में 50px पर बस गया हूं। यह दूसरा मैजिक नंबर है, और यह बॉक्स की ऊंचाई से कम होना चाहिए। 50px उचित भी लगता है; ऐसा लगता नहीं है कि आप अक्सर एक ऐसा तत्व बनाना चाहते हैं जो पहले से 50 पिक्सेल ऊंचा न हो।

जैसा कि आप एनीमेशन में देख सकते हैं, परिणामस्वरूप परिवर्तन निरंतर है, लेकिन यह अलग नहीं है - उस समय जब न्यूनतम ऊंचाई पूरी मार्जिन के नीचे समायोजित मार्जिन के बराबर होती है, गति में अचानक बदलाव होता है। यह एनीमेशन में बहुत ध्यान देने योग्य है क्योंकि यह दोनों बदलावों के लिए एक रेखीय समय समारोह का उपयोग करता है, और क्योंकि संपूर्ण संक्रमण बहुत धीमा है। वास्तविक मामले में (शीर्ष पर मेरा डेमो), संक्रमण केवल 300ms लेता है, और निचला मार्जिन संक्रमण रैखिक नहीं है। मैंने दोनों संक्रमणों के लिए बहुत सारे अलग-अलग समय के कार्यों के साथ खेला है, और जिन लोगों ने मुझे महसूस किया कि वे विभिन्न प्रकार के मामलों के लिए सबसे अच्छा काम करते हैं।

दो समस्याओं को दूर करने के लिए:

  1. ऊपर से बिंदु, जहां 2000 से अधिक पिक्सेल ऊंचाई के बक्से पूरी तरह से ढह स्थिति में छिपे नहीं हैं,
  2. और रिवर्स समस्या, जहां गैर-छिपे मामले में, 50 पिक्सेल से कम ऊंचाई के बक्से संक्रमण के न होने पर भी बहुत अधिक होते हैं, क्योंकि न्यूनतम ऊंचाई उन्हें 50 पिक्सेल पर रखती है।

हम कंटेनर समस्या को एक max-height: 0टूटे हुए मामले में एक 0s 0.3sसंक्रमण के साथ देकर पहली समस्या को हल करते हैं । इसका मतलब यह है कि यह वास्तव में एक संक्रमण नहीं है, लेकिन इसे max-heightदेरी से लागू किया जाता है; संक्रमण समाप्त होने के बाद ही यह लागू होता है। इसके लिए सही तरीके से काम करने के लिए, हमें max-heightविपरीत, गैर-ढहने वाले, राज्य के लिए एक संख्यात्मक चुनने की भी आवश्यकता है । लेकिन 2000px मामले के विपरीत, जहां बहुत बड़ी संख्या में संक्रमण की गुणवत्ता को प्रभावित करता है, इस मामले में, यह वास्तव में कोई फर्क नहीं पड़ता। इसलिए हम केवल एक संख्या चुन सकते हैं जो इतनी अधिक हो कि हम जान सकें कि कोई भी ऊंचाई कभी भी इसके करीब नहीं आएगी। मैंने एक लाख पिक्सेल उठाए। यदि आपको लगता है कि आपको एक मिलियन पिक्सेल से अधिक की ऊंचाई की सामग्री का समर्थन करने की आवश्यकता हो सकती है, तो 1) मुझे क्षमा करें, और 2) बस एक जोड़ी शून्य जोड़ें।

दूसरी समस्या यही कारण है कि हम वास्तव min-heightमें न्यूनतम ऊंचाई संक्रमण के लिए उपयोग नहीं कर रहे हैं । इसके बजाय, ::afterकंटेनर में एक छद्म तत्व है जिसमें height50px से शून्य तक संक्रमण होता है। इसका एक ही प्रभाव होता है min-height: यह वर्तमान में जो भी छद्म तत्व है उसे ऊंचाई से नीचे कंटेनर को सिकुड़ने नहीं देगा। लेकिन क्योंकि हम उपयोग कर रहे हैं height, नहीं min-height, हम अब max-heightसंक्रमण के समाप्त होने के बाद छद्म तत्व की वास्तविक ऊंचाई को शून्य पर सेट करने के लिए (एक बार फिर देरी के साथ लागू) का उपयोग कर सकते हैं , यह सुनिश्चित करते हुए कि संक्रमण के बाहर कम से कम, यहां तक ​​कि छोटे तत्व भी हैं सही ऊंचाई। क्योंकि min-heightहै मजबूत की तुलना में max-height, इस अगर हम इस्तेमाल किया कार्य नहीं करेगा कंटेनर है min-heightबजाय छद्म तत्व केheight। वैसे ही जैसे max-heightपिछले पैराग्राफ में, इस max-heightभी संक्रमण के विपरीत छोर के लिए एक मूल्य की जरूरत है। लेकिन इस मामले में हम सिर्फ 50px ले सकते हैं।

Chrome (Win, Mac, Android, iOS), Firefox (Win, Mac, Android), Edge, IE11 (मेरे डेमो के साथ फ्लेक्सबॉक्स लेआउट समस्या को छोड़कर जो मैंने डिबगिंग को परेशान नहीं किया) और सफारी (Mac, iOS) में परीक्षण किया गया )। फ्लेक्सबॉक्स की बात करें तो, यह काम किसी भी फ्लेक्सबॉक्स का उपयोग किए बिना करना संभव होना चाहिए; वास्तव में मुझे लगता है कि आप IE7 में लगभग सब कुछ काम कर सकते हैं - इस तथ्य को छोड़कर कि आपके पास सीएसएस बदलाव नहीं होंगे, जिससे यह एक बेकार व्यायाम हो जाएगा।


35
मैं चाहता हूं कि आप अपने समाधान को छोटा (सरल) कर सकते हैं, या कम से कम कोड उदाहरण - ऐसा लगता है कि कोड उदाहरण का 90% आपके उत्तर के लिए प्रासंगिक नहीं है।
गिल एप्सटेन जूल

अगर collapsible-wrapperकोई स्थिति निरपेक्ष है तो क्या इन बदलावों को काम करने का कोई तरीका है । overflow: hiddenमाता-पिता पर संक्रमण लेकिन पूरी तरह से तैनात तत्वों के साथ हस्तक्षेप के लिए आवश्यक है।
दोपहर 12:00

1
@pmkro हाँ, मैं उस समस्या के रूप में अच्छी तरह से किया है। मैंने clip-path: polygon(...)इसके बजाय इसका उपयोग करके हल किया overflow: hidden, क्योंकि उत्तरार्द्ध के विपरीत, आप पूर्व को परिवर्तित कर सकते हैं। पुराने ब्राउज़रों के लिए गिरावट के रूप में मैंने एक अतिरिक्त स्केलिंग परिवर्तन का उपयोग किया। के शीर्ष पर टिप्पणी देखें github.com/StackExchange/Stacks/blob/develop/lib/css/components/...
balpha

2
अच्छा लगा। यह वास्तव में अच्छी तरह से काम करता है। स्वीकृत उत्तर होना चाहिए
हेनरी इंग-सिमंस

83

आप गैर-शब्दार्थ गुड़-पोकरी के साथ थोड़ा सा कर सकते हैं। मेरा सामान्य दृष्टिकोण बाहरी DIV की ऊंचाई को चेतन करना है जिसमें एक एकल बच्चा है जो एक शैली-कम DIV है जिसका उपयोग केवल सामग्री की ऊँचाई को मापने के लिए किया जाता है।

function growDiv() {
  var growDiv = document.getElementById('grow');
  if (growDiv.clientHeight) {
    growDiv.style.height = 0;
  } else {
    var wrapper = document.querySelector('.measuringWrapper');
    growDiv.style.height = wrapper.clientHeight + "px";
  }
}
#grow {
  -moz-transition: height .5s;
  -ms-transition: height .5s;
  -o-transition: height .5s;
  -webkit-transition: height .5s;
  transition: height .5s;
  height: 0;
  overflow: hidden;
  outline: 1px solid red;
}
<input type="button" onclick="growDiv()" value="grow">
<div id='grow'>
  <div class='measuringWrapper'>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
    <div>
      The contents of my div.
    </div>
  </div>
</div>

एक बस के साथ दूर करने में सक्षम होना चाहते हैं .measuringWrapperऔर बस ऑटो को DIV की ऊंचाई निर्धारित करते हैं और उस चेतन है, लेकिन यह काम करने के लिए प्रतीत नहीं होता है (ऊंचाई सेट हो जाता है, लेकिन कोई एनीमेशन नहीं होता है)।

function growDiv() {
  var growDiv = document.getElementById('grow');
  if (growDiv.clientHeight) {
    growDiv.style.height = 0;
  } else {
    growDiv.style.height = 'auto';
  }
}
#grow {
  -moz-transition: height .5s;
  -ms-transition: height .5s;
  -o-transition: height .5s;
  -webkit-transition: height .5s;
  transition: height .5s;
  height: 0;
  overflow: hidden;
  outline: 1px solid red;
}
<input type="button" onclick="growDiv()" value="grow">
<div id='grow'>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
  <div>
    The contents of my div.
  </div>
</div>

मेरी व्याख्या यह है कि एनीमेशन को चलाने के लिए एक स्पष्ट ऊंचाई की आवश्यकता है। आप ऊंचाई पर एक एनीमेशन नहीं प्राप्त कर सकते हैं जब ऊंचाई (शुरुआत या अंत ऊंचाई) या तो है auto


10
चूंकि यह जावास्क्रिप्ट पर निर्भर करता है, आप जावास्क्रिप्ट को भी आसानी से मापने वाला जोड़ सकते हैं!
क्विक्रेडफॉक्स

18
आप इसे बिना रैपर के भी कर सकते हैं। बस: फ़ंक्शन ग्रोवडिव () {वर ग्रोडिव = डॉक्यूमेंट.गेटईमेंटबायआईड ('ग्रो ’); if (growDiv.clientHeight) {growDiv.style.height = 0; } और {growDiv.style.height = growDiv.scrollHeight + 'px'; }}
user1742529

8
इसे देखें ... एक सरल उत्तर के बारे में बात करें jsfiddle.net/n5XfG/2596 ... आपका जवाब बिना किसी अच्छे कारण के पागलपनपूर्ण है। कोई ज़रूरत नहीं है max-height, कोई ज़रूरत नहीं है auto, और विशेष रूप से जावास्क्रिप्ट की कोई ज़रूरत नहीं है !! बस दो सरल घोषणाएँ
VIDesignz

12
@VIDesignz आप मार्जिन पर चेतन हैं: 100%। यह तत्व की चौड़ाई का 100% है , इसकी ऊंचाई नहीं! इसका मतलब है, अगर आपके पास चौड़ाई से अधिक ऊंचाई वाला एक तत्व है, तो यह इसे छिपाएगा नहीं। इसके अलावा, वास्तविक एनीमेशन गति परिभाषित की गई तुलना में पूरी तरह से अलग है।
तिमो तुर्स्चमन

3
जब तक मैं टिमो की टिप्पणी के बारे में अधिक नहीं पढ़ता, तब तक मैं वीडिजेनज़ के उत्तर के बारे में उत्साहित था। हां, margin-top(और margin-bottom) प्रतिशत में परिभाषित होने पर चौड़ाई के सापेक्ष हैं, हां यह बेवकूफी है, लेकिन यह भी बताता है कि खुले और करीबी एनीमेशन समय पूरी तरह से अलग क्यों हैं - यह वही चीज है जिसे आप टॉप-रेटेड उत्तर में देखते हैं, एक कठिन निर्दिष्ट करता है। -कोडेड अधिकतम-ऊंचाई। यह सही करने के लिए इतना कठिन क्यों है?
कोडर

52

CSS3 संक्रमणों का उपयोग करके ऊंचाई को एनिमेट करने का एक दृश्य समाधान इसके बजाय पैडिंग को चेतन करना है।

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

div {
    height: 0;
    overflow: hidden;
    padding: 0 18px;
    -webkit-transition: all .5s ease;
       -moz-transition: all .5s ease;
            transition: all .5s ease;
}
div.animated {
    height: auto;
    padding: 24px 18px;
}

http://jsfiddle.net/catharsis/n5XfG/17/ (स्टीफ़बैंड के ऊपर jsFiddle से रिफ़्ड)


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

17
सिवाय इसके कि यहाँ आप ऊंचाई को बिल्कुल भी नहीं समझ रहे हैं। आप पैडिंग को एनिमेट कर रहे हैं ... यह ठीक ठीक गायब हो सकता है क्योंकि यह वर्तमान स्थिति से नीचे 0 पर चेतन कर सकता है, लेकिन अगर आप बारीकी से देखते हैं तो यह पाठ के साथ खुलता है और फिर पैडिंग केवल एनिमेट करता है .. क्योंकि यह doesn पता नहीं कैसे 0 से ऑटो चेतन करने के लिए .... यह एक संख्यात्मक रेंज की जरूरत है ... कि कैसे काम करता है।
रॉब आर

यह एक अच्छा वर्कअराउंड है जो हैक नहीं है। यह इस सवाल का सबसे अच्छा जवाब नहीं है , लेकिन यह एक विकल्प है जो मेरे लिए काम करता है। कभी-कभी आपको कुछ ऊंचाई एनीमेशन के प्रभाव की आवश्यकता होती है, न कि पूर्ण एनीमेशन :)
इवान डर्स्ट

संक्रमण विलम्ब का उपयोग करते समय यह समाधान भी विफल हो जाता है।
मिशेल जोनिसे

मैं यह भी मानता हूं कि यह समाधान एक स्वच्छ समाधान है जो काफी तरल संक्रमण प्रदान करता है यदि आपका एनीमेशन पर्याप्त तेज है (मेरे मामले में 0.1 के संक्रमण के साथ एक समझौते के लिए यह एकदम सही है!)। यह बहुत सारे अनुप्रयोगों के अनुरूप है, लेकिन न तो अन्य प्रश्न करने वाले इस सवाल का जवाब देंगे!
रेमी डी

46

मेरा वर्कअराउंड एक अच्छी चिकनी एनीमेशन के लिए सटीक सामग्री ऊंचाई पर अधिकतम-ऊँचाई में संक्रमण करना है, फिर एक संक्रमण कॉलबैक का उपयोग करके अधिकतम ऊँचाई 9999px पर सेट करें ताकि सामग्री स्वतंत्र रूप से आकार बदल सके।

var content = $('#content');
content.inner = $('#content .inner'); // inner div needed to get size of content when closed

// css transition callback
content.on('transitionEnd webkitTransitionEnd transitionend oTransitionEnd msTransitionEnd', function(e){
    if(content.hasClass('open')){
        content.css('max-height', 9999); // try setting this to 'none'... I dare you!
    }
});

$('#toggle').on('click', function(e){
    content.toggleClass('open closed');
    content.contentHeight = content.outerHeight();
    
    if(content.hasClass('closed')){
        
        // disable transitions & set max-height to content height
        content.removeClass('transitions').css('max-height', content.contentHeight);
        setTimeout(function(){
            
            // enable & start transition
            content.addClass('transitions').css({
                'max-height': 0,
                'opacity': 0
            });
            
        }, 10); // 10ms timeout is the secret ingredient for disabling/enabling transitions
        // chrome only needs 1ms but FF needs ~10ms or it chokes on the first animation for some reason
        
    }else if(content.hasClass('open')){  
        
        content.contentHeight += content.inner.outerHeight(); // if closed, add inner height to content height
        content.css({
            'max-height': content.contentHeight,
            'opacity': 1
        });
        
    }
});
.transitions {
    transition: all 0.5s ease-in-out;
    -webkit-transition: all 0.5s ease-in-out;
    -moz-transition: all 0.5s ease-in-out;
}

body {
    font-family:Arial;
    line-height: 3ex;
}
code {
    display: inline-block;
    background: #fafafa;
    padding: 0 1ex;
}
#toggle {
    display:block;
    padding:10px;
    margin:10px auto;
    text-align:center;
    width:30ex;
}
#content {
    overflow:hidden;
    margin:10px;
    border:1px solid #666;
    background:#efefef;
    opacity:1;
}
#content .inner {
    padding:10px;
    overflow:auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<div id="content" class="open">
    <div class="inner">
        <h3>Smooth CSS Transitions Between <code>height: 0</code> and <code>height: auto</code></h3>
        <p>A clever workaround is to use <code>max-height</code> instead of <code>height</code>, and set it to something bigger than your content. Problem is the browser uses this value to calculate transition duration. So if you set it to <code>max-height: 1000px</code> but the content is only 100px high, the animation will be 10x too fast.</p>
        <p>Another option is to measure the content height with JS and transition to that fixed value, but then you have to keep track of the content and manually resize it if it changes.</p>
        <p>This solution is a hybrid of the two - transition to the measured content height, then set it to <code>max-height: 9999px</code> after the transition for fluid content sizing.</p>
    </div>
</div>

<br />

<button id="toggle">Challenge Accepted!</button>


14
@ Derija93 यह सादे पुराने जावास्क्रिप्ट टाइमआउट एनिमेशन का उपयोग कर रहा है। इसके बजाय CSS3 के बदलावों का उपयोग करने की चुनौती है।
एडम

3
सही है। लेकिन आप अपने उदाहरण में, "CSS3 के संक्रमण" का उपयोग क्यों करेंगे, यदि आप अपने उदाहरण में, पहले से ही jQuery का उपयोग कर रहे हैं, तो एक पुस्तकालय, जो "बहुत कम लिखता है, और अधिक" कोड वैसे भी प्रदान करता है? मैं यह बताना चाहता था कि आपका संस्करण बहुत बेहतर दिख सकता है, भले ही अधिक जटिल हो, अगर यह jQuery का उपयोग नहीं कर रहा था, तो यह वस्तुतः किसी भी वेबसाइट पर चल सकता है। मुझे लगता है कि मैंने इसे बहुत गलत कहा है। उसके लिए क्षमा चाहता हूँ। ;)
21

27
@ Derija93 शायद इसलिए क्योंकि CSS3 के संक्रमण (सभी स्रोतों के अनुसार मैं पा सकते हैं) jQuery एनिमेशन की तुलना में बहुत बेहतर प्रदर्शन है। (वास्तव में मेरे वर्तमान उपयोग के मामले के लिए बेहद मायने रखता है, जो मुझे यहां लाया है।)
मार्क अमेरी

4
@ Derija93 'कारण जावास्क्रिप्ट एनिमेशन CSS3 संक्रमण ब्रो की तुलना में धीरे-धीरे चलते हैं, और jQuery एनिमेशन के साथ आपको एनीमेशन लूप के बारे में चिंता करनी होगी। क्लिक पर कुछ चेतन करें, फिर तेज़ी से क्लिक करें और देखें कि एनिमेशन स्वयं को दोहराते हैं। इसे CSS3 के साथ संभाला गया है।
अल्बर्टबेलबेल

2
@ Dropped.on.Caprica यह अब थोड़ा पुराना है। मैंने पहले ही कहा कि मैंने उस अवधारणा को गलत समझा जो वह प्रदर्शित करने की कोशिश कर रहा था। वैसे भी, सरल एनिमेशन के .stopलिए, बल्कि जटिल एनीमेशन लूप समस्या के लिए चाल है। अब जब आप ऊंचाई और रंग चेतन करते हैं, लेकिन केवल ऊंचाई एनीमेशन को बाधित करना चाहते हैं, तो चीजें थोड़ी पेचीदा हो जाती हैं ... मुझे आपकी बात समझ में नहीं आती।
कियूर

43

स्वीकृत उत्तर अधिकांश मामलों के लिए काम करता है, लेकिन यह अच्छी तरह से काम नहीं करता है जब आपकी divऊंचाई में बहुत भिन्नता हो सकती है - एनीमेशन गति सामग्री की वास्तविक ऊंचाई पर निर्भर नहीं है, और यह तड़का हुआ लग सकता है।

आप अभी भी CSS के साथ वास्तविक एनीमेशन कर सकते हैं, लेकिन आपको उपयोग करने की कोशिश करने के बजाय, आइटम की ऊंचाई की गणना करने के लिए जावास्क्रिप्ट का उपयोग करने की आवश्यकता है auto। कोई jQuery की आवश्यकता नहीं है, हालांकि अगर आप संगतता चाहते हैं (क्रोम :) के नवीनतम संस्करण में काम करता है) तो आपको इसे थोड़ा संशोधित करना पड़ सकता है।

window.toggleExpand = function(element) {
    if (!element.style.height || element.style.height == '0px') { 
        element.style.height = Array.prototype.reduce.call(element.childNodes, function(p, c) {return p + (c.offsetHeight || 0);}, 0) + 'px';
    } else {
        element.style.height = '0px';
    }
}
#menu #list {
    height: 0px;
    transition: height 0.3s ease;
    background: #d5d5d5;
    overflow: hidden;
}
<div id="menu">
    <input value="Toggle list" type="button" onclick="toggleExpand(document.getElementById('list'));">
    <ul id="list">
        <!-- Works well with dynamically-sized content. -->
        <li>item</li>
        <li><div style="height: 100px; width: 100px; background: red;"></div></li>
        <li>item</li>
        <li>item</li>
        <li>item</li>
    </ul>
</div>


यह मददगार हो सकता है, लेकिन मैं नहीं बता सकता क्योंकि मैं नहीं जानता कि बेहतर उदाहरण के बिना इसका उपयोग कैसे किया जाए।
इवान डर्स्ट

1
आप बस किसी भी DOM एलिमेंट (उदाहरण के लिए, document.getElementById('mydiv')या $('#mydiv').get()) और फ़ंक्शन को छुपाने / दिखाने के बीच टॉगल करते हैं। यदि आप सीएसएस संक्रमण सेट करते हैं, तो तत्व स्वचालित रूप से चेतन करेगा।
ओलेग वासकेविच

मैंने एक स्निपेट जोड़ा। यह गतिशील रूप से आकार की सामग्री के लिए अच्छी तरह से काम करने का लाभ है।
ओलेग वास्केविच

3
-1, चूंकि यह "CSS का उपयोग" नहीं है। प्रश्न का बिंदु जेएस-मुक्त समाधान के लिए है। मुझे लगता है कि "सही" उत्तर, यह हैक नहीं है, हालांकि यह होगा ...
dudewad

16
जेएस के उपयोग के लिए डाउनवोट - गंभीरता से? यहां आधे उत्तर जेएस का उपयोग करते हैं, इसलिए आपका पतन उचित या आवश्यक नहीं लगता है। इसके अलावा, यह उत्तर वास्तविक एनीमेशन को करने के लिए अभी भी सीएसएस का उपयोग कर रहा है, जो आईएमओ ओपी का बिंदु था। केवल एक चीज जो जेएस के लिए उपयोग की जाती है वह वास्तविक ऊंचाई की गणना करना है, क्योंकि शुद्ध सीएसएस के साथ ऐसा करना असंभव है (और min-heightअपेक्षित उत्तर के रूप में सेटिंग एनीमेशन गति के साथ समस्याओं का कारण बनता है जब सूची का आकार बहुत भिन्न हो सकता है)।
ओलेग वासकेविच

30

Element.scrollHeightसंपत्ति का बहुत कम उल्लेख था जो यहां उपयोगी हो सकता है और अभी भी शुद्ध सीएसएस संक्रमण के साथ उपयोग किया जा सकता है। संपत्ति में हमेशा एक तत्व की "पूर्ण" ऊंचाई शामिल होती है, भले ही उसकी सामग्री ढह गई ऊंचाई (जैसे height: 0) के परिणामस्वरूप उसकी सामग्री कैसे अधिक हो ।

जैसे, एक height: 0(प्रभावी रूप से पूरी तरह से ध्वस्त) तत्व के लिए, इसका "सामान्य" या "पूर्ण" ऊंचाई अभी भी इसके scrollHeightमूल्य (हमेशा की तरह पिक्सेल लंबाई) के माध्यम से आसानी से उपलब्ध है ।

इस तरह के एक तत्व के लिए, यह मानते हुए कि पहले से ही संक्रमण की स्थापना की गई है जैसे ( ulमूल प्रश्न के अनुसार):

ul {
    height: 0;
    transition: height 1s; /* An example transition. */
}

हम सीएसएस का उपयोग करते हुए वांछित एनिमेटेड "विस्तार" को ट्रिगर कर सकते हैं, केवल कुछ इस तरह के साथ (निम्नलिखित मानकर ulसूची को संदर्भित करता है):

ul.style.height = ul.scrollHeight + "px";

बस। यदि आपको सूची को गिराने की आवश्यकता है, तो दोनों में से कोई एक निम्नलिखित कथन करेगा:

ul.style.height = "0";
ul.style.removeProperty("height");

मेरे विशेष उपयोग का मामला अज्ञात और अक्सर काफी लंबाई की एनिमेटिंग सूचियों के इर्द-गिर्द घूमता है, इसलिए मैं मनमाने ढंग से "बड़े पर्याप्त" heightया max-heightविनिर्देशन को निपटाने में सहज नहीं था और कट-ऑफ सामग्री या सामग्री को जोखिम में डालना जिसे आपको अचानक स्क्रॉल करने की आवश्यकता होती है (यदि overflow: auto, उदाहरण के लिए) । इसके अतिरिक्त, सहजता और समय- max-heightआधारित समाधानों के साथ टूट गया है , क्योंकि उपयोग की गई ऊंचाई अपने अधिकतम मूल्य तक पहुंच सकती है जितनी जल्दी यह max-heightपहुंचने के लिए ले जाएगा 9999px। और जैसे-जैसे स्क्रीन रिज़ॉल्यूशन बढ़ता है, पिक्सेल लंबाई 9999pxमेरे मुंह में खराब स्वाद छोड़ती है। यह विशेष समाधान मेरी राय में, सुरुचिपूर्ण ढंग से समस्या को हल करता है।

अंत में, यहाँ उम्मीद है कि सीएसएस पता लेखकों के भविष्य के संशोधनों को इस तरह की चीजों को और भी सुरुचिपूर्ण ढंग से करने की आवश्यकता है - "गणना" बनाम "उपयोग किए गए" और "हल" मूल्यों की धारणा को फिर से देखें, और विचार करें कि क्या गणना कंप्यूट पर लागू होनी चाहिए ( widthऔर heightवर्तमान में एक विशेष उपचार का एक सा मिलता है) के साथ संक्रमण सहित मूल्यों , .


6
आपको यह अन्य उत्तरों में नहीं मिला, क्योंकि Element.scrollHeightप्रॉपर्टी का उपयोग करते हुए DOM के साथ बातचीत के लिए जावास्क्रिप्ट की आवश्यकता होती है और, जैसा कि प्रश्न स्पष्ट रूप से बताता है, वे जावास्क्रिप्ट के बिना ऐसा करना चाहते हैं ।
TylerH

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

29

max-heightप्रत्येक राज्य के लिए अलग-अलग संक्रमण सहजता और देरी के साथ उपयोग करें ।

HTML:

<a href="#" id="trigger">Hover</a>
<ul id="toggled">
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
<ul>

सीएसएस:

#toggled{
    max-height: 0px;
    transition: max-height .8s cubic-bezier(0, 1, 0, 1) -.1s;
}

#trigger:hover + #toggled{
    max-height: 9999px;
    transition-timing-function: cubic-bezier(0.5, 0, 1, 0); 
    transition-delay: 0s;
}

उदाहरण देखें: http://jsfiddle.net/0hnjehjc/1/


12
यहां समस्या यह है कि यह सुनिश्चित करने के लिए कि आपके पास गतिशील वातावरण में पर्याप्त जगह है, आपको हास्यास्पद अधिकतम-ऊंचाइयों का उपयोग करने की आवश्यकता है 999999px। यह, दूसरी ओर, आपके एनीमेशन को स्थानांतरित कर देगा, क्योंकि इस मूल्य से फ्रेम की गणना की जाती है। तो आप एक दिशा में एनीमेशन "देरी" के साथ समाप्त हो सकते हैं और दूसरी दिशा में वास्तव में तेजी से समाप्त हो सकते हैं (क्रॉस: टाइमिंग-फ़ंक्शंस)
जूलियन एफ वेइनर्ट

29

कोई कठिन कोडित मूल्य नहीं।

कोई जावास्क्रिप्ट नहीं।

कोई अनुमान नहीं।

divब्राउज़र को समझने के लिए ट्रिक को एक छिपे हुए और डुप्लिकेट का उपयोग करने के लिए 100% का मतलब है।

यह विधि उपयुक्त है जब भी आप उस तत्व के DOM को डुप्लिकेट करने में सक्षम होते हैं जिसे आप चेतन करना चाहते हैं।

.outer {
  border: dashed red 1px;
  position: relative;
}

.dummy {
  visibility: hidden;
}

.real {
  position: absolute;
  background: yellow;
  height: 0;
  transition: height 0.5s;
  overflow: hidden;
}

.outer:hover>.real {
  height: 100%;
}
Hover over the box below:
<div class="outer">
  <!-- The actual element that you'd like to animate -->
  <div class="real">
unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable
content unpredictable content unpredictable content unpredictable content
  </div>
  <!-- An exact copy of the element you'd like to animate. -->
  <div class="dummy" aria-hidden="true">
unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable content unpredictable
content unpredictable content unpredictable content unpredictable content
  </div>
</div>


अच्छी तरह से किया - यह एक समस्या का एक वैध समाधान है जो वास्तव में मौजूद नहीं होना चाहिए। जब तक संक्रमण "रैखिक" पर सेट नहीं हो जाता है, तब तक अधिकतम-ऊँचाई को एनिमेट करना आधार है, यह CMS सामग्री को देखने के लिए बहुत बुरा है, जहाँ ऊंचाई परिवर्तनशील है।
M_Willett

यह चतुर है, लेकिन मैं इसके लिए DOM तत्वों और सामग्री की नकल करने में सहज नहीं होगा।
आंद्रे Figueiredo

आप बिना कन्टेनर के कंटेनर और अधिक परफॉर्मेंट के बिना इसे कर सकते हैं transform: scaleY(1), क्योंकि यह संक्रमण स्थान को नहीं हटाता है।
फैबियन वॉन एलर्ट्स

21

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

मैं उस मुद्दे से संतुष्ट नहीं था जो केवल max-heightऔर CSS3 के बदलाव का उपयोग करता है , क्योंकि कई टिप्पणीकारों ने उल्लेख किया है, आपको अपना max-heightमूल्य वास्तविक ऊंचाई के बहुत करीब सेट करना होगा या आपको देरी होगी। उस समस्या के उदाहरण के लिए यह JSField देखें ।

इसको प्राप्त करने के लिए (जबकि अभी भी कोई जावास्क्रिप्ट का उपयोग करते हुए), मैंने एक और HTML तत्व जोड़ा है जो transform: translateYCSS मान को परिवर्तित करता है ।

इसका मतलब है दोनों max-heightऔर translateYउपयोग किया जाता है: max-heightतत्व को नीचे के तत्वों को नीचे धकेलने की अनुमति देता है, जबकि translateY"तत्काल" प्रभाव देता है जिसे हम चाहते हैं। मुद्दा max-heightअभी भी मौजूद है, लेकिन इसका प्रभाव कम है। इसका मतलब है कि आप अपने max-heightमूल्य के लिए बहुत बड़ी ऊंचाई निर्धारित कर सकते हैं और इसके बारे में कम चिंता कर सकते हैं।

समग्र लाभ यह है कि संक्रमण (वापस) में संक्रमण पर, उपयोगकर्ता translateYएनीमेशन को तुरंत देखता है , इसलिए यह वास्तव में कोई फर्क नहीं पड़ता कि कितना समय max-heightलगता है।

फिडल के रूप में समाधान

body {
  font-family: sans-serif;
}

.toggle {
  position: relative;
  border: 2px solid #333;
  border-radius: 3px;
  margin: 5px;
  width: 200px;
}

.toggle-header {
  margin: 0;
  padding: 10px;
  background-color: #333;
  color: white;
  text-align: center;
  cursor: pointer;
}

.toggle-height {
  background-color: tomato;
  overflow: hidden;
  transition: max-height .6s ease;
  max-height: 0;
}

.toggle:hover .toggle-height {
  max-height: 1000px;
}

.toggle-transform {
  padding: 5px;
  color: white;
  transition: transform .4s ease;
  transform: translateY(-100%);
}

.toggle:hover .toggle-transform {
  transform: translateY(0);
}
<div class="toggle">
  <div class="toggle-header">
    Toggle!
  </div>
  <div class="toggle-height">
    <div class="toggle-transform">
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
    </div>
  </div>
</div>

<div class="toggle">
  <div class="toggle-header">
    Toggle!
  </div>
  <div class="toggle-height">
    <div class="toggle-transform">
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
      <p>Content!</p>
    </div>
  </div>
</div>


@Davidtaubmann की तुलना में, आपकी कलम मतभेदों को बहुत अच्छी तरह से दर्शाती है! मैं साथ चला गया translateYसे अधिक scaleहै क्योंकि मैं की तरह कैसे नहीं था scaleकि संपीड़न प्रभाव दे दी है।
एंड्रयू मेसियर

धन्यवाद @ andrew-messier, मैंने टिप्पणी को हटा दिया क्योंकि इसमें कोई गलती है, इसका अनुवाद codepen.io/davidtaubmann/pen/zKZvGP में excecuting नहीं है (क्योंकि इस कदम को करने के लिए कोई बच्चा नहीं है, एक फिक्स की आवश्यकता है) ... लेकिन इसमें एक हम पूरी तरह से केवल MAX-HEIGHT से तुलना कर सकते हैं और इसे बड़े पैमाने पर मिला सकते हैं (जैसा कि अन्य उत्तरों पर कहा गया है): codepen.io/davidtaubmann/pen/jrdPER । यह सब मुझे एक लक्ष्य पद्धति के साथ बहुत मदद कर रहा है
जिसका

18

ठीक है, तो मुझे लगता है कि मैं एक सुपर सरल उत्तर के साथ आया था ... नहीं max-height, relativeस्थिति का उपयोग करता है , liतत्वों पर काम करता है, और शुद्ध सीएसएस है। मैंने कुछ भी परीक्षण नहीं किया है, लेकिन फ़ायरफ़ॉक्स, हालांकि सीएसएस द्वारा निर्णय लेते हुए, इसे सभी ब्राउज़रों पर काम करना चाहिए।

FIDDLE: http://jsfiddle.net/n5XfG/2596/

सीएसएस

.wrap { overflow:hidden; }

.inner {
            margin-top:-100%;
    -webkit-transition:margin-top 500ms;
            transition:margin-top 500ms;
}

.inner.open { margin-top:0px; }

एचटीएमएल

<div class="wrap">
    <div class="inner">Some Cool Content</div>
</div>

13
यह तब तक काम करेगा जब तक तत्व की ऊंचाई इसकी चौड़ाई से अधिक न हो जाए। यह प्रतिशत का उपयोग करके मार्जिन की गणना कैसे की जाती है इसका आधार है: वे तत्व की चौड़ाई के आधार पर गणना करते हैं। इसलिए यदि आपके पास 1000 px चौड़ा तत्व है, तो 1100 px पर एक तत्व इस समाधान के काम करने के लिए बहुत बड़ा होगा, जिसका अर्थ है कि आपको उस नकारात्मक शीर्ष मार्जिन को बढ़ाना होगा। मूल रूप से, यह ऊँचाई या अधिकतम-ऊँचाई का उपयोग करने के समान सटीक समस्या है।
ड्यूडवाड

15

संपादित करें: अद्यतन किए गए उत्तर के लिए नीचे स्क्रॉल करें
मैं एक ड्रॉप डाउन सूची बना रहा था और इस पोस्ट को देखा ... कई अलग-अलग उत्तर लेकिन मैंने अपनी ड्रॉप डाउन सूची को भी साझा करने का निर्णय लिया, ... यह सही नहीं है लेकिन कम से कम यह केवल सीएसएस के लिए उपयोग करेगा ड्रॉप डाउन! मैं परिवर्तन का उपयोग कर रहा हूं: सूची को देखने के लिए बदलने के लिए TranslY (y) ...
आप परीक्षण में अधिक देख सकते हैं
http://jsfiddle.net/BVEpc/4/
मैंने हर ली के पीछे div रखा है क्योंकि मेरी ड्रॉप डाउन सूची ऊपर से आ रही है और उन्हें ठीक से दिखाने के लिए यह आवश्यक था, मेरा div कोड है:

#menu div {
    transition: 0.5s 1s;
    z-index:-1;
    -webkit-transform:translateY(-100%);
    -webkit-transform-origin: top;
}

और हॉवर है:

#menu > li:hover div {
    transition: 0.5s;
    -webkit-transform:translateY(0);
}

और क्योंकि उल ऊंचाई सामग्री के लिए सेट है यह आपके शरीर की सामग्री पर प्राप्त कर सकता है यही कारण है कि मैंने उल के लिए यह किया है:

 #menu ul {
    transition: 0s 1.5s;
    visibility:hidden;
    overflow:hidden;
}

और मंडराना:

#menu > li:hover ul {
     transition:none;
     visibility:visible;
}

दूसरी बार संक्रमण के बाद देरी हो रही है और यह मेरी ड्रॉप डाउन सूची के एनिमेटिड रूप से बंद हो जाने के
बाद छिप जाएगा ... आशा है कि बाद में किसी को इस का लाभ मिलेगा।

संपादित करें: मैं बस विश्वास नहीं कर सकता कि वास्तव में इस प्रोटोटाइप का उपयोग पीपीएल! यह ड्रॉप डाउन मेनू केवल एक उप मेनू के लिए है और यह सब है !! मैंने एक बेहतर अपडेट किया है जिसमें IE 8 समर्थन के साथ ltr और rtl दोनों दिशाओं के लिए दो उप मेनू हो सकते हैं। आरटीएल के
लिए एलटीआर
फिडल के लिए फिडल
उम्मीद है कि किसी को भविष्य में यह उपयोगी लगे।


11

आप ऊँचाई से संक्रमण कर सकते हैं: 0 से ऊँचाई: ऑटो प्रदान करना जो आपको न्यूनतम ऊंचाई और अधिकतम ऊँचाई प्रदान करता है।

div.stretchy{
    transition: 1s linear;
}

div.stretchy.hidden{
    height: 0;
}

div.stretchy.visible{
    height: auto;
    min-height:40px;
    max-height:400px;
}

@ स्टार्स बैडमिंटन क्या आप काम करने का उदाहरण दे सकते हैं? मैंने इसे एक साथ रखा है, लेकिन यह कहीं भी काम नहीं करता है :( jsfiddle.net/gryzzly/n5XfG
Mish Reyzlin

5
समस्या आपके संक्रमण नियम के साथ है। काम करने के लिए इसे प्राप्त करने के लिए आपको संक्रमण को न्यूनतम और अधिकतम ऊंचाई पर भी लागू करना होगा। संक्रमण: ऊंचाई। 5 एस रैखिक, न्यूनतम ऊंचाई। 5 एस रैखिक, अधिकतम ऊंचाई। 5 एस रैखिक
स्टुअर्ट बैडमिंटन

2
यहाँ मैंने जो कुछ बाद में कहा है, जैसा कि आपने कहा, अधिकतम-ऊँचाई को चेतन करने के लिए ज़रूरी है: jsfiddle.net/gryzzly/n5XfG/3
Misha Reyzlin

11
बेशक, इसके साथ एक समस्या है। अधिकतम-ऊँचाई को तय करने में लगने वाला समय बॉक्स की ऑटो ऊँचाई पर संक्रमण करने में लगने वाला समय नहीं है: यह ऊँचाई पर पहुँचता है: ऑटो पहले, अधिकतम-ऊँचाई के एनिमेट करने से पहले। इसी तरह, 0 से संक्रमण करते समय, संक्रमण तुरंत शुरू नहीं होता है, क्योंकि अधिकतम ऊंचाई ऊंचाई पर शुरू होती है जो ऊंचाई से बड़ी होती है: ऑटो। अधिकतम-ऊंचाई पर संक्रमण: 1000px यह स्पष्ट करता है: jsfiddle.net/n5XfG/11
stephband

आप सही हैं, आगे के परीक्षण पर मैंने यह नोटिस किया। मुझे नहीं पता कि पूर्ण ऊंचाई: 0 से ऊंचाई: ऑटो कभी भी लागू किया जाएगा लेकिन कुछ स्थितियों में अधिकतम ऊंचाई का उपयोग करने से अकेले सीएसएस का उपयोग करके अन्यथा असंभव स्थिति का समाधान होता है।
स्टुअर्ट बैडमिंटन

10

फ्लेक्सबॉक्स समाधान

पेशेवरों:

  • सरल
  • नहीं जेएस
  • चिकनी संक्रमण

विपक्ष:

  • तत्व को एक निश्चित ऊंचाई फ्लेक्स कंटेनर में रखा जाना चाहिए

जिस तरह से यह काम करता है वह हमेशा फ्लेक्स-आधार होता है: सामग्री के साथ तत्व पर ऑटो, और इसके बजाय फ्लेक्स-ग्रो और फ्लेक्स-हटना का संक्रमण होता है।

संपादित करें: Xbox One इंटरफ़ेस से प्रेरित बेहतर JS Fiddle।

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  transition: 0.25s;
  font-family: monospace;
}

body {
  margin: 10px 0 0 10px;
}

.box {
  width: 150px;
  height: 150px;
  margin: 0 2px 10px 0;
  background: #2d333b;
  border: solid 10px #20262e;
  overflow: hidden;
  display: inline-flex;
  flex-direction: column;
}

.space {
  flex-basis: 100%;
  flex-grow: 1;
  flex-shrink: 0;    
}

p {
  flex-basis: auto;
  flex-grow: 0;
  flex-shrink: 1;
  background: #20262e;
  padding: 10px;
  width: 100%;
  text-align: left;
  color: white;
}

.box:hover .space {
  flex-grow: 0;
  flex-shrink: 1;
}
  
.box:hover p {
  flex-grow: 1;
  flex-shrink: 0;    
}
<div class="box">
  <div class="space"></div>
  <p>
    Super Metroid Prime Fusion
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    Resident Evil 2 Remake
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    Yolo The Game
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    Final Fantasy 7 Remake + All Additional DLC + Golden Tophat
  </p>
</div>
<div class="box">
  <div class="space"></div>
  <p>
    DerpVille
  </p>
</div>

जेएस फिडल


7

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

तो ली: होवर तब होता है जब माउस राज्य में प्रवेश करता है और फिर गैर-होवर की संपत्ति पर संक्रमण माउस छोड़ देगा।

उम्मीद है कि इससे कुछ मदद मिलेगी।

उदाहरण के लिए:

.sidemenu li ul {
   max-height: 0px;
   -webkit-transition: all .3s ease;
   -moz-transition: all .3s ease;
   -o-transition: all .3s ease;
   -ms-transition: all .3s ease;
   transition: all .3s ease;
}
.sidemenu li:hover ul {
    max-height: 500px;
    -webkit-transition: all 1s ease;
   -moz-transition: all 1s ease;
   -o-transition: all 1s ease;
   -ms-transition: all 1s ease;
   transition: all 1s ease;
}
/* Adjust speeds to the possible height of the list */

यहाँ एक पहेली है: http://jsfiddle.net/BukwJ/


1
मुझे नहीं पता कि यह -1 क्यों मिला। मुझे वास्तव में लगता है कि यह जावास्क्रिप्ट के भार को जोड़ने वाले कुछ लोगों की तुलना में बेहतर प्रयास है। यह एक सही समाधान नहीं है, लेकिन कुछ ट्वीकिंग के साथ यह एक अच्छा काम करता है, मैंने इसे रिटर्न वैल्यू के लिए काम करने के लिए पाया। संक्रमण: सभी 500ms क्यूबिक-बेज़ियर (0.000, 1.225, 0.085, 0.385); यह खोलने पर 2s संक्रमण पर आधारित था, फिर ऊपर की अवस्था प्रारंभिक अवस्था में वापस जाने के लिए। धन्यवाद ... इससे मुझे उपरोक्त सभी से बेहतर मदद मिली। +1 मैंने इस साइट का उपयोग bezier Matthewlein.com/ceaser
gcoulby

ठीक है, यह थोड़ा और अधिक tweaking लिया। संक्रमण: सभी 500ms क्यूबिक-बेज़ियर (0.000, 1.390, 0.000, 0.635); मुझे निर्दिष्ट करना चाहिए कि मेरा संक्रमण 5% -100% से चला जाता है (लेकिन वास्तव में अंतिम मूल्य लगभग 28% है) इसलिए यह परियोजना पर निर्भर करता है।
gcoulby 14

बिल्कुल, यह आदर्श नहीं है, लेकिन इसका एक त्वरित निर्धारण है यदि आप गोल के बारे में जानते हैं कि औसत ऊंचाई क्या होगी।
जामी

7

मुझे लगता है कि मैं वास्तव में ठोस समाधान के साथ आया हूं

ठीक! मुझे पता है कि यह समस्या इंटरनेट जितनी पुरानी है, लेकिन मुझे लगता है कि मेरे पास एक समाधान है, जिसे मैंने उत्परिवर्ती-संक्रमण नामक एक प्लगइन में बदल दिया । style=""जब भी DOM में कोई परिवर्तन होता है, तो मेरा समाधान ट्रैक किए गए तत्वों की विशेषताओं को निर्धारित करता है । अंतिम परिणाम यह है कि आप अपने संक्रमणों के लिए अच्छे ole CSS का उपयोग कर सकते हैं और हैकी फ़िक्स या विशेष जावास्क्रिप्ट का उपयोग नहीं कर सकते हैं। केवल एक चीज जो आपको करनी है, वह सेट है जिसे आप उपयोग करने वाले प्रश्न में तत्व पर ट्रैक करना चाहते हैं data-mutant-attributes="X"

<div data-mutant-attributes="height">                                                                      
        This is an example with mutant-transition                                                                                                          
    </div>

बस! यह समाधान DOM में परिवर्तनों का पालन करने के लिए MutationObserver का उपयोग करता है । इस वजह से, आपको वास्तव में कुछ भी सेट करने या जावास्क्रिप्ट को मैन्युअल रूप से चेतन चीजों का उपयोग करने की आवश्यकता नहीं है। परिवर्तन स्वचालित रूप से ट्रैक किए जाते हैं। हालाँकि, क्योंकि यह MutationObserver का उपयोग करता है, यह केवल IE11 + में संक्रमण करेगा।

Fiddles!


12
आमतौर पर, जब कोई पूछता है कि "जावास्क्रिप्ट के बिना" कुछ कैसे करना है, तो इसका मतलब है कि समाधान को उन ब्राउज़रों पर काम करना होगा जिनके पास जावास्क्रिप्ट अक्षम है। इसका मतलब यह नहीं है कि "अपनी स्क्रिप्ट लिखे बिना"। यह कहने के लिए कि आपके प्लगइन का उपयोग किया जा सकता है बिना जावास्क्रिप्ट का उपयोग करना सबसे अच्छा भ्रामक है - यह एक जावास्क्रिप्ट प्लगइन है।
BoltClock

मुझे स्पष्ट करना चाहिए, जब मैं कहता हूं कि आपको किसी विशेष जावास्क्रिप्ट का उपयोग करने की आवश्यकता नहीं है, तो मेरा मतलब है कि आपको किसी भी जावास्क्रिप्ट को लिखना नहीं है । बस JS लाइब्रेरी को शामिल करें और निर्दिष्ट करें कि आप HTML में कौन सी विशेषताएँ देखना चाहते हैं। आपको निश्चित ऊंचाई सीएसएस का उपयोग करने की आवश्यकता नहीं है, या कुछ भी पता लगाने की आवश्यकता नहीं है। बस शैली और जाओ।
जॉनट्रॉनकोसो

"(...) आपको वास्तव में कुछ भी सेट नहीं करना है या मैन्युअल रूप से चीजों को चेतन करने के लिए जावास्क्रिप्ट का उपयोग करना है (...)" इसलिए आप मज़े के लिए जावास्क्रिप्ट का उपयोग कर रहे हैं
रोको सी। बुल्जन

6

यहां किसी भी प्रारंभिक ऊंचाई से संक्रमण करने का एक तरीका है, जिसमें 0, ऑटो (पूर्ण आकार और लचीला) सहित, प्रति-नोड आधार पर हार्ड-सेट कोड की आवश्यकता के बिना या आरंभ करने के लिए किसी भी उपयोगकर्ता-कोड: https://github.com/csuwildcat / संक्रमण-ऑटो । यह मूल रूप से आप चाहते हैं कि पवित्र कब्र है, मुझे विश्वास है -> http://codepen.io/csuwldcat/pen/kwsdF । बस अपने पृष्ठ में निम्नलिखित जेएस फ़ाइल को थप्पड़ मारें, और उसके बाद आपको केवल एक बूलियन विशेषता को जोड़ना / निकालना है - reveal=""नोड्स से जिसे आप विस्तार और अनुबंध करना चाहते हैं।

यहां आपको उपयोगकर्ता के रूप में करने की आवश्यकता है, एक बार उदाहरण कोड के नीचे पाए गए कोड ब्लॉक को शामिल करें:

/*** Nothing out of the ordinary in your styles ***/
<style>
    div {
        height: 0;
        overflow: hidden;
        transition: height 1s;
    }
</style>

/*** Just add and remove one attribute and transition to/from auto! ***/

<div>
    I have tons of content and I am 0px in height you can't see me...
</div>

<div reveal>
     I have tons of content and I am 0px in height you can't see me...
     but now that you added the 'reveal' attribute, 
     I magically transitioned to full height!...
</div>

यहां आपके पृष्ठ में शामिल करने के लिए कोड ब्लॉक है, उसके बाद, यह सब ग्रेवी है:

इस जेएस फाइल को अपने पेज में छोड़ दें - यह सभी जस्ट वर्क्स ™ है

/ * ऊंचाई के लिए कोड: ऑटो; संक्रमण * /

(function(doc){

/* feature detection for browsers that report different values for scrollHeight when an element's overflow is hidden vs visible (Firefox, IE) */
var test = doc.documentElement.appendChild(doc.createElement('x-reveal-test'));
    test.innerHTML = '-';
    test.style.cssText = 'display: block !important; height: 0px !important; padding: 0px !important; font-size: 0px !important; border-width: 0px !important; line-height: 1px !important; overflow: hidden !important;';
var scroll = test.scrollHeight || 2;
doc.documentElement.removeChild(test);

var loading = true,
    numReg = /^([0-9]*\.?[0-9]*)(.*)/,
    skipFrame = function(fn){
      requestAnimationFrame(function(){
        requestAnimationFrame(fn);
      });
    },
    /* 2 out of 3 uses of this function are purely to work around Chrome's catastrophically busted implementation of auto value CSS transitioning */
    revealFrame = function(el, state, height){
        el.setAttribute('reveal-transition', 'frame');
        el.style.height = height;
        skipFrame(function(){
            el.setAttribute('reveal-transition', state);
            el.style.height = '';
        });
    },
    transitionend = function(e){
      var node = e.target;
      if (node.hasAttribute('reveal')) {
        if (node.getAttribute('reveal-transition') == 'running') revealFrame(node, 'complete', '');
      } 
      else {
        node.removeAttribute('reveal-transition');
        node.style.height = '';
      }
    },
    animationstart = function(e){
      var node = e.target,
          name = e.animationName;   
      if (name == 'reveal' || name == 'unreveal') {

        if (loading) return revealFrame(node, 'complete', 'auto');

        var style = getComputedStyle(node),
            offset = (Number(style.paddingTop.match(numReg)[1])) +
                     (Number(style.paddingBottom.match(numReg)[1])) +
                     (Number(style.borderTopWidth.match(numReg)[1])) +
                     (Number(style.borderBottomWidth.match(numReg)[1]));

        if (name == 'reveal'){
          node.setAttribute('reveal-transition', 'running');
          node.style.height = node.scrollHeight - (offset / scroll) + 'px';
        }
        else {
            if (node.getAttribute('reveal-transition') == 'running') node.style.height = '';
            else revealFrame(node, 'running', node.scrollHeight - offset + 'px');
        }
      }
    };

doc.addEventListener('animationstart', animationstart, false);
doc.addEventListener('MSAnimationStart', animationstart, false);
doc.addEventListener('webkitAnimationStart', animationstart, false);
doc.addEventListener('transitionend', transitionend, false);
doc.addEventListener('MSTransitionEnd', transitionend, false);
doc.addEventListener('webkitTransitionEnd', transitionend, false);

/*
    Batshit readyState/DOMContentLoaded code to dance around Webkit/Chrome animation auto-run weirdness on initial page load.
    If they fixed their code, you could just check for if(doc.readyState != 'complete') in animationstart's if(loading) check
*/
if (document.readyState == 'complete') {
    skipFrame(function(){
        loading = false;
    });
}
else document.addEventListener('DOMContentLoaded', function(e){
    skipFrame(function(){
        loading = false;
    });
}, false);

/* Styles that allow for 'reveal' attribute triggers */
var styles = doc.createElement('style'),
    t = 'transition: none; ',
    au = 'animation: reveal 0.001s; ',
    ar = 'animation: unreveal 0.001s; ',
    clip = ' { from { opacity: 0; } to { opacity: 1; } }',
    r = 'keyframes reveal' + clip,
    u = 'keyframes unreveal' + clip;

styles.textContent = '[reveal] { -ms-'+ au + '-webkit-'+ au +'-moz-'+ au + au +'}' +
    '[reveal-transition="frame"] { -ms-' + t + '-webkit-' + t + '-moz-' + t + t + 'height: auto; }' +
    '[reveal-transition="complete"] { height: auto; }' +
    '[reveal-transition]:not([reveal]) { -webkit-'+ ar +'-moz-'+ ar + ar +'}' +
    '@-ms-' + r + '@-webkit-' + r + '@-moz-' + r + r +
    '@-ms-' + u +'@-webkit-' + u + '@-moz-' + u + u;

doc.querySelector('head').appendChild(styles);

})(document);

/ * DEMO के लिए कोड * /

    document.addEventListener('click', function(e){
      if (e.target.nodeName == 'BUTTON') {
        var next = e.target.nextElementSibling;
        next.hasAttribute('reveal') ? next.removeAttribute('reveal') : next.setAttribute('reveal', '');
      }
    }, false);

9
हालांकि यह सुझाव दिया गया है कि दूसरों की तुलना में बहुत क्लीनर और लचीला समाधान है, मेरा व्यक्तिगत रूप से मानना ​​है कि यह कुछ ऐसा नहीं होना चाहिए जिसे जेएस को छूना चाहिए। यह कहना गलत नहीं है, यह सिर्फ एक उच्छ्वास है।
२०

@mystrdat हालांकि स्पष्ट होने के लिए, JS का उपयोग केवल कुछ स्थितियों को देखने के लिए किया जाता है और उन घटनाओं / स्थितियों के आधार पर कुछ जोड़े / अस्थायी CSS मानों को जोड़ा जाता है, जिन्हें वे देख रहे हैं। संक्रमण अभी भी सभी सीएसएस में किया गया है। हालांकि मैं सहमत हूं, यह दुख की बात है कि सेटअप का यह स्तर और हाथ से पकड़े जाने के लिए वास्तव में एक सरल उपयोग-मामले को संतुष्ट करना आवश्यक है! : /
csuwldcat

1
@KarolisRamanauskas नहीं, यह एक मुद्दा नहीं है - IE CSS Keyframes और requestAnimationFrame दोनों का समर्थन करता है। मैं clipअपनी डमी संपत्ति ट्रिगर के रूप में उपयोग कर रहा था , और किसी कारण से IE ने क्लिप को एनिमेटेड होने की अनुमति दे दी। मैंने अस्पष्टता पर स्विच किया, और यह सब फिर से काम करता है: codepen.io/csuwldcat/pen/FpzGa । मैंने मैच के उत्तर में कोड अपडेट किया है।
csuwldcat

1
@csuwldcat बहुत अच्छा समाधान, मैंने देखा कि सामग्री दिखाई देती है और एक छोटे से अंश के लिए गायब हो जाती है, ऐसा क्यों होता है? क्या यह टालने योग्य है?
बेतो एविगा

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

6

अधिकतम ऊंचाई को चेतन करने के लिए जेक का जवाब बहुत अच्छा है, लेकिन मुझे एक बड़ी अधिकतम ऊंचाई कष्टप्रद सेटिंग के कारण देरी हुई।

एक टूटी हुई सामग्री को एक आंतरिक div में स्थानांतरित कर सकता है और आंतरिक div की ऊंचाई प्राप्त करके अधिकतम ऊंचाई की गणना कर सकता है (JQuery के माध्यम से यह सबसे बाहरी होगा ())।

$('button').bind('click', function(e) { 
  e.preventDefault();
  w = $('#outer');
  if (w.hasClass('collapsed')) {
    w.css({ "max-height": $('#inner').outerHeight() + 'px' });
  } else {
    w.css({ "max-height": "0px" });
  }
  w.toggleClass('collapsed');
});

यहाँ एक jsfiddle लिंक है: http://jsfiddle.net/pbatey/duZpT

यहाँ आवश्यक न्यूनतम न्यूनतम मात्रा के साथ एक jsfield है: http://jsfiddle.net/8ncjjxh8/


5

मुझे लगता है कि यह धागा पुराना हो रहा है, लेकिन यह कुछ Google खोजों पर उच्च स्थान पर है इसलिए मुझे लगता है कि यह अपडेट करने लायक है।

आप भी तत्व की अपनी ऊँचाई प्राप्त / निर्धारित करते हैं:

var load_height = document.getElementById('target_box').clientHeight;
document.getElementById('target_box').style.height = load_height + 'px';

इनलाइन स्क्रिप्ट टैग में target_box के समापन टैग के तुरंत बाद आपको इस जावास्क्रिप्ट को डंप करना चाहिए।


document.getElementById ('target_box')। getBoundingClientRect (); height सबसे अच्छा करना चाहिए।
परिवर्तन

5

मैं ऐसा करने में सक्षम था। मैं एक है .childऔर एक .parentdiv। बच्चा दिव्यांग absoluteस्थिति के साथ माता-पिता की चौड़ाई / ऊंचाई के भीतर पूरी तरह से फिट बैठता है । मैं तो मूल्य नीचे translateधकेलने के लिए संपत्ति चेतन । इसकी बहुत चिकनी एनीमेशन, कोई glitches या नीचे किसी भी अन्य समाधान की तरह यहाँ नहीं है।Y100%

कुछ इस तरह, छद्म कोड

.parent{ position:relative; overflow:hidden; } 
/** shown state */
.child {
  position:absolute;top:0;:left:0;right:0;bottom:0;
  height: 100%;
  transition: transform @overlay-animation-duration ease-in-out;
  .translate(0, 0);
}

/** Animate to hidden by sliding down: */
.child.slidedown {
  .translate(0, 100%); /** Translate the element "out" the bottom of it's .scene container "mask" so its hidden */
}

आप एक निर्दिष्ट करना होगा heightपर .parentमें, px, %, या के रूप में छुट्टी auto। यह div तब div को मास्क करता है .childजब यह नीचे स्लाइड करता है।


इसके काम करने के उदाहरण को बहुत सराहा जाएगा।
न्यूरोट्रांसमीटर

5

मैंने कुछ जावास्क्रिप्ट के साथ एक उत्तर पोस्ट किया और नीचे उतर गया, इसलिए नाराज हो गया और फिर से कोशिश की, और इसे केवल सीएसएस के साथ क्रैक किया है!

यह समाधान कुछ 'तकनीकों' का उपयोग करता है:

  • padding-bottom:100%'हैक' जहां प्रतिशत तत्व की वर्तमान चौड़ाई के संदर्भ में परिभाषित किया गया है। इस तकनीक के बारे में अधिक जानकारी।
  • फ्लोट हटना-लपेटना, (फ्लोट क्लीयरिंग हैक को लागू करने के लिए एक अतिरिक्त div की आवश्यकता)
  • https://caniuse.com/#feat=css-writing-mode और इसे बदलने के लिए कुछ परिवर्तनों का अनिश्चित उपयोग (यह एक ऊर्ध्वाधर संदर्भ में ऊपर पेडिंग हैक के उपयोग की अनुमति देता है)

हालांकि यह उतावलापन है कि हम केवल सीएसएस का उपयोग करते हुए परफॉर्मिंग ट्रांज़िशनिंग प्राप्त करते हैं, और संक्रमण को आसानी से प्राप्त करने के लिए एक एकल संक्रमण फ़ंक्शन; पवित्र प्याला!

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

https://jsfiddle.net/EoghanM/n1rp3zb4/28/

body {
  padding: 1em;
}

.trigger {
  font-weight: bold;
}

/* .expander is there for float clearing purposes only */
.expander::after {
  content: '';
  display: table;
  clear: both;
}

.outer {
  float: left; /* purpose: shrink to fit content */
  border: 1px solid green;
  overflow: hidden;
}

.inner {
  transition: padding-bottom 0.3s ease-in-out;  /* or whatever crazy transition function you can come up with! */
  padding-bottom: 0%;  /* percentage padding is defined in terms of width. The width at this level is equal to the height of the content */
  height: 0;

  /* unfortunately, change of writing mode has other bad effects like orientation of cursor */
  writing-mode: vertical-rl;
  cursor: default; /* don't want the vertical-text (sideways I-beam) */
  transform: rotate(-90deg) translateX(-100%);  /* undo writing mode */
  transform-origin: 0 0;
  margin: 0;  /* left/right margins here will add to height */
}

.inner > div { white-space: nowrap; }

.expander:hover .inner,  /* to keep open when expanded */
.trigger:hover+.expander .inner {
  padding-bottom: 100%;
}
<div class="trigger">HoverMe</div>
<div class="expander">
  <div class="outer">
    <div class="inner">
      <div>First Item</div>
      <div>Content</div>
      <div>Content</div>
      <div>Content</div>
      <div>Long Content can't be wider than outer height unfortunately</div>
      <div>Last Item</div>
    </div>
  </div>
</div>
<div>
  after content</div>
</div>


इसका दूसरा पहलू यह है कि आप कर्सर को "होवरमे" डिव पर बंद नहीं कर सकते हैं ताकि उनके साथ बातचीत करने के लिए आइटम की सूची में (ओपी पूछ रहे कारण), इसलिए यह केवल टूलटिप फ़ंक्शन के बजाय उपयोगी है , नेस्टेड सबमेनस वाला मेनू।
टायलरएच

यह विशुद्ध रूप से उस तरह का परिणाम है जिस तरह से प्रश्न तैयार किया गया था और तकनीक से संबंधित नहीं है। आप अपनी इच्छा के input[type="checkbox"]:checkedबदले ट्रिगर को बदल सकते हैं :hover(यानी आप किसी भी वर्ग को जोड़ने के लिए जावास्क्रिप्ट का उपयोग नहीं करना चाहते हैं)
EoghanM

मेरा मतलब है, इस बात पर ध्यान दिए बिना कि प्रश्न कैसे तैयार किया जाता है, यदि किसी समाधान का कार्यान्वयन इतना सीमित है, तो इसका उल्लेख संभवतः उस समाधान के उत्तर में किया जाना चाहिए (या अधिमानतः हिसाब किया जाए )। आप इस समाधान का उल्लेख एक 'पवित्र कब्र' है, लेकिन संक्रमित div भी पर मंडराया नहीं जा सकता है ... मेरे लिए इस तरह के एक अंतिम समाधान की तरह प्रतीत नहीं होता है।
टायलरएच

हाय @ टायलर, माफी, मैंने इस तथ्य को याद किया कि मूल प्रश्न में ट्रिगर विस्तारित सूची को घेरता है, इसलिए सूची को हॉवर किए जाने पर खुला रहना चाहिए। मैंने इसे दर्शाने के लिए अपना उत्तर अपडेट कर दिया है। जैसा कि मैंने हालांकि उल्लेख किया है कि यह कैसे शुरू होता है, यह सब जर्मन नहीं है, जैसा कि मैं एक नई तकनीक प्रस्तुत कर रहा हूं जो पहले सीएसएस में ही संभव नहीं था (मैं कुछ वर्षों से समाधान की तलाश में हूं)।
EoghanM

4

यहाँ एक समाधान है जिसे मैंने सिर्फ jQuery के साथ संयोजन में उपयोग किया है। यह निम्न HTML संरचना के लिए काम करता है:

<nav id="main-nav">
    <ul>
        <li>
            <a class="main-link" href="yourlink.html">Link</a>
            <ul>
                <li><a href="yourlink.html">Sub Link</a></li>
            </ul>
        </li>
    </ul>
</nav>

और समारोह:

    $('#main-nav li ul').each(function(){
        $me = $(this);

        //Count the number of li elements in this UL
        var liCount = $me.find('li').size(),
        //Multiply the liCount by the height + the margin on each li
            ulHeight = liCount * 28;

        //Store height in the data-height attribute in the UL
        $me.attr("data-height", ulHeight);
    });

फिर आप उपयोग करने के लिए ऊँचाई सेट करने और निकालने के लिए एक क्लिक फ़ंक्शन का उपयोग कर सकते हैं css()

$('#main-nav li a.main-link').click(function(){
    //Collapse all submenus back to 0
    $('#main-nav li ul').removeAttr('style');

    $(this).parent().addClass('current');

    //Set height on current submenu to it's height
    var $currentUl = $('li.current ul'),
        currentUlHeight = $currentUl.attr('data-height');
})

सीएसएस:

#main-nav li ul { 
    height: 0;
    position: relative;
    overflow: hidden;
    opacity: 0; 
    filter: alpha(opacity=0); 
    -ms-filter: "alpha(opacity=0)";
    -khtml-opacity: 0; 
    -moz-opacity: 0;
    -webkit-transition: all .6s ease-in-out;
    -moz-transition: all .6s ease-in-out;
    -o-transition: all .6s ease-in-out;
    -ms-transition: all .6s ease-in-out;
    transition: all .6s ease-in-out;
}

#main-nav li.current ul {
    opacity: 1.0; 
    filter: alpha(opacity=100); 
    -ms-filter: "alpha(opacity=100)";
    -khtml-opacity: 1.0; 
    -moz-opacity: 1.0;
}

.ie #main-nav li.current ul { height: auto !important }

#main-nav li { height: 25px; display: block; margin-bottom: 3px }

यह नवीनतम jquery संस्करण के साथ ठीक से दिखाई नहीं देता
oliverbachmann

4

मैं हाल ही में रैपिंग के बजाय तत्वों max-heightपर संक्रमण कर रहा हूं ।liul

तर्क यह है कि max-heightsबड़े की तुलना में छोटे के लिए देरी बहुत कम ध्यान देने योग्य है (यदि बिल्कुल भी) max-heights, और मैं उपयोग करके या कुछ मनमानी विशाल संख्या के बजाय मेरे max-heightमूल्य के सापेक्ष भी सेट कर सकता हूं ।font-sizeliemsrems

यदि मेरा फ़ॉन्ट आकार है 1rem, तो मैं अपने max-heightको कुछ इस तरह सेट करूँगा 3rem(लिपटा हुआ पाठ समायोजित करने के लिए)। आप यहां एक उदाहरण देख सकते हैं:

http://codepen.io/mindfullsilence/pen/DtzjE


3

मैंने सब कुछ विस्तार से नहीं पढ़ा है लेकिन मुझे हाल ही में यह समस्या हुई है और मैंने वही किया है जो इस प्रकार है:

div.class{
   min-height:1%;
   max-height:200px;
   -webkit-transition: all 0.5s ease;
   -moz-transition: all 0.5s ease;
   -o-transition: all 0.5s ease;
   -webkit-transition: all 0.5s ease;
   transition: all 0.5s ease;
   overflow:hidden;
}

div.class:hover{
   min-height:100%;
   max-height:3000px;
}

यह आपको एक ऐसा डीवा देता है जो पहले 200px ऊँचाई तक की सामग्री दिखाता है और होवर पर इसका आकार कम से कम div की पूरी सामग्री जितना हो जाता है। Div 3000px नहीं बनता है, लेकिन 3000px वह सीमा है जो मैं लगा रहा हूं। गैर पर संक्रमण सुनिश्चित करें: होवर, अन्यथा आपको कुछ अजीब प्रतिपादन मिल सकता है। इस तरह: हॉवर गैर से प्राप्त होता है: होवर।

संक्रमण% या ऑटो पर px के रूप में काम नहीं करता है। आपको माप की एक ही इकाई का उपयोग करने की आवश्यकता है। यह मेरे लिए ठीक काम करता है। HTML5 का उपयोग करना इसे पूर्ण बनाता है ...।

याद रखें कि आस-पास हमेशा एक काम होता है ...; )

आशा है कि किसी को यह उपयोगी लगता है


3

जेक से अधिकतम ऊंचाई समाधान अच्छी तरह से काम करता है, अगर आपूर्ति की गई हार्ड-कोडेड अधिकतम ऊंचाई मूल्य वास्तविक ऊंचाई की तुलना में बहुत बड़ा नहीं है (क्योंकि अन्यथा अवांछनीय देरी और समय की समस्याएं हैं)। दूसरी ओर अगर हार्ड-कोडेड मूल्य गलती से वास्तविक ऊंचाई से बड़ा नहीं है, तो तत्व पूरी तरह से नहीं खुलेगा।

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

आइडिया मार्जिन-बॉटम के लिए एक नकारात्मक मूल्य (या थोड़ा अलग एनीमेशन के लिए मार्जिन-टॉप) का उपयोग करना है और सामग्री तत्व को अतिप्रवाह के साथ एक मध्य तत्व में रखना है: छिपा हुआ। सामग्री तत्व का नकारात्मक मार्जिन मध्य तत्व की ऊंचाई को कम करता है।

निम्नलिखित कोड -150px से 0px तक मार्जिन-तल पर एक संक्रमण का उपयोग करता है। यह अकेला तभी तक ठीक रहता है जब तक सामग्री तत्व 150px से अधिक न हो। इसके अलावा यह मध्य तत्व के लिए अधिकतम ऊंचाई पर 0px से 100% तक संक्रमण का उपयोग करता है। यदि सामग्री तत्व 150px से अधिक है, तो यह अंत में मध्य तत्व को छुपाता है। अधिकतम-ऊँचाई के लिए संक्रमण का उपयोग केवल इसके अनुप्रयोग को विलंबित करने के लिए किया जाता है, जब इसे बंद करना एक सहज दृश्य प्रभाव के लिए नहीं (और इसलिए यह 0px से 100% तक चल सकता है)।

सीएसएस:

.content {
  transition: margin-bottom 1s ease-in;
  margin-bottom: -150px;
}
.outer:hover .middle .content {
  transition: margin-bottom 1s ease-out;
  margin-bottom: 0px
}
.middle {
  overflow: hidden;
  transition: max-height .1s ease 1s;
  max-height: 0px
}
.outer:hover .middle {
  transition: max-height .1s ease 0s;
  max-height: 100%
}

HTML:

<div class="outer">
  <div class="middle">
    <div class="content">
      Sample Text
      <br> Sample Text
      <br> Sample Text
      <div style="height:150px">Sample Test of height 150px</div>
      Sample Text
    </div>
  </div>
  Hover Here
</div>

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

अधिक जानकारी के लिए मेरी ब्लॉग पोस्ट देखें http://www.taccgl.org/blog/css_transition_display.html#combined_height


3

आप क्लिप-पाथ के साथ एक रिवर्स (पतन) एनीमेशन बनाकर ऐसा कर सकते हैं।

#child0 {
    display: none;
}
#parent0:hover #child0 {
    display: block;
    animation: height-animation;
    animation-duration: 200ms;
    animation-timing-function: linear;
    animation-fill-mode: backwards;
    animation-iteration-count: 1;
    animation-delay: 200ms;
}
@keyframes height-animation {
    0% {
        clip-path: polygon(0% 0%, 100% 0.00%, 100% 0%, 0% 0%);
    }
    100% {
        clip-path: polygon(0% 0%, 100% 0.00%, 100% 100%, 0% 100%);
    }
}
<div id="parent0">
    <h1>Hover me (height: 0)</h1>
    <div id="child0">Some content
        <br>Some content
        <br>Some content
        <br>Some content
        <br>Some content
        <br>Some content
        <br>
    </div>
</div>


2

यह वास्तव में समस्या का "समाधान" नहीं है, बल्कि अधिक समाधान है। यह केवल पाठ के साथ लिखे गए अनुसार काम करता है, लेकिन अन्य तत्वों के साथ काम करने के लिए बदला जा सकता है, जैसा कि मुझे यकीन है।

.originalContent {
    font-size:0px;
    transition:font-size .2s ease-in-out;
}
.show { /* class to add to content */
    font-size:14px;
}

यहाँ एक उदाहरण है: http://codepen.io/overthemike/pen/wzjRKa

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

  • नोट - कोडप्रेस में आईएस जावास्क्रिप्ट है, लेकिन यह केवल उद्देश्य के लिए क्लिक पर सीएसएस वर्गों को जोड़ना / हटाना है। यह छिपे हुए रेडियो बटन के साथ किया जा सकता है, लेकिन मैं उस पर ध्यान केंद्रित नहीं कर रहा था, बस ऊंचाई में परिवर्तन।

1
प्रभावी रूप से इस उत्तर को दोहराता है, लेकिन अपारदर्शिता-फीका प्रभाव छोड़ देता है।
सेलेडमनेडी

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