Nerdblog.pl - Outline bug w firefoksie

Outline bug w firefoksie

Dodano: 02.06.2008

Prawie wszyscy twórcy nowoczesnych stron spotkali się z problemem dziwnego zachowania Firefoksa. Gdy tworzymy z linka element blokowy i "usuwamy" tekst z widoku za pomocą text-indent (na przykład, żeby stworzyć graficzny przycisk), Firefox nadal traktuje taki tekst jako element jego rodzica i renderuje outline (to przerywane obramowanie) daleeeeeko w lewo lub prawo. Usuwanie tekstu przez font-size nie działa w przeglądarkach posiadających limit na minimalną czcionkę, display: none ukrywa tekst przed screenreaderami, a pustego elementu nawet nie bierzemy pod uwagę.

 
a {
	display: block;
	width: 200px;
	height: 150px; 
	/* I tutaj mamy problem: */
	text-indent: -9999px; 
	} 
 

Większość osób poleca zrobienie po prostu outline: none, ale uważam to za półśrodek - skoro wszystkie linki pokazują takie obramowanie to z jakiegoś powodu zostało stworzone (choćby, żeby można było zobaczyć co zostało kliknięte ostatnio). Musiałem więc odrzucić ten sposób. Potem znalazłem i dłuższy czas korzystałem z równie prostego rozwiązania dodając overflow: 'hidden' do CSS samego linka. Trzeba przyznać, źe działało, ale Riddle wskazał mi poważną wadę tego rozwiązania. Jeśli klikniemy na jakiś link i przytrzymamy lewy przycisk myszy, ale potem zmienimy zdanie, możemy odciągnąć go w bok i się nie załaduje. W Firefoksie 2 oraz poczatkowych betach 3 (w RC1 błąd wydaje się być poprawiony) po dodaniu overflow: hidden, takie coś przestaje działać i link ładuje się mimo to. Usability--.

 
a {
	display: block;
	width: 200px;
	height: 150px; 
	/* niestety, to też nie jest idealne rozwiązanie */
	text-indent: -9999px;
	overflow: hidden;  
	}
 

Powstaje więc dylemat. Czy usuwać błąd, czy zostawić go jako niewielki problem? Moim zdaniem takie coś zdecydowanie szpeci serwis, ponieważ sprawia to wrażenie jakby ktoś się śpieszył i zostawił niedociągnięcia. Długie, poziome linie przez całą stronę zdecydowanie psują walory estetyczne, a dodatkowo drażnią.

W końcu znalazłem optymalne rozwiązanie, które działa w każdej przeglądarce, nie upośledza strony i nie sprawia problemów.

 
a {
	display: block;
	width: 200px;
	height: 150px;
	text-indent: -9999px; 
	}
 
/* tak już lepiej:*/
a:focus {
	overflow: hidden; 
	}
 

Wykorzystane w ten sposób overflow:hidden nie blokuje przeciągania, więc ten problem jest załatwiony. Inne przeglądarki nie widzą różnicy skoro i tak przenosimy tekst poza pole, więc wszystko jest ok. Całość jest uniwersalna i nie powoduje problemów w implementacji - to tylko trzy dodatkowe linijki. Inne pomysły zostawiać w komentarzach :)

Zablokowane

Ja od zawsze stosuję miks: font-size: 0; + text-indent: -2000em i mam z głowy. Firefox radzi sobie z font-size, a reszta programów z text-indent.

IMO twórcy przeglądarek dziwnie myslą. Jasne – jeśli mamy minimalną wartość czcionki ustawiona w przeglądarce, to nie widzę problemu z powiększeniem jej, ignorując CSSa. Ale do jasnej ciasnej – jak piszę font-size: 0; to przecież wyraźnie zaznaczam ‘nie wyświetlaj jej w ogóle’, więc przeglądarki powinny tę obsługę minimalnej wielkości zaczynać od 1px.

02.06.2008, 18:14

zx – problem polega na tym, ze firefox tez ma opcje ustawienia minimalnego rozmiaru czcionki, a wtedy problem pozostaje (dla malego procentu ludzi, ale niestety). Moje rozwiazanie dziala wszedzie.
A czcionki pewnie z automatu po prostu potraktowane. Napisz na bugzille Firefoksa i Opery, moze zmienia :)

02.06.2008, 18:16

Defaultowo wyłączona, ale racja – jakiś odsetek dostanie wielkie obramowanie. Chyba zostaje tylko przenieść się na twoje rozwiązanie. :)

O Firefoxie mam nikłe pojęcie więc w te Mozillowe sprawy się nie będę mieszał. Opera już cynk dostała.

02.06.2008, 18:20

O! Z nieba mi spadłeś z tym postem – dzięki!

02.06.2008, 19:37

A co z outline: 0? ;)

02.06.2008, 21:21

Greenek: przeczytaj jeszcze raz wpis. Uważnie.

02.06.2008, 21:22

Fakt xD

02.06.2008, 21:23