2014-03-04 14 views
5

Ich habe ein Elternteil div mit der Höhe auto.So animieren Sie die Höhe der übergeordneten Höhe, wenn die Kinderhöhe geändert wird

Jetzt, wenn ich verblasse etwas in das ist ein Kind dieser div, springt die Höhe nur auf die neue Höhe. Ich möchte, dass dies ein reibungsloser Übergang ist.

Die Höhe soll vor Kinder den Übergang angezeigt werden, und Übergangs auch nach Kinder entfernt werden (display: none;).

Ich weiß, das ist möglich, wenn Sie die vordefinierten Höhen weiß, aber ich habe keine Ahnung, wie ich das mit der Höhe zu auto eingestellt wird erreichen können.

JSFiddle Demo

+0

Haben die möglichen untergeordneten Elemente Ihres Eltern-DIV bekannte Höhen oder ist ihre Höhe durch ihren Inhalt angegeben? Und ist immer nur ein Kind oder mehrere sichtbar? – Netsurfer

+0

Die möglichen Kindelemente haben keine bekannten Höhen. Die Höhe ist in der Tat durch ihren Inhalt gegeben. Und ja, es ist immer mindestens ein Kind sichtbar. –

+0

OK, also müssen Sie die Höhe des entsprechenden Kindes bestimmen ** bevor ** Sie die Höhe des Elternteils ändern können. Wie wäre es mit einem alternativen Ansatz: Stellen Sie die Elternhöhe auf Null und übertritt die Höhe mit dem Kind bereits sichtbar? Wäre viel einfacher und imho der "nettere" Effekt. – Netsurfer

Antwort

1

könnten Sie neue Inhalte laden mit display: none und slideDown() drin und dann mit animierten Opazität FadeIn.Bevor Sie es entfernen verblassen Sie gerade aus und slideUp()

ich denke, das ist das, was man wollte: jsFiddle

$(function() { 
    $("#foo").click(function() { 
     if($("#bar").is(":visible")) { 
      $("#bar").animate({"opacity": 0}, function() { 
       $(this).slideUp(); 
      }); 
     } 
     else { 
      $("#bar").css({ 
       "display": "none", 
       "opacity": 0, 
       /* The next two rows are just to get differing content */ 
       "height": 200 * Math.random() + 50, 
       "background": "rgb(" + Math.round(255 * Math.random()) + "," + Math.round(255 * Math.random()) + "," + Math.round(255 * Math.random()) + ")" 
      }); 
      $("#bar").slideDown(function() { 
       $(this).animate({"opacity": 1}); 
      }); 
     } 
    }); 
}); 

dies auch versuchen: jsFiddle. Klicken Sie auf "Click me", um neue divs hinzuzufügen. Klicke auf ein neues Div, um es zu entfernen.

$(function() { 
    $("#foo").click(function() { 
     var newCont = $("<div>").css({ 
      "display": "none", 
      "opacity": 0, 
      "height": 200 * Math.random(), 
      "background": "rgb(" + Math.round(255 * Math.random()) + "," + Math.round(255 * Math.random()) + "," + Math.round(255 * Math.random()) + ")" 
     }); 
     $(this).append(newCont); 
     newCont.slideDown(function() { 
      $(this).animate({"opacity": 1}); 
     }); 
     newCont.click(function(e) { 
      $(this).animate({"opacity": 0}, function() { 
       $(this).slideUp(function() { 
        $(this).remove(); 
       }); 
      }); 
      return false; 
     }); 
    }); 
}); 
+0

Ich denke, das sollte es sein. 1 Frage, warum benutzen Sie Opazität und nicht fadeOut/fadeIn? Nur neugierig. –

+0

@KidDiamond Das liegt daran, dass fadeOut am Ende 'display: none' hinzufügt und das Eltern-Div. Mit animierter Deckkraft kann ich SlideUp und Down zum Kollaps verwenden. Sehen Sie diese Demo: http://jsfiddle.net/borglinm/xq8WF/ – Mathias

+0

Ausgezeichnete Antwort! –

0

Try-Entwickler-Tools in Browser zu verwenden.

Alle Browser haben es heutzutage. (ctrl shift i)

Wenn Sie sich den Seitenquellcode ansehen, nachdem fadeOut ausgeführt wurde, sehen Sie den Inline-Stil "display: none" für das innere Element. Dies bedeutet, dass Ihr inneres Element keine Höhe mehr hat, deshalb ist das äußere Element (Elternelement) kollabiert (Höhe = 0);

Es ist eine Eigenschaft aller Browser, dass Blockelemente die Höhe nehmen, wie sie brauchen, es sei denn, Sie werden sie nicht überschreiben. Da es keine Elemente mit einer Höhe von mehr als 0 px gibt, beträgt die Höhe des übergeordneten Elements 0px.

y außer Kraft setzen kann CSS-Stil

height: 300px 
or 
min-height: 300px; 

Verwendung Dies ist korrekt, wenn u jquery

+0

Ich glaube nicht, dass Sie meine Frage verstehen. Es geht nicht besonders um das Ausblenden von Elementen, sondern um einen Übergang mit glatter Höhe, wann immer es mit "height: auto" modifiziert wird (größer oder kleiner). –

0

Versuchen Sie dieses Update verwenden :)

$(function() { 
    var height = $("#foo").height(); 
    $("#foo").click(function() { 
    var dis = $(".bar").css('display'); 

    if(dis == 'none'){ 
     $(this).animate({height:height+$(".bar").height()},2000,function(){ 
     $(".bar").show(); 
     }); 
    } 
     else{ 
     $(".bar").hide(); 
     $(this).animate({height:height-$(".bar").height()},2000); 
     } 

    }); 
}); 

#foo { 
    height: auto; 
    background: #333; 
    color: white; 
    min-height: 20px; 
} 
+0

Dies ist keine Lösung für mein Problem. Die Höhe soll übergehen, bevor die Kinder angezeigt werden, und der Übergang, nachdem die Kinder ausgeblendet wurden. Darüber hinaus erhöht Ihr Code die Höhe. –

+0

Okay schön. Näher kommen. Wenn Sie wirklich schnell schnell klicken, werden die Höhe und die Animation sehr unruhig. –

+0

Das Verhalten von jQuery api, wenn Sie ständig schnell weiterklicken. Ich denke, das ist nicht der Fehler, da niemand so klicken wird. – Manoj

1

Der Ansatz ich war zu sehen, ob .bar war sichtbar, und wenn es so ausgeblendet ist, animiere die Höhe von #foo zurück dorthin, wo es angefangen hat, oder animiere es auf die Höhe von .bar + #foo Andernfalls verwenden Sie in beiden Fällen Rückrufe, um den von Ihnen gewünschten Effekt zu erhalten.

Code:

$(function() { 
    var start_height = $('#foo').outerHeight(); 
    $("#foo").click(function() { 
     $bar = $('.bar'); 
     $foo = $(this); 
     if($bar.is(':visible')) { 
      $bar.fadeToggle('slow', function() { 
       $foo.animate({height: start_height}); 
      }); 
     } else { 
      $foo.animate({height: ($bar.outerHeight()+start_height)+'px'}, 'slow', function() { 
       $bar.fadeToggle(); 
      }); 
     } 
    }); 
}); 

Fiddle.

EDIT:

hinzugefügt .stop() unerwartetes Verhalten zu verhindern, wenn doppelt geklickt.

Updated Fiddle.

Verwandte Themen