Nie myślałem, że Arkusze Kaskadowe Stylów jeszcze kiedykolwiek zaskoczą mnie... a już na pewno nie w taki sposób - elementami, które są podstawą i które znam od wielu, wielu lat.
Pomóżcie, bo nie rozumiem tego totalnie.
Wydaje się, że prostą strukturę, którą napisałem, Trident wyświetla poprawnie (wg mojego rozumowania) a ani WebKit, ani Gecko, ani Presto nie potrafią tego zrobić. (Tak, wiem, że to przecież nawet brzmi śmiesznie! Wychodzi na to, że czegoś nie rozumiem.)
Chodzi o
text-decoration w poniższym przykładzie:
<style>
a, a:link {color: black; text-decoration: none;}
a:hover {color: red; text-decoration: underline;}
b.hide {display: none;}
a:hover b.hide {color: green; text-decoration: none; display: inline;}
</style>
<a href="http://g.cn">
Odnośnik widoczny <b class="hide"> (część ukryta) </b>
</a>
Który daje następujący efekt:
Odnośnik widoczny (część ukryta)
Mam więc niepodkreślony odnośnik - rodzic, który jest widoczny i ma kolor czarny. We wnętrzu mamy dziecko klasy "hide" - dodatkowy element <b> (pierwszy lepszy jaki mi się nasunął) dalsza część odnośnika, niewidoczna (
display: none).
Po najechaniu kursorem na link oczywiście rodzic nabywa pseudoklasę
:hover zmieniając swoje właściwości: tekst całego linku zmienia kolor na czerwony i dostaje podkreślenie (
text-decoration: underline;) oczywiście również czerwone, bo tak działa CSS. Dziecko o klasie hide jest wyświetlane (
display: inline), nadawany jest mu INNY kolor - zielony, i
usuwane jest podkreślenie (
text-decoration: none;).
Więc dlaczego, do cholery, wszystkie zgodne ze standardami przeglądarki wyświetlają mi to źle! Co prawda
wyświetlają pogrubione dziecko <b> o klasie
hide,
zmieniają jego kolor poprawnie na zielony, ale całkowicie olewają atrybut
text-decoration: none; i na chama wyświetlają czerwone podkreślenie.
Natomiast jedyny Trident wyświetla mi to tak, jak ja chcę, żeby się wyświetlało.
Czyli BEZ podkreślenia w tym elemencie, który kaskadowo dostaje atrybut
text-decoration: none;
O co w tym chodzi?
Co prawda rozwiązanie jest dosyć proste i działa na wszystkich silnikach:
<style>
a, a:link {text-decoration: none;}
a span.visible {color: black; text-decoration: none; }
a:hover span.visible {color: red; text-decoration: underline;}
b.hide {display: none; }
a:hover b.hide {color: green; display: inline; }
</style>
<span>
<a href="http://g.cn"><span class="visible">
Odnośnik widoczny</span>
<b class="hide"> (część ukryta) </b>
</a>
</span>
Tekst - odnośnik, który ma mieć podkreślenie - obejmujemy dodatkowym znacznikiem <
span> i to pod nim ustawiamy
text-decoration: underline;, podczas najechania kursorem, natomiast na całym linku całkowicie wyłączamy podkreślenie
text-decoration: none;
Smutne, ale prawdziwe.
Komentarze do wpisu
"2010-09-03 Wpis 363 - Zgodność z CSS: text-decoration: none; WTF?":
03 września 2010, 03:01:19
Zapakuj część widoczną w jakiegoś spana i jemu dawaj text-decoration.
Wg mojego rozumowania to Trident źle wyświetla ;)
03 września 2010, 03:03:50
Nie... No ja wiem, jak sobie z tym poradzić (wpadłem na to jeszcze przed napisaniem wpisu, ale że nie byłem pewny czy zadziała, skodziłem go przed chwilą - działa). Nie mniej, tym bardziej jest to dziwne. Za raz wrzucę kod działający. Pozostaje pytanie: Dlaczego? Mozesz uargumentować swoje zdanie "to Trident źle wyświetla" (ale inny niż: 'Microsoft śmierdzi' okej?). Bo skoro WebKit już pakuje ten underline pod b, to dlaczego zmienia mu kolor?
03 września 2010, 03:06:23
Spójrzmy w kod.
b miał być zielony i nie mieć podkreślenia. Jest zielony? Jest. Nie ma podkreślenia? Nie ma. (cicho, już wyjaśniam)
a miał być czerwony i dostać podkreślenie. Jest czerwony? Jest. Jest podkreślenie? Również jest, tak długie jak całe a (a więc obejmujące również to nieszczęsne b).
To, co bierzesz za text-decoration b, jest tak naprawdę text-decorationem a i raczej nie ma rady żeby się go w ten sposób pozbyć ;)
03 września 2010, 03:10:35
Hm, no w zasadzie to ma sens co mówisz. Tylko dlaczego w takim razie b jest zielone, skoro "a miał być czerwony"? (wiem, b jest dzieckiem i dziecko nie dziedziczy w tym momencie atrybutu po tatusiu, bo ma swój własny, więc to samo powinno być z underlinem). Ok, ale rozumiem, kwestia kolejności.. .chociaż jak dla mnie w tym wypadku nadal Trident jest mądrzejszy (olaboga, co ja mówię!).
Powinno być coś w stylu tabelkowych "border-collapse:collapse;".
03 września 2010, 03:14:12
Text-decoration nie dziedziczy, bo ma własny - "none". To tatuś wtrynia się ze swoim podkreśleniem.
Zapewne gdybyś jednak dał b jakieś podkreślenie, byłoby ono w kolorze zielonym ;)
03 września 2010, 03:14:57
Ahh...! Czyli chodzi o warstwy. Ale żal.
03 września 2010, 03:15:39
Nie warstwy, tylko DOM ;)
I czemu żal?
03 września 2010, 03:17:27
No wiesz, cebula ma warstwy i DOM też ma warstwy. Gdyby dać, tak jak mówisz podkreślenie pod b koloru tła to wydawałoby się, że go nie ma. Żal, że CSS olewa dzieci ;)
03 września 2010, 07:27:18
Nie czytałem komentarzy ale:
http://www.w3.org/TR/CSS21/text.html#lining-striking-props
Zażalenia do W3C proszę słać :D
03 września 2010, 11:25:37
http://twitter.com/riddle/status/17569403282
03 września 2010, 12:08:46
Zamiast podkreślenia (text-decoration: underline) zastosuj dolne obramowanie (border-bottom), i będziesz mógł cudować z kolorami ;)
03 września 2010, 12:30:01
No tak, ale border, to border a underline to underline. Tak samo W3C upierało się, żeby nie używać tabel do ukłądania layoutu strony bo nie po to są te znaczniki, tak jak nie po to są text-underline-style i text-underline-color, żeby z nich nie skorzystać.
@riddle, @Crozin, dzięki za linki ;]
Dodaj komentarz: