Domanda

Quindi questo potrebbe essere davvero semplice, ma non sono stato ancora in grado di trovare esempi per imparare, quindi per favore abbi pazienza. ;)

Ecco in sostanza cosa voglio fare:

<div>Lots of content! Lots of content! Lots of content! ...</div>

.... 

$("div").html("Itsy-bitsy bit of content!");

Voglio animare uniformemente tra le dimensioni del div con un sacco di contenuti alle dimensioni del div con pochissimo quando viene iniettato il nuovo contenuto.

Pensieri?

È stato utile?

Soluzione

Prova questo plugin jQuery:

// Animates the dimensional changes resulting from altering element contents
// Usage examples: 
//    $("#myElement").showHtml("new HTML contents");
//    $("div").showHtml("new HTML contents", 400);
//    $(".className").showHtml("new HTML contents", 400, 
//                    function() {/* on completion */});
(function($)
{
   $.fn.showHtml = function(html, speed, callback)
   {
      return this.each(function()
      {
         // The element to be modified
         var el = $(this);

         // Preserve the original values of width and height - they'll need 
         // to be modified during the animation, but can be restored once
         // the animation has completed.
         var finish = {width: this.style.width, height: this.style.height};

         // The original width and height represented as pixel values.
         // These will only be the same as `finish` if this element had its
         // dimensions specified explicitly and in pixels. Of course, if that 
         // was done then this entire routine is pointless, as the dimensions 
         // won't change when the content is changed.
         var cur = {width: el.width()+'px', height: el.height()+'px'};

         // Modify the element's contents. Element will resize.
         el.html(html);

         // Capture the final dimensions of the element 
         // (with initial style settings still in effect)
         var next = {width: el.width()+'px', height: el.height()+'px'};

         el .css(cur) // restore initial dimensions
            .animate(next, speed, function()  // animate to final dimensions
            {
               el.css(finish); // restore initial style settings
               if ( $.isFunction(callback) ) callback();
            });
      });
   };


})(jQuery);

Il commentatore RonLugge sottolinea che ciò può causare problemi se lo si chiama due volte sullo stesso o sugli stessi elementi, in cui la prima animazione non è terminata prima dell'inizio della seconda. Questo perché la seconda animazione prenderà le dimensioni correnti (mid-animation) come desiderato "finale" e procedi a risolverli come valori finali (interrompendo efficacemente l'animazione nelle sue tracce anziché animare verso la dimensione "naturale") ...

Il modo più semplice per risolverlo è chiamare stop () prima di chiamare showHtml () e passare true per il secondo parametro ( jumpToEnd ):

$(selector).showHtml("new HTML contents")
           .stop(true, true)
           .showHtml("even newer contents");

In questo modo la prima animazione verrà completata immediatamente (se è ancora in esecuzione), prima di iniziarne una nuova.

Altri suggerimenti

Puoi utilizzare il metodo animato .

$("div").animate({width:"200px"},400);

forse qualcosa del genere?

$(".testLink").click(function(event) {
    event.preventDefault();
    $(".testDiv").hide(400,function(event) {
        $(this).html("Itsy-bitsy bit of content!").show(400);
    });
});

Vicino a quello che penso tu volessi, prova anche slideIn / slideOut o guarda il plugin UI / Effects.

Ecco come ho risolto questo problema, spero che sia utile! L'animazione è fluida al 100% :)

HTML:

<div id="div-1"><div id="div-2">Some content here</div></div>

Javascript:

// cache selectors for better performance
var container = $('#div-1'),
    wrapper = $('#div-2');

// temporarily fix the outer div's width
container.css({width: wrapper.width()});
// fade opacity of inner div - use opacity because we cannot get the width or height of an element with display set to none
wrapper.fadeTo('slow', 0, function(){
    // change the div content
    container.html("<div id=\"2\" style=\"display: none;\">new content (with a new width)</div>");
    // give the outer div the same width as the inner div with a smooth animation
    container.animate({width: wrapper.width()}, function(){
        // show the inner div
        wrapper.fadeTo('slow', 1);
    });
});

Potrebbe esserci una versione più breve del mio codice, ma l'ho tenuto così.

Questo fa il lavoro per me. Puoi anche aggiungere una larghezza al div temp.

$('div#to-transition').wrap( '<div id="tmp"></div>' );
$('div#tmp').css( { height: $('div#to-transition').outerHeight() + 'px' } );
$('div#to-transition').fadeOut('fast', function() {
  $(this).html(new_html);
  $('div#tmp').animate( { height: $(this).outerHeight() + 'px' }, 'fast' );
  $(this).fadeIn('fast', function() {
    $(this).unwrap();
  });
});

Ciao meyahoocoma4c5ki0pprxr19sxhajsogo6jgks5dt.

Potresti racchiudere il 'div contenuto' con un 'div esterno' che è impostato su un valore di larghezza assoluta. Iniettare il nuovo contenuto con un " hide () " o " animate ({larghezza}) " metodo, mostrato nelle altre risposte. In questo modo, la pagina non si restringe di nuovo perché il div wrapper ha una larghezza costante.

Puoi uniformare l'animazione jQuery usando dequeue . Verifica la presenza della classe (impostata al passaggio del mouse e rimossa al mouse su Animate callback) prima di iniziare la nuova animazione. Quando inizia la nuova animazione, dequeue.

Ecco una breve demo.

var space = ($(window).width() - 100);
$('.column').width(space/4);

$(".column").click(function(){
    if (!$(this).hasClass('animated')) {
        $('.column').not($(this).parent()).dequeue().stop().animate({width: 'toggle', opacity: '0.75'}, 1750,'linear', function () {});
    }

  $(this).addClass('animated');
    $('.column').not($(this).parent()).dequeue().stop().animate({width: 'toggle', opacity: '0.75'}, 1750,'linear', function () {
          $(this).removeClass('animated').dequeue();

      });
    $(this).dequeue().stop().animate({
        width:(space/4)
    }, 1400,'linear',function(){
      $(this).html('AGAIN');
    });
});

La demo è configurata come 5 colonne a tutta altezza, facendo clic su una delle colonne da 2 a 5 animerà la larghezza dell'altro 3 e sposterà l'elemento cliccato all'estrema sinistra.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

Per tornare indietro sulla soluzione del plugin jquery (troppo bassa reputazione per aggiungere questo come commento) jQuery.html () rimuoverà tutti i gestori di eventi sull'html allegato. Modifica:

// Modify the element's contents. Element will resize.
el.html(html);

a

// Modify the element's contents. Element will resize.
el.append(html);

conserverà i gestori di eventi di " html " elementi

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top