Perfection or Vanity

Project: Terminated

Blog nie jest już dalej prowadzony ani aktualizowany. Mimo tego, wpisy i komentarze są dalej dostępne. Możesz przeczytać pożegnalny wpis albo przejść do archiwum.

Rollover, śpieszę z wyjaśnieniem, jest to efekt podmiany obrazka na inny, gdy znajdzie się nad nim kursor myszy. Co to jest CSS rollover i czym się różni od swojego skryptowego przodka już pisałem i jeśli nie słyszeliście o tej metodzie, to możecie zechcieć się z nią teraz zapoznać.

Tyle słowem wstępu. Rollover jaki zaprezentowałem dawniej był całkiem sprytny, nie wymagał czekania na wczytanie drugiego obrazka, ale nie był doskonały. Jego ułomność wynikała z zachłyśnięcia się możliwościami obrazków teł - wciskalibyśmy je wszędzie. Jednak i one stwarzają kłopoty:

  • Przeglądarki w znakomitej większości nie informują wystarczająco użytkownika, że coś się jeszcze ładuje. Firefox nie czyni tego wcale, Internet Explorer i Opera sygnalizują tylko liczbę elementów pozostałych do ściągnięcia.
  • Ich dostępność kuleje 1.
  • Nie są drukowane.
  • Nie są indeksowane przez wyszukiwarki.
  • Ich zapisywanie boli.

Ostatnie trzy punkty wymagają komentarza. Zastosowania podstawowych CSS rollovers w menu albo dla mniejszych przycisków jest jak najbardziej OK. Jednak gdy chcemy emulować funkcje JavaScript za pomocą CSS dla dużych obrazów, tworząc np.: galerię, to należy porzucić je dla rozwiązania opartego na prawdziwych obrazkach.

Podstawy teoretyczne są takie: tworzymy zdjęcie sklejone poziomo z dwóch jego stanów. Wstawiamy do dokumentu obrazek-link przez <a><img/></a>. Ustawiamy dla obrazka odpowiedni tekst alternatywny i wysokość (o tym dlaczego należy wstawiać height, już pisałem).

Kolejnym krokiem jest zamiana hiperłącza w element blokowy - display: block, ograniczenie jego szerokości do połowy szerokości obrazka oraz ustawienie przycinania wystającej reszty - overflow: hidden.

Następnie należy zająć się podmianą widzialnego kawałka obrazka na drugi, na razie niewidzialny. Zrobiłem to na trzy sposoby. Proponuję zapoznać się z kodem, podzieliłem CSS na trzy przejrzyste części.

Pierwszy używa dodatkowego obrazka tła dla blokowego hiperłącza. Jest przesunięte jak w starym CSS rollover, ale zakrywa je <img/>. Korzystając z selektora :hover dla linka włączamy niewidoczność dla obrazka (visibility: hidden), ujawniając to co leży pod nim. Właściwość visibility nie wpływa na ramkę jaką tworzy element wokoło siebie, więc wysokość rollovera pozostaje niezmieniona. Jest to dość tani chwyt, istnieją lepsze - o czym zaraz - ale możliwe, że kiedyś będzie trzeba użyć właśnie takiego sposobu.

Drugie podejście to skorzystanie z marginesu ujemnego, który przesuwa obrazek z lewo o połowę jego szerokości. I wszystko jasne. ;)

Trzeci przykład robi prawie to samo - lecz korzysta z właściwości text-indent, jako że nie zamienia obrazka w element blokowy.

Drugi przykład jest najdoskonalszy - można kliknąć prawym przyciskiem i zapisać obrazek. Trzeci podobnie, ale pojawia się dodatkowy mały odstęp poniżej obrazka. Pierwszy, jak pisałem, nie jest niczym bardzo interesującym.

Największym plusem widocznym dla zwykłego użytkownika jest ładowanie się obrazka od góry do dołu, jak bozia przykazała. Szturchanie obrazka myszką podczas ładowania włącza efekt rollover - nawet dla 10 górnych pikseli zdjęcia. Taki częściowy rollover nie działa tylko w pierwszym przykładzie 2.


Wszystkie przykłady działają w nieśmiertelnym trio - Firefox, Opera, Explorer. Misio 6 dostał parę hacków. Jeden jest związany z zapominaniem, że link jest blokowy, podczas stanu :hover. Drugi typ poprawek to zmiana hasLayout na true za pomocą zoom: 1.

Dla IE-malkontentów mam nowinę - Explorer w wersji siódmej radzi sobie z moim CSS-em bez hacków. Widząc to uśmiechnąłem się. ;)

  • 1) Nie jest to regułą - istnieją sposoby na podmianę tekstu obrazkiem które są dostępne przy wyłączonych obrazkach, a włączonym CSS - są jednak uciążliwe.
  • 2) Po co go więc pokazałem, skoro taki cienki? Do ogólnie pojętej nauki :P

Informacje i hiperłącza

Blog o projektowaniu zgodnych ze standardami stron internetowych.

Praktyczne przykłady, sztuczki CSS, sposoby obchodzenia błędów przeglądarek, lekki i nieinwazyjny JavaScript, użyteczny design, dostępność i skrypty użytkownika.

Informacje o wpisie

Napisał riddle 08 czerwca 2006 o 01:44

Kategorie: CSS, Dostępność, HTML & Semantyka, Użyteczność, Webdesign na luzie

Dodaj do:

Wpisy archiwalne

Archiwum miesięczne

  1. ciekawe, będę to musiał kiedyś wykorzystać i jeszcze raz przeczytać, bo teraz idę spać i Tobie też to radzę;)

  2. Michał Górny 2 08 czerwca 2006, 06:19

    >> można kliknąć prawym przyciskiem i zapisać obrazek.
    Mały szczegół: wtedy zapisywane są *oba* obrazki, a nie tylko ten właściwy, który chcielibyśmy mieć...

  3. hm... w sumie rzeczy gdzieś kiedyś to już widziałem... ale warto na pewno przyjrzeć się jeszcz eraz i zrewidować niektóre swoje pomysły z rollover na css :)

  4. I ponownie bardzo ciekawie i kompletni opisane. W sumie to chba nie ma już innych opcji na roll-overa co ?

  5. Generalnie - bardzo sprytne rozwiązanie... Baardzo sprytne.
    Po pierwsze, zamiast do gotowych obrazków dorobić ich wersje :hover (np jakimś kombajnem typu Irfan, ustawiając opcję desaturate - trzy kliknięcia) trzeba każde zdjęcie ręcznie edytować. Bardzo zachęcające.

    Pod drugie, tak jak wspomniał Michał, dostajemy obrazek-hybrydkę zamiast zwykłej miniaturki czy czego tam. To ja dziękuję za to, że dostałem możliwość zapisu - szkoda, że nie tego, co chciałem.

    Poza tym, zachowanie to raczej rola JS, a nie CSS. Przynajmniej IMO.

  6. A czy tak można?

    http://m4t3k.e-vro.org/pliki/rollover.php

    Nie czekasz wtedy na to aż drugi obrazek się załaduje po najechaniu.

  7. No dobrze, ale, jak juz wspomnial Peres, zapisywane sa oba obrazki, a projekrujac "przejrzyste i lekkie strony przeznaczone dla dynamicznych i nowoczesnych rozwiązań sieciowych" nalezy oczekiwac, ze jej przecietny uzytkownik nie musi posiadac umiejetnosci podstawowej obrobki grafiki.

    Matek: to Twoje rozwiazanie wydaje mi sie byc najlepsze i najlogiczniejsze, ale rodzi mi sie przy tym kilka pytan/zastrzezen: 1) czy dziala na wszystkich przegladarkach? 2) przeciez to bedzie strasznie kod brudzilo. Jak sobie pomysle, ze przy robieniu w ten sposob menu poczatek body to bedzie kilkanascie linijek z img to mnie az ciarki przechodza :P No i oddzielne klasy dla kazdego obrazka (ale to tez dziala u Riddla), co nie podnosi funkcjonalnosci, bo nie dosc, ze laduja siem oba obrazki (gdy sa male to nic nie przeszkadza, ale przy kilku duzych to juz sie obciazenie robi), to jeszcze kod przybiera niezlych rozmiarow.

    Ja bym to raczej probowal traktowac flashem, albo JS, bo po co odkrywac kolo na nowo, aczkolwiek wiem, ze artykul powstal raczej w celu zaprezentowania metod alternatywnych ;)

  8. Flashem ? Virgo Erns, chyba na głowę .... Flashem Menu ? Nawet przeładowany CSS bedzie lepszy niż JS i Flash razem wzięte. Jeśli ktoś czyta tego Bloga i trybi trochę .... to nie muszę tłumaczyć dlaczego.

  9. A strona ładuje mi 2x więcej grafiki niż normalnie, nawet jeśli nigdy z tego nie skorzystam (przeglądarka wbudowana w telefon)... Not nice.

  10. [Michał Górny]: „>> można kliknąć prawym przyciskiem i zapisać obrazek.
    Mały szczegół: wtedy zapisywane są oba obrazki, a nie tylko ten właściwy, który chcielibyśmy mieć...”

    moj firefox zapisuje plik docelowy natomiast ie faktycznie zapisuje obraz rollovera

  11. hmm. jestem początkującym. mam fotkę wyświetlaną w ramce poprzez: <code><iframe name=„foto” marginWidth=0 marginHeight=0 src=„foto/large/krajobraz/pola.jpg” frameBorder=0 width=100% height=100% scrolling=no div align=„center”></iframe></code>
    potem wczytywane są w tą ramkę inne fotki z miniatur – chciałbym by w tym oknie duże fotki wczytywały się czarno białe a po najechaniu myszką pokazywały się w kolorze. nie mam zielonego pojęcia jak to zrobić. próbowałem już na różne sposoby ale z uwagi iż jestem początkujący nie mogę sobie poradzić. może mi ktoś pomoże.

  12. A mi sie ten sposób bardzo podoba bo kto ściąga obazki z menu i ile one ważą... No chyba że projektujecie strony jako jeden wielki rollover! To wtedy faktycznie zróbcie ją w js albo flash ale ciekaw co google na to… Bo stronkę pasowało by jeszcze czasem pozycjonować! A przy flashu pozostaje magia <noscript> za którą można dostać bana! Może sie nie znam ale tyle mojego zdania…

  13. Hej.

    Dlaczego po zastosowaniu tego efektu wiesza mi się IE6 ??

    Dodam, że mam świeżutko zainstalowany system Win XP SP2 oraz IE6…

    Stronkę testuję na lokalu przy użyciu Krasnala…

    Generalnie bez efektu stronka śmiga ładnie, natomiast dołożenie display:block; do elementu <a> powoduje błąd w IE…

    Błąd powstaje po uruchomieniu stronki i kilkukrotnym wskazaniu obrazka myszą... Efekt wydaje się funkcjonować prawidłowo, ale po 2-3 sekundach pojawia się błąd i IE się zamyka…

  14. Fajny efekt, dzięks za publikację :)

  15. Nie znałem tej sztuczki.
    Dzięki.

  16. A da się tej sztuczki użyć dla zmiany tła dla innego elementu na stronie?
    Mam menu i jak najadę na link chciałbym żeby zmieniało się tło które jest w zupełnie innym miejscu.

  17. Nie znałem tej sztuczki.
    Dzięki.

  18. swietne – ale jak to przerobic by po kliknieciu zostawał aktywny drugi obrazek ?

  19. Może zrobić by tak:
    <a href='...' id='a'><img ... id="b" /><img ... id="c" /></a>
    a w css:
    a#a:hover > img#b { display:none; }
    do tego wiadomo, wymiary obrazków i #a ma rozmiar jednego obrazka i overflow:hidden;
    możnaby to jeszcze na pewno jakoś przerobić, żeby nie było tyle ID, albo zrobić class, nie wiem jeszcze jak-teraz to wymyśliłem
    co wy na to?

  20. A da się to zastosować do animowanego obrazku ? Np. obrazek 400px - lewa cześć 200px normalny statyczny obraz a druga animowany. Po zastosowaniu powyższego tutka animacja wyświetla się tylko 1 raz a zależało by mi na tym aby odtwarzana była za każdym razem po najechaniu gryzoniem.

  21. Dzięki za tę prezentację. Masz talent do przekazywania wiedzy w sposób prosty i przejrzysty. Wykorzystałam technikę ujemnego marginesu, bo jej nie znałam, a nie chciałam adresów obrazków pakować do CSS-a (technika tła).

    Zauważyłam tylko taką wadę przy technice z ujemnym marginesem: dodanie ramki lub dopełnienia do obrazka "psuje się" z tej strony, gdzie ukryta jest niewidoczna część obrazka.