jQuery .animate () erzwingt den Stil "Überlauf: versteckt"

69

jQuery's .animate()erzwingt den Stil overflow: hiddenbeim Auslösen und spielt mit meinem animierten Element, weil ich ein anderes Element habe, das mit negativer Position außerhalb davon hängt. gibt es sowieso um das zu vermeiden?

PulledBull
quelle
24
Sie können $ ('Element'). animate (). css ('Überlauf', 'sichtbar') verwenden; Können Sie für einige Tests Code posten?
Tim
1
Dies funktioniert, da .animate () den Überlauf beim Start nur einmal setzt! danke =)
PulledBull
Heiliger Mist, ich habe gerade vier Stunden damit verbracht, dieses Problem zu umgehen. Ja!!!
Tkone
@tkone Ich kenne dieses Gefühl, Bruder.
Pilau

Antworten:

50

Eine andere Möglichkeit besteht darin, das Element in CSS als ! Wichtig zu deklarieren .

Zum Beispiel.

.somediv {
  overflow: visible !important;
}
Andrew Rosolino
quelle
@ ScottGreenfield Nicht in Chrome 17.0
Sawny
11
@ScottGreenfield - das ist nicht richtig. ! wichtig hat Vorrang vor Inline-Stilen.
random_user_name
9
w3.org/TR/CSS2/cascade.html#cascading-order Autor wichtige Stildeklarationen überschreiben normale, unabhängig von der Spezifität. Inline-Stile haben die höchste Spezifität, haben jedoch keinen Vorrang vor als wichtig deklarierten Stilen.
Adam Tolley
30

Dies ist der Quellcode:

  if ( isElement && ( p === "height" || p === "width" ) ) {
    // Make sure that nothing sneaks out
    // Record all 3 overflow attributes because IE does not
    // change the overflow attribute when overflowX and
    // overflowY are set to the same value
    opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
  ...
  ...
  ...
  }

if ( opt.overflow != null ) {
  this.style.overflow = "hidden";
}

Sie können dies auskommentieren, wenn Sie möchten, oder einfach $('element').animate().css('overflow', 'visible');wie zuvor vorgeschlagen verwenden.

Der Grund, warum der Überlauf auf "Ausgeblendet" gesetzt ist, besteht darin, dass Elemente innerhalb des zu animierenden Elements während der Animation im Element enthalten sind. Wenn Sie beispielsweise die Breite eines Elements verringern, versucht sein Inhalt möglicherweise, sich zu verlängern und nach unten zu "fallen".

Dies wird im obigen Quellcode durch den Kommentar erklärt:

// Stellen Sie sicher, dass sich nichts herausschleicht

Hoffe das erklärt es für dich.

Nick Brunt
quelle
11

Jede dieser Lösungen hat bei mir funktioniert, aber ich habe den Trick gefunden:

$(myDiv).animate(
   { height: newHeight},
   { duration: 500, 
     queue: false, 
     easing: 'easeOutExpo', 

     step: function() {
       $(myDiv).css("overflow","visible");
     }
   }
);

Erzwingen Sie das CSS in jedem Schritt der Animation. Ich hoffe es hilft.

Adler
quelle
4

Bei Verwendung $('element').animate().css('overflow', 'visible');kann es zu Problemen kommen, wenn overflow-xund overflow-yfür das Element bereits angegeben sind.

In diesen Fällen wird use verwendet, $('element').animate().css('overflow', '');wodurch nur das Überlaufattribut entfernt und das overflow-xund overflow-yintakt bleibt.

Tetradb
quelle
2

Sie können durch :

function(e){$('#something').css('overflowY', 'scroll');}

zum Parameter .animate () options als Funktion, die ausgeführt werden soll, wenn die Animation abgeschlossen ist, wie folgt:

$('#something').animate({
                    width: '100px',
                    height: '100px',
                    overflowY: 'scroll !important' //doesn't work
                }, { duration: 500, queue: false, complete: function(e){$('#something').css('overflowY', 'scroll');} } );
Roger Gajraj
quelle
Wie würde das helfen? Das Verstecken erfolgt während der Animation, nicht danach .
Pilau
Ich muss sagen, diese Lösung hat mir besser geholfen. Dadurch konnte ich die Schriftrolle nach der Animation beibehalten. Ich habe nur das Gleiche in die Animation eingefügt, damit die Schriftrolle immer vorhanden ist. Vielen Dank!
G4bri3l
1

Meine bevorzugte Antwort ist zu verwenden $.Animation.prefilter. Hier ist ein Beispiel für jsfiddle.net.

Richten Sie den Vorfilter ein:

jQuery.Animation.prefilter(function(element, properties, options) {
  if (options.overrideOverflow) {
    jQuery(element).css("overflow", options.overrideOverflow);
  }
});

Dann benutze es

$(myDiv).animate(
  { height: newHeight},
  {
    duration: 500, 
    overrideOverflow: "visible" // Replace "visible" with your desired overflow value
  }
);

Beachten Sie, dass Sie den Optionsnamen nicht verwenden können overflow da jQuery diesen intern verwendet.

Obwohl diese Funktion in jQuery schon seit einiger Zeit verfügbar ist, scheint die Dokumentation nicht vollständig zu sein. Ein Dokumentationsentwurf ist jedoch verfügbar .

Siehe auch https://github.com/jquery/api.jquery.com/issues/256

Phylae
quelle
Dies ist ein ordentlicher Ansatz. Ich hatte nicht viel auf die im jQuery.Animation-Objekt verfügbaren Methoden zugegriffen. Vielen Dank für den Hinweis.
Neil Monroe
Sehr elegant, danke!
Rober
0

PERFEKTE "Adler" (2 Beiträge nach oben). Wenn ich nicht auf Ihre Antwort gestoßen wäre, hätte ich stundenlang danach gesucht, wette ich.

"Eagle" hat den richtigen Weg dafür gefunden.

Alle anderen Lösungen sind nur Hacks. Dies war der richtige Weg (wiederholen), deshalb bieten sie Ihnen alle Optionen, wenn Sie die "animieren" -Klasse verwenden.

Im Folgenden sind einige der verfügbaren Einstellungen aufgeführt (aus der Dokumentation unter https://api.jquery.com/animate/ ). Ich brauchte die Einstellung "Vollständig", um eine Aktion auszuführen, wenn die Animation beendet war.

    duration (default: 400)
    easing (default: swing)
    queue (default: true)
    specialEasing
    step
    progress
    complete
    start
    done
    fail
    always

Dies wird die Arbeit mit Animationen erheblich vereinfachen und ich werde dieses Format für alle zukünftigen Animationen verwenden, unabhängig davon, ob es benötigt wird oder nicht.

Scott Cleland
quelle
Das ist keine Antwort. Poste es als Kommentar! Die Antwort, die Sie erwähnt haben, ist jedoch der größte Hack in meinen Augen. Sie fügen Überlauf hinzu: sichtbar in jedem Schritt der Animation, der überhaupt nicht benötigt wird, da Sie nur einmal einstellen müssen. Furtermore jquery entfernt den Überlauf: versteckt sich, wenn die Animation beendet ist, damit Sie das nicht selbst tun müssen.
Fuzzyma