2014-06-19 15 views
5

Próbuję zrobić proste znikną obrazu na rollover - działa dobrze i gładko w Chrome, ale Firefox jest nieco skoczna. Próbowałem wykonać sztuczkę backface-visibility na kontenerze, ale wciąż nie miałem szczęścia.Jerky CSS3 przejście w Firefox

Ktoś ma jakieś pomysły?

JSFiddle

HTML

<div class="link-box large"> 
    <div class="image"> 

     <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRStwH3maKRqLU8lLOo1XbO6uZIKHRyf2PGv66H6ol5mB0kS_0r" alt=""> 
    </div> 
</div> 

CSS

.link-box .image img { transition: all .2s ease-out; width:200px; } 
.link-box.large { position: relative;} 
.link-box.large:hover .image img { opacity: .65; } 

Odpowiedz

5

Mój najlepszy przypuszczenie się, że ustawienie szerokości obrazu do 200px i pozostawiając wysokość nieokreśloną powoduje przeglądarka obliczyć wysokość obrazu. Jeśli wysokość wylicza się na niezłą liczbę całkowitą, nie stanowi to problemu. Jeśli wysokość zostanie obliczona jako dziesiętna, może to być przyczyną problemu. W tym przypadku naturalne wymiary obrazu to 275 na 183 piksele.

Zmieniając szerokość obrazu na 200px zmniejszamy obraz do 72,727272 ...% jego naturalnego rozmiaru.

275/200 = 0,727272 ... Lub jeśli wolisz frakcje: 275 (8/11) = 200

teraz uruchomione tego samego równania na rentowności Wzrost:

183 (8/11) = 133.090909 ...

Wygląda na to, że w normalnym trybie rzeczy częściowe piksele są przycinane, ale podczas przejścia częściowe piksele nie są przycinane, a obraz jest lekko wypaczony, aby pokazać częściowe piksele na tej samej wysokości.

Przycięte dół do 133px:
enter image description here
Nie przycięte i lekko wypaczone:
enter image description here


Teraz mamy dobrą hipotezę o tym, co jest przyczyną problemu, do rozwiązania:

Możesz dowolnie kodować wysokość obrazu:

Working Example

.link-box .image img { 
    transition: all .2s ease-out; 
    width:200px; 
    height: 133px; /* manually set the height */ 
} 

Lub jeśli raczej nie trudno kod wysokość, można również rozwiązać problem z krytym anti-alias hack, wystarczy dodać box-shadow.

Working Example

.link-box.large:hover .image img { 
    opacity: .65; 
    box-shadow: 0 0 0 #000; /* add a non-visible box-shadow */ 
} 

lub jeśli jesteś zaniepokojony zgodności z różnymi przeglądarkami z użyciem box-shadow, można również użyć granicę transparent:

Working Example

.link-box .image img { 
    transition: all .2s ease-out; 
    width:200px; 
    border: 1px solid transparent; /* add transparent border */ 
} 
+0

Czasami ustawienie jawnego 'height' nie jest sposobem, który chcemy, więc myślę, że to ustalenie nie jest *** ogólnie *** dobre. W każdym razie musimy przyznać, że trudno jest naprawić błąd w przeglądarce ssącej, takiej jak FireFox, po prostu niech tak będzie, pamiętaj, że tylko niewielka liczba użytkowników (którzy używają FireFox) musi cierpieć z powodu problemu (który również nie jest tak naprawdę poważny). Myślę, że poprawka poprzez ustawienie '201' px dla' width' zamiast tego jest lepsza. –

+0

@KingKing Zdaję sobie sprawę z twardego kodowania, że ​​wysokość nie jest idealna, ale gdy już znasz przyczynę problemu, znacznie łatwiej jest znaleźć rozwiązanie, z którym możesz żyć. – apaul

+0

Wygląda na to, że twoje przypuszczenia wydają się być blisko, ale lepiej jest znaleźć odniesienie mówiące o tym. Nie sądzę, żeby zmiana nieprzezroczystości miała coś wspólnego z obliczaniem "wysokości" i "szerokości", to jakiś wewnętrzny błąd w FireFox. Na razie jest to –

3

działa dobrze na moim Firefox.

W każdym razie możesz spróbować dodać specjalne atrybuty, które przygotują przeglądarkę do przejścia i faktycznie wyrenderują element z możliwą transformacją.

Taka cecha jest transform: translate3d(0,0,0);

Jak to:

.link-box .image img { 
    transition: all .2s ease-out; 
    width:200px; 
    transform: translate3d(0,0,0); 
} 
.link-box.large { position: relative;} 
.link-box.large:hover .image img { opacity: .65; } 
+0

Otrzymałem niewielki ruch w FF, ale to naprawiło. +1 –

+0

Próbowałem tego, ale wciąż robiłem ruch w Firefoksie - http://jsfiddle.net/ymbnG/4/ – wickywills

+0

Używam Firefoksa w wersji 30 po drodze – wickywills

Powiązane problemy