2012-11-08 10 views
7

http://jsfiddle.net/chovy/dk5Ua/jQuery fadeIn() powoduje display: block dla elementu liniowego

<div></div> 

var $span = $('<span>foo</span>'); 

$span.hide(); 
$("div").append($span); 
$span.fadeIn(); 

Zauważysz otrzymany przęsło ma wbudowany styl display: block; zamiast inline.

Jest uzyskany html:

<span style="display: block;">foo</span> 

Jak mogę uzyskać fadeIn(), aby doprowadzić do display: inline?

+0

czekaj, co jest kwestia ponownie ? –

+1

Wygląda całkiem nieźle dla mnie. – Blender

+0

w skrzypcach, to jest blok. Zaktualizowałem pytanie. – chovy

Odpowiedz

0

przez klonowanie oryginalnego obiektu mogę zadzwonić fadeIn i to daje mi styl inline .

var $htm = $('<span/>') 
, $divs = $('div'); 

$divs.replaceWith(function(){ 
    return $htm.clone().fadeIn(2000); 
}); 
4

Jestem z Adrianem; to naprawdę nie było pytanie. Ale masz rację: jQuery robi bardzo naiwne tłumaczenie właściwości wyświetlania, gdy używasz czegoś, co pokazuje/ukrywa elementy (np. Pokaż, ukryj, togle, fadeOut, itp.).

mam szczerze mówiąc nigdy nie rozumiał, dlaczego to robią (to byłoby znacznie prostsze wystarczy ustawić wyświetlanie na:

isShown ? '' : 'none'; 

zamiast ich logiki, która jest w istocie:

isShown ? 'block' : 'none'; 

) ale mają powody do prawie wszystkiego, co robią, więc wyobrażam sobie, że mają pewną logikę za ustawianiem niewłaściwych typów wyświetlania na rzeczy.

* EDIT *

Jak podejrzewałem, ludzie jQuery miał swoje powody (patrz komentarze jfriend00); również widzę, że jest teraz aktualne pytanie:

Jak uzyskać FadeIn() do wyświetlenia: Inline?

Odpowiedź brzmi, że trzeba sprawdzić, jak działa fadeIn; w zasadzie to po prostu:

this.animate({opacity: "show"}, speed, easing, callback); 

Innymi słowy, jest to z grubsza odpowiednik:

this.animate({opacity: '100%'}, speed, easing, function() { 
    this.css('display', 'block') 
}); 

(UWAGA: nie jestem faktycznie duża użytkownik funkcji animacji jQuery, więc podczas powyższy kod powinien działać , Nie składam obietnic).

Biorąc pod uwagę, że jeśli chcesz ustawić wyświetlanie na coś innego (jak mówią 'inline'), można zrobić:

this.animate({opacity: '100%'}, speed, easing, function() { 
    this.css('display', 'inline') // or you could use this.css('display', '') 
}); 
+0

Prawdopodobnie nie można użyć opcji 'isShown? '': 'none'; 'ponieważ muszą przesłonić dowolny CSS, który może być aktywny, a ustawienie wyświetlania na' '' 'pozwoliłoby na działanie CSS, zamiast zmuszać obiekt do pokazania. – jfriend00

+0

Wyobrażam sobie, że to dlatego, że elementy śródliniowe, będące częścią przepływu, powodują większe zakłócenia podczas zmiany ich właściwości wyświetlania, ponieważ wymuszają one przepływ wszystkiego wokół nich? Przypuszczam, że można animować zmianę rgba() na elemencie, ale nie byłoby to również obsługiwane we wszystkich przeglądarkach. –

+0

@ jfriend00 To jednak nie "pozwala, aby CSS działał"; zastępuje ona istniejącą wartość tam '' '', która (w każdej przeglądarce, którą znam) ustawia właściwość z powrotem na jej wartość domyślną (która będzie właściwym typem 'display', np. inline dla przęseł, blok dla div, itp.). – machineghost

15

Właśnie znalazłem proste rozwiązanie podobnego problemu.W twoim przypadku, poprawka byłaby to:

$span.css('display', 'inline').hide().fadeIn(); 
Powiązane problemy