JQuery के साथ ऑटो ऊंचाई के लिए चेतन तत्व


171

मैं एक चेतन करना चाहते <div>से 200pxकरने के लिए autoऊंचाई। मैं इसे काम करने के लिए प्रतीत नहीं कर सकता। किसी को कैसे पता है?

यहाँ कोड है:

$("div:first").click(function(){
  $("#first").animate({
    height: "auto"
  }, 1000 );
});

14
आपको सबसे अच्छे उत्तर को स्वीकार करना चाहिए।
क्लेनफ्रेंड


@IanMackinnon इस सवाल का निश्चित रूप से बेहतर जवाब है। मैंने उस प्रश्न को इसके डुप्लिकेट के रूप में बंद कर दिया है।
का भूत

जवाबों:


254
  1. वर्तमान ऊंचाई को बचाएं:

    var curHeight = $('#first').height();
  2. अस्थायी रूप से ऊंचाई को ऑटो पर स्विच करें:

    $('#first').css('height', 'auto');
  3. ऑटो ऊंचाई प्राप्त करें:

    var autoHeight = $('#first').height();
  4. इसमें वापस जाएं curHeightऔर चेतन करें autoHeight:

    $('#first').height(curHeight).animate({height: autoHeight}, 1000);

और साथ में:

var el = $('#first'),
    curHeight = el.height(),
    autoHeight = el.css('height', 'auto').height();
el.height(curHeight).animate({height: autoHeight}, 1000);

@ डैनियल, आपका JS कोड कहां है? उस बिट को पोस्ट करें, और HTML के कुछ हिस्से जो आपके द्वारा संदर्भित तत्वों को दिखाते हैं।
डेविड टैंग

21
यह काम करता है, लेकिन मैंने एक कॉलबैक जोड़ा जो तत्व के लिए ऑटो-ग्रो व्यवहार को पुनर्स्थापित करता है .animated({height: autoHeight}, 1000, function(){ el.height('auto'); });
rg89

उत्तरदायी डिजाइनों पर निश्चित ऊंचाई निर्धारित करने के बारे में सावधान रहें। यह एक गड़बड़ में बदल जाता है अगर उपयोगकर्ता स्क्रीन का आकार बदलता है। एनीमेशन पूरा होने के बाद 'ऑटो' को ऊंचाई सेट करने के लिए सबसे अच्छा है।
जोनाथन स्पंज

4
यह FOUC पैदा करने की क्षमता रखता है। ऐनिमेशन से पहले स्प्लिट सेकेंड के लिए उपयोगकर्ता पूरी ऊंचाई तक तत्व जंप कर सकता है।
डिंग्रेडिएंट

1
आप FOUC ("अस्थिर सामग्री का फ्लैश") को प्रारंभिक रूप से तत्व opacity: 0; position: absolute;को मापते हुए और इसे एक बार हटाने के बाद रोक सकते हैं।
जैकबेल्विन

194

IMO यह सबसे साफ और आसान उपाय है:

$("#first").animate({height: $("#first").get(0).scrollHeight}, 1000 );

स्पष्टीकरण: डोम पहले से ही अपने प्रारंभिक प्रतिपादन से जानता है कि विस्तारित ऊंचाई का आकार क्या होगा जब ऑटो ऊंचाई पर सेट किया जाएगा। यह संपत्ति DOM नोड में संग्रहीत है scrollHeight। हमें सिर्फ कॉल करके jQuery तत्व से DOM एलिमेंट लाना है get(0)और फिर हम प्रॉपर्टी को एक्सेस कर सकते हैं।

एनीमेशन पूरा होने के बाद ऑटो को ऊंचाई सेट करने के लिए कॉलबैक फ़ंक्शन को जोड़ने से अधिक जवाबदेही की अनुमति मिलती है (क्रेडिट क्रिस-विलियम्स ):

$('#first').animate({
    height: $('#first').get(0).scrollHeight
}, 1000, function(){
    $(this).height('auto');
});

2
गजब का! Developer.mozilla.org/en-US/docs/Web/API/Element.scrollHeight के अनुसार IE8 में भी इसका समर्थन किया जाता है clientHeight, जिसकी तुलना में यह असमर्थित प्रतीत होता है: developer.mozilla.org/en-US-docs/Web/ API / Element.clientHeight
स्वेन

1
मार्जिन बॉक्स मॉडल की परिभाषा के अनुसार किसी वस्तु की ऊंचाई का हिस्सा नहीं है। आप हमेशा अपने आप को मार्जिन जोड़ सकते हैं।
शराबखाने

22
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह बिना किसी चंचलता के सबसे अच्छा काम करता है और वास्तव में अच्छी तरह से काम करता है
इनिअस

7
मुझे भी लगता है कि यह सबसे अच्छा उपाय है। मैं इसे अधिक जवाबदेही के लिए ऑटो को ऊंचाई निर्धारित करने के लिए कॉलबैक फ़ंक्शन में जोड़ूंगा। $('#first').animate({ height: $('#first').get(0).scrollHeight }, 1000, function() { $(this).height('auto'); });
क्रिस विलियम्स

1
वाह, यह सुपर सुरुचिपूर्ण है। यह scrollWidthचौड़ाई एनिमेशन के लिए भी काम करता है ।
10

24

यह मूल रूप से Box9 द्वारा जवाब के रूप में एक ही दृष्टिकोण है, लेकिन मैं एक अच्छा में लपेटा jQuery प्लगइन है कि एक नियमित रूप से चेतन रूप में एक ही तर्क लेता है जब आप अधिक एनिमेटेड मापदंडों है और अधिक से अधिक एक ही कोड दोहरा थक प्राप्त करने की आवश्यकता के लिए, :

;(function($)
{
  $.fn.animateToAutoHeight = function(){
  var curHeight = this.css('height'),
      height = this.css('height','auto').height(),
      duration = 200,
      easing = 'swing',
      callback = $.noop,
      parameters = { height: height };
  this.css('height', curHeight);
  for (var i in arguments) {
    switch (typeof arguments[i]) {
      case 'object':
        parameters = arguments[i];
        parameters.height = height;
        break;
      case 'string':
        if (arguments[i] == 'slow' || arguments[i] == 'fast') duration = arguments[i];
        else easing = arguments[i];
        break;
      case 'number': duration = arguments[i]; break;
      case 'function': callback = arguments[i]; break;
    }
  }
  this.animate(parameters, duration, easing, function() {
    $(this).css('height', 'auto');
    callback.call(this, arguments);
  });
  return this;
  }
})(jQuery);

संपादित करें: चेनेबल और क्लीनर अब


23

एक बेहतर समाधान आपके तत्व की ऊंचाई निर्धारित करने के लिए JS पर निर्भर नहीं होगा। निम्नलिखित एक समाधान है जो एक निश्चित ऊंचाई तत्व को पूर्ण ("ऑटो") ऊंचाई तक ले जाता है:

var $selector = $('div');
    $selector
        .data('oHeight',$selector.height())
        .css('height','auto')
        .data('nHeight',$selector.height())
        .height($selector.data('oHeight'))
        .animate({height: $selector.data('nHeight')},400);

https://gist.github.com/2023150


2
इस ऑनलाइनर को समझना आसान नहीं है, शायद कई पंक्तियों को लिखने से दूसरों को थोड़ा बेहतर होगा।
जाप

यह सबसे अच्छा समाधान है क्योंकि उपयोगकर्ता खिड़की के आकार को समायोजित करता है तो ऑटो ऊंचाई बदल सकती है। निम्नलिखित देखें: // फिल्टर फ़ंक्शन की ऊँचाई को टॉगल करता है tolgleSlider () {if ($ ('फ़िल्टर') ऊँचाई ()! = 0) {$ ('# फ़िल्टर')। चेतन ({ऊँचाई: '0) '}); } और {var $ चयनकर्ता = $ ('# फ़िल्टर'); $ चयनकर्ता .data ('oHeight', $ selector.height ()) .cs ('ऊँचाई', 'ऑटो') .data ('nHeight', $ selector.height ()) .height ($ selector.data (') oHeight ')) .animate ({ऊंचाई: $ selector.data (' nHeight ')}, 400); }; console.log ( 'agg'); }
रिकी

Div को खोलने के लिए काम करता है, लेकिन 400ms से अधिक नहीं चेतन करता है। हो सकता है कि मेरे पास कुछ और अलग तरह से सेट हो, लेकिन यह पलक झपकते ही खुल जाता है।
ntgCleaner

काम करता है लेकिन यह heightएक निश्चित मूल्य (जैसे 122px) के लिए सेट होता है। मेरे तत्व ने थोड़ी देर बाद ऊंचाई बदल दी, इसलिए मुझे अवधि तर्क (400) को विकल्पों के साथ बदलना पड़ा{duration: 400, complete: function() {$selector.css('height', 'auto');}}
jsruok

12

यह काम कर रहा है और यह पहले तो सरल है:

सीएसएस:

#container{
  height:143px;  
}

.max{
  height: auto;
  min-height: 143px;
}

जे एस:

$(document).ready(function() {
    $("#container").click(function() {      
        if($(this).hasClass("max")) {
            $(this).removeClass("max");
        } else {
            $(this).addClass("max");
        }

    })
});

नोट: इस समाधान के लिए jQuery UI की आवश्यकता है


1
यह उल्लेख किया जाना चाहिए कि इसके लिए Jquery UI प्लगइन की आवश्यकता है, जबकि मूल प्रश्न अकेले jquery के बारे में था। लेकिन अगर आप Jquery UI का उपयोग कर रहे हैं, तो यह काम करता है।
1856 पर user56reinstatemonica8

4
आप $ (यह) .toggleClass ('अधिकतम', 250) का भी उपयोग कर सकते हैं;
इफ

1
क्यों आप के साथ एक दूसरा मान शामिल कर रहे हैं .addClassऔर .removeClass?
कटोरा ०


7

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

यहाँ एक फ़िडेल है जहाँ मैंने एक रीसेट शामिल किया है।

लेकिन आपके उद्देश्यों के लिए, यहां मांस और आलू हैं:

$(function(){
//wrap everything inside #first
$('#first').children().wrapAll('<div class="wrapper"></div>');
//get the height of the wrapper 
var expandedHeight = $('.wrapper').height();
//get the height of first (set to 200px however you choose)
var collapsedHeight = $('#first').height();
//when you click the element of your choice (a button in my case) #first will animate to height auto
$('button').click(function(){
    $("#first").animate({
        height: expandedHeight            
    })
});
});​

5

उपयोग slideDown और slideUp

$("div:first").click(function(){ $("#first").slideDown(1000); });

1
यह ऊंचाई को हल नहीं करता है: स्लाइडअप के बाद से ऑटो फ़ंक्शन डिव को पूरी तरह से ध्वस्त कर देगा।
जाप

5

मैं इसे ठीक करने में कामयाब रहा: डी कोड को हेस करता है।

var divh = document.getElementById('first').offsetHeight;
$("#first").css('height', '100px');
$("div:first").click(function() {
  $("#first").animate({
    height: divh
  }, 1000);
});

4

आप एक बिनबैक को जोड़कर विंडो के आकार में परिवर्तन करने के लिए लिक्विनाट के उत्तर को उत्तरदायी बना सकते हैं जो ऑटो पर वापस ऊंचाई सेट करता है।

$("#first").animate({height: $("#first").get(0).scrollHeight}, 1000, function() {$("#first").css({height: "auto"});});

4

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

सौभाग्य से कुछ ट्रिक्स हैं जिनका आप उपयोग कर सकते हैं।

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

jQuery.fn.animateAuto = function(prop, speed, callback){
    var elem, height, width;

    return this.each(function(i, el){
        el = jQuery(el), elem =    el.clone().css({"height":"auto","width":"auto"}).appendTo("body");
        height = elem.css("height"),
        width = elem.css("width"),
        elem.remove();

        if(prop === "height")
            el.animate({"height":height}, speed, callback);
        else if(prop === "width")
            el.animate({"width":width}, speed, callback);  
        else if(prop === "both")
            el.animate({"width":width,"height":height}, speed, callback);
    });   
}

उपयोग:

$(".animateHeight").bind("click", function(e){
    $(".test").animateAuto("height", 1000); 
});

$(".animateWidth").bind("click", function(e){
    $(".test").animateAuto("width", 1000);  
});

$(".animateBoth").bind("click", function(e){
    $(".test").animateAuto("both", 1000); 
});

1
यदि आप उस फ़ंक्शन का उपयोग नहीं करना चाहते हैं, तो कुछ ऐसा करें: var clone = element.clone () clone.appendTo ('body') clone.css ('height', 'auto') var itemHeight = clone_outerHeight () ); clone.remove () अब आपके पास आइटम की ऊँचाई आइटमहाइट वैरिएबल में है, इसलिए आप इसे केवल एनिमेशन से अधिक के लिए उपयोग कर सकते हैं।
स्टेन जॉर्ज

3

आप हमेशा ऐसा कर सकते हैं:

jQuery.fn.animateAuto = function(prop, speed, callback){
var elem, height, width;
return this.each(function(i, el){
    el = jQuery(el), elem = el.clone().css({"height":"auto","width":"auto"}).appendTo("body");
    height = elem.css("height"),
    width = elem.css("width"),
    elem.remove();

    if(prop === "height")
        el.animate({"height":height}, speed, callback);
    else if(prop === "width")
        el.animate({"width":width}, speed, callback);  
    else if(prop === "both")
        el.animate({"width":width,"height":height}, speed, callback);
});  
}

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


1
आप की जगह ले सकता: .appendTo("body")द्वारा.appendTo(el.parent())
स्टेफी

2

आपके चयनकर्ता मेल नहीं खाते। क्या आपके तत्व में 'पहले' की आईडी है, या यह हर div में पहला तत्व है?

एक सुरक्षित समाधान 'इस' का उपयोग करना होगा:

// assuming the div you want to animate has an ID of first
$('#first').click(function() {
  $(this).animate({ height : 'auto' }, 1000);
});

1
आह। ठीक है, ऐसा लगता है कि आपने समाधान खोज लिया है। सुरक्षा के लिए, मैं अभी भी $(this)आपके क्लिक हैंडलर के अंदर उपयोग करूंगा ।
EMMERICH

10
animate({height: 'auto'})कोई प्रभाव नहीं पड़ता। कम से कम, jQuery 1.6.4 के साथ नहीं।
जानिस एल्मरिस

2

इसको आजमाओ ,

var height;
$(document).ready(function(){
    $('#first').css('height','auto');
    height = $('#first').height();
    $('#first').css('height','200px');
})

 $("div:first").click(function(){
  $("#first").animate({
    height: height
  }, 1000 );
});

यह काम नहीं करने वाला है, आपकी var height तैयार फंक्शन के अंदर उपलब्ध है।
मेयो

तैयार समारोह से पहले ऊँचाई को परिभाषित करें, और केवल ऊँचाई का उपयोग करें var ऊँचाई से .. इस तरह से यह डेनियल काम कर सकता है
प्रकाश

2

यहाँ एक है जो BORDER-BOX के साथ काम करता है ...

हाय दोस्तों। यहाँ एक jQuery प्लगइन है जो मैंने ऐसा करने के लिए लिखा था, लेकिन ऊंचाई अंतर के लिए भी खाता है जो आपके द्वारा box-sizingसेट किए जाने पर होगा border-box

मैंने एक "yShrinkOut" प्लगइन भी शामिल किया है जो तत्व को y- अक्ष के साथ सिकुड़ कर छुपाता है।


// -------------------------------------------------------------------
// Function to show an object by allowing it to grow to the given height value.
// -------------------------------------------------------------------
$.fn.yGrowIn = function (growTo, duration, whenComplete) {

    var f = whenComplete || function () { }, // default function is empty
        obj = this,
        h = growTo || 'calc', // default is to calculate height
        bbox = (obj.css('box-sizing') == 'border-box'), // check box-sizing
        d = duration || 200; // default duration is 200 ms

    obj.css('height', '0px').removeClass('hidden invisible');
    var padTop = 0 + parseInt(getComputedStyle(obj[0], null).paddingTop), // get the starting padding-top
        padBottom = 0 + parseInt(getComputedStyle(obj[0], null).paddingBottom), // get the starting padding-bottom
        padLeft = 0 + parseInt(getComputedStyle(obj[0], null).paddingLeft), // get the starting padding-left
        padRight = 0 + parseInt(getComputedStyle(obj[0], null).paddingRight); // get the starting padding-right
    obj.css('padding-top', '0px').css('padding-bottom', '0px'); // Set the padding to 0;

    // If no height was given, then calculate what the height should be.
    if(h=='calc'){ 
        var p = obj.css('position'); // get the starting object "position" style. 
        obj.css('opacity', '0'); // Set the opacity to 0 so the next actions aren't seen.
        var cssW = obj.css('width') || 'auto'; // get the CSS width if it exists.
        var w = parseInt(getComputedStyle(obj[0], null).width || 0) // calculate the computed inner-width with regard to box-sizing.
            + (!bbox ? parseInt((getComputedStyle(obj[0], null).borderRightWidth || 0)) : 0) // remove these values if using border-box.
            + (!bbox ? parseInt((getComputedStyle(obj[0], null).borderLeftWidth || 0)) : 0) // remove these values if using border-box.
            + (!bbox ? (padLeft + padRight) : 0); // remove these values if using border-box.
        obj.css('position', 'fixed'); // remove the object from the flow of the document.
        obj.css('width', w); // make sure the width remains the same. This prevents content from throwing off the height.
        obj.css('height', 'auto'); // set the height to auto for calculation.
        h = parseInt(0); // calculate the auto-height
        h += obj[0].clientHeight // calculate the computed height with regard to box-sizing.
            + (bbox ? parseInt((getComputedStyle(obj[0], null).borderTopWidth || 0)) : 0) // add these values if using border-box.
            + (bbox ? parseInt((getComputedStyle(obj[0], null).borderBottomWidth || 0)) : 0) // add these values if using border-box.
            + (bbox ? (padTop + padBottom) : 0); // add these values if using border-box.
        obj.css('height', '0px').css('position', p).css('opacity','1'); // reset the height, position, and opacity.
    };

    // animate the box. 
    //  Note: the actual duration of the animation will change depending on the box-sizing.
    //      e.g., the duration will be shorter when using padding and borders in box-sizing because
    //      the animation thread is growing (or shrinking) all three components simultaneously.
    //      This can be avoided by retrieving the calculated "duration per pixel" based on the box-sizing type,
    //      but it really isn't worth the effort.
    obj.animate({ 'height': h, 'padding-top': padTop, 'padding-bottom': padBottom }, d, 'linear', (f)());
};

// -------------------------------------------------------------------
// Function to hide an object by shrinking its height to zero.
// -------------------------------------------------------------------
$.fn.yShrinkOut = function (d,whenComplete) {
    var f = whenComplete || function () { },
        obj = this,
        padTop = 0 + parseInt(getComputedStyle(obj[0], null).paddingTop),
        padBottom = 0 + parseInt(getComputedStyle(obj[0], null).paddingBottom),
        begHeight = 0 + parseInt(obj.css('height'));

    obj.animate({ 'height': '0px', 'padding-top': 0, 'padding-bottom': 0 }, d, 'linear', function () {
            obj.addClass('hidden')
                .css('height', 0)
                .css('padding-top', padTop)
                .css('padding-bottom', padBottom);
            (f)();
        });
};

डिफ़ॉल्ट मानों को स्वीकार करने के लिए मेरे द्वारा उपयोग किए गए किसी भी पैरामीटर को छोड़ा जा सकता है या अशक्त करने के लिए सेट किया जा सकता है। मैंने जिन मापदंडों का उपयोग किया है:

  • GrowTo: यदि आप सभी गणनाओं को ओवरराइड करना चाहते हैं और सीएसएस की ऊँचाई सेट करें, जिस पर ऑब्जेक्ट बढ़ेगा, इस पैरामीटर का उपयोग करें।
  • अवधि: एनीमेशन की अवधि ( स्पष्ट रूप से )।
  • whenComplete: जब एनीमेशन पूरा हो गया है एक समारोह को चलाने के लिए।

2

स्लाइड टॉगल करें ( Box9 का उत्तर विस्तारित)

$("#click-me").click(function() {
  var el = $('#first'),
  curHeight = el.height(),
  autoHeight = el.css('height', 'auto').height(),
  finHeight = $('#first').data('click') == 1 ? "20px" : autoHeight;
  $('#first').data('click', $(this).data('click') == 1 ? false : true);
  el.height(curHeight).animate({height: finHeight});
});
#first {width: 100%;height: 20px;overflow:hidden;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="first">
  <div id="click-me">Lorem ipsum dolor sit amet, consectetur adipiscing elit</div>
  Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit,
</div>


1

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

मैं डेटा में वांछित प्रत्येक div की ऊंचाई को लोड करता हूं

$('div').each(function(){
    $(this).data('height',$(this).css('height'));
    $(this).css('height','20px');
});

तब मैं सिर्फ उस का उपयोग करता हूं जब क्लिक पर ऐनिमेट किया जाता है।

$('div').click(function(){
    $(this).css('height',$(this).data('height'));
});

मैं सीएसएस संक्रमण का उपयोग कर रहा हूं, इसलिए मैं jQuery के चेतन का उपयोग नहीं करता हूं, लेकिन आप सिर्फ एक ही चेतन कर सकते हैं।


1

आप इसे डेटा विशेषता में संग्रहीत कर सकते हैं।

$('.colapsable').each(function(){
    $(this).attr('data-oheight',$(this).height());
    $(this).height(100);
});

$('.colapsable h2:first-child').click(function(){
    $(this).parent('.colapsable').animate({
            height: $(this).parent('.colapsible').data('oheight')
        },500);
    }
});

अनिवार्य रूप से हेतलर के एक लाइनर के समान, लेकिन समझने में आसान है।
टिमोथी ग्रोथ

1

मैं एक पृष्ठ पर एक ही समस्या में भाग गया एक Wordpress शोर्ट में इसे लागू करने के लिए कई और अधिक क्षेत्र के इस कार्यक्षमता की जरूरत थी।

डिज़ाइन तकनीकी रूप से पृष्ठ पर अधिक पढ़े गए सभी स्पैन की निश्चित ऊंचाई है। और मैं एक टॉगल के साथ उन्हें अलग से एक ऑटो ऊंचाई तक विस्तारित करने में सक्षम होना चाहता था। पहला क्लिक: 'टेक्स्ट स्पैन की पूरी ऊंचाई तक विस्तार', दूसरा क्लिक: '70px की डिफ़ॉल्ट ऊंचाई तक ढह जाना'

एचटीएमएल

 <span class="read-more" data-base="70" data-height="null">
     /* Lots of text determining the height of this span */
 </span>
 <button data-target='read-more'>Read more</button>

सीएसएस

span.read-more {
    position:relative;
    display:block;
    overflow:hidden;
}

तो ऊपर यह बहुत आसान लग data-baseरहा है विशेषता मुझे निर्धारित ऊंचाई निर्धारित करने की आवश्यकता है। data-heightविशेषता मैं तत्व की वास्तविक (गतिशील) ऊंचाई स्टोर करने के लिए इस्तेमाल किया।

JQuery का हिस्सा

jQuery(document).ready(function($){

  $.fn.clickToggle = function(func1, func2) {
      var funcs = [func1, func2];
      this.data('toggleclicked', 0);
      this.click(function() {
          var data = $(this).data();
          var tc = data.toggleclicked;
          $.proxy(funcs[tc], this)();
          data.toggleclicked = (tc + 1) % 2;
      });
      return this;
  };

    function setAttr_height(key) {
        $(key).each(function(){
            var setNormalHeight = $(this).height();
            $(this).attr('data-height', setNormalHeight);
            $(this).css('height', $(this).attr('data-base') + 'px' );
        });
    }
    setAttr_height('.read-more');

    $('[data-target]').clickToggle(function(){
        $(this).prev().animate({height: $(this).prev().attr('data-height')}, 200);
    }, function(){
        $(this).prev().animate({height: $(this).prev().attr('data-base')}, 200);
    });

});

पहले मैंने अपने पहले और दूसरे क्लिक के लिए एक क्लिकटॉगल फ़ंक्शन का उपयोग किया है। दूसरा फ़ंक्शन अधिक महत्वपूर्ण है: setAttr_height()सभी .read-moreतत्वों की base-heightविशेषता में पृष्ठ लोड पर उनकी वास्तविक ऊंचाइयों को निर्धारित किया गया है। उसके बाद बेस की ऊंचाई jquery css फंक्शन के माध्यम से सेट की जाती है।

हमारी दोनों विशेषताओं के साथ हम अब उनके बीच सहज तरीके से टॉगल कर सकते हैं। केवल data-baseअपनी इच्छित (निश्चित) ऊँचाई पर जाप करें और अपनी आईडी के लिए .read-more क्लास को स्विच करें

आप सभी यह एक बेला में काम कर देख सकते हैं बेला

कोई jQuery यूआई की जरूरत है


1

यदि आप चाहते हैं कि सभी को डिव को दिखाने और छिपाने के लिए है, तो यह कोड आपको jQuery के चेतन का उपयोग करने देगा। आप अपनी इच्छा के अनुसार अधिकतम ऊंचाई तक jQuery के चेतन हो सकते हैं या आप 0px पर जाकर एनिमेट कर सकते हैं। jQuery को बस ऑटो में बदलने के लिए jQuery द्वारा निर्धारित ऊंचाई की आवश्यकता है। इसलिए .animate उस शैली में "=" को जोड़ता है जो .css (ऊँचाई: ऑटो) में परिवर्तित होता है।

जिस स्वच्छ तरीके से मैंने यह काम देखा है वह आपके द्वारा अपेक्षित ऊँचाई के आस-पास चेतन करने के लिए है, फिर इसे ऑटो सेट करें और सही होने पर यह बहुत सहज दिख सकता है। आप अतीत की चेष्टा भी कर सकते हैं कि आप क्या उम्मीद करते हैं और यह वापस आ जाएगा। 0 की अवधि में 0px पर एनिमेट करने से बस इसकी ऑटो ऊंचाई तक तत्व की ऊँचाई गिरती है। मानव आंख के लिए, यह वैसे भी एनिमेटेड दिखता है। का आनंद लें..

    jQuery("div").animate({
         height: "0px"/*or height of your choice*/
    }, {
         duration: 0,/*or speed of your choice*/
         queue: false, 
         specialEasing: {
             height: "easeInCirc"
        },
         complete: function() {
             jQuery(this).css({height:"auto"});
        }
    });

क्षमा करें, मुझे पता है कि यह एक पुराना पोस्ट है, लेकिन मुझे लगा कि यह इस पोस्ट में आने वाले jQuery के साथ अभी भी इस कार्यक्षमता की मांग करने वाले उपयोगकर्ताओं के लिए प्रासंगिक होगा।


0

मैंने एक साथ कुछ ऐसा किया जो मुझे वही दिख रहा था जो मुझे अच्छा लग रहा था। किसी तत्व के स्क्रॉलहाइट का उपयोग करने पर आपको डोम में लोड किए जाने के बाद ऊँचाई मिलती है।

 var clickers = document.querySelectorAll('.clicker');
    clickers.forEach(clicker => {
        clicker.addEventListener('click', function (e) {
            var node = e.target.parentNode.childNodes[5];
            if (node.style.height == "0px" || node.style.height == "") {
                $(node).animate({ height: node.scrollHeight });
            }
            else {
                $(node).animate({ height: 0 });
            }
        });
    });
.answer{
        font-size:15px;
        color:blue;
        height:0px;
        overflow:hidden;
       
    }
 <div class="row" style="padding-top:20px;">
                <div class="row" style="border-color:black;border-style:solid;border-radius:4px;border-width:4px;">
                    <h1>This is an animation tester?</h1>
                    <span class="clicker">click me</span>
                    <p class="answer">
                        I will be using this to display FAQ's on a website and figure you would like this.  The javascript will allow this to work on all of the FAQ divs made by my razor code.  the Scrollheight is the height of the answer element on the DOM load.  Happy Coding :)
                         Lorem ipsum dolor sit amet, mea an quis vidit autem. No mea vide inani efficiantur, mollis admodum accusata id has, eam dolore nemore eu. Mutat partiendo ea usu, pri duis vulputate eu. Vis mazim noluisse oportere id. Cum porro labore in, est accumsan euripidis scripserit ei. Albucius scaevola elaboraret usu eu. Ad sed vivendo persecuti, harum movet instructior eam ei.
                    </p>
                </div>
            </div>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

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