czwartek, lipca 06, 2006

Po co komu standardy...

... jeśli większość się ich nie trzymie? No więc tak, dziś sobie powiedziałem "Dziś będziesz produktywny - popracujesz nad stroną koła chemików". Już kiedyś się za to zabrałem i nie skończyłem teraz też nie ]:( Tak sobie wymyśliłem, że tak zmodyfikuję stronę by była zgodna ze standardami W3C. Pomału dochodzę do wniosku, że to chyba nie realne. Jak rok temu dostałem od Minaela uprawnienia do bawienia się na serwerze to byłem w siódmym niebie. Jak się okazało miałem kawał roboty do zrobienia. Stronka była w HTMLu napisana, więc ją przepisałem na PHP i ujednoliciłem kodowanie wszystkich dokumentów na UTF-8. Stworzyłem galerię. Postawiłem forum. Dodałem możliwość logowania się. Fajnie, super, ale struktura się nie zmieniła - stronka dalej bazuje na ramkach. I wtym cały problem. Dziś plik po pliku powoli przepuszczałem przez online walidator W3C poszczególne główne pliki strony - tak dla pewności, bo już nie pamiętam, czy coś nie zmieniałem. No i powrócił stary , nierozwiązany problem. Sprawa wygląda następująco. Strona używa ramek, ale nie chcę by były widoczne ich brzegi. Jak ostatnio na ten temat rozmawiałem z Kobrą to mi powiedział, że w mam kod zwalony, bo w CSSie można wszystko zrobić. Jasne, bo uwierzę.... To nie takie łatwe, jak się wydaje. Dlaczego? Dam przykład . Załórzmy, że mamy stronę zbudowaną z 2 ramek, która ma być zgodna z XHTML 1.0 i CSS 2.0. Lewa ramka ponadto ma zawierać menu we flashu, a prawa wyświetlać. Mówiąc krótko coś takiego: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl"> <head> <title>Strona z 2 ramkami</title> <link rel="stylesheet" href="default.css" type="text/css" /> </head> <frameset> <frame name="Ramka 1" src="ramka1.php" /> <frame name="Ramka 2" src="ramka2.php" /> </frameset> </html> Niby tak niewinnie wygląda, bo takie też jest. Narazie... Schody się zaczynają jak chcemy zrobić, by to ładnie wyglądało. Problem w tym by się pozbyć tego paska pomiędzy ramkami. Różne przeglądarki w różny sposób to impretują. Jak czytamy w definicji typu dokumentu ramek (xhtml1-frameset.dtd): <!-- only one noframes element permitted per document --> <!ELEMENT frameset (frameset|frame|noframes)*> <!ATTLIST frameset %coreattrs; rows %MultiLengths; #IMPLIED cols %MultiLengths; #IMPLIED onload %Script; #IMPLIED onunload %Script; #IMPLIED > <!-- reserved frame names start with "_" otherwise starts with letter --> <!-- tiled window within frameset --> <!ELEMENT frame EMPTY> <!ATTLIST frame %coreattrs; longdesc %URI; #IMPLIED name NMTOKEN #IMPLIED src %URI; #IMPLIED frameborder (1|0) "1" marginwidth %Pixels; #IMPLIED marginheight %Pixels; #IMPLIED noresize (noresize) #IMPLIED scrolling (yes|no|auto) "auto" > Innymi słowy jedyną możliwą (zgodną z XHTML 1.0) drogą by wyeliminować, pasek to ustawić w każdej ramce w właściwość frameborder="0". Niby proste, ale nie działa. Obojętnie czy się to zrobi w kodzie, czy w CSSie. Firefox, IE, a nawet Opera rysują mi albo puste, białe miejsce, albo mniejszy lub większy pasek. Można się paska pozbyć wpisując border="0". Ale nie jest to już zgodne ze standardem. Wiem, ramki są już przestarzałym elementem, ale jednak standard XHTML je wspiera, chociaż możnaby oczekiwać, że da trochę więcej swobody developerom. Ktoś powie, że to nie XHTML winny tylko przeglądarki sie nie trzymią. No tak. Rozumiem, że IE sie nietrzymie - nigdy tego nie robił. Ale FF i O? Wystarczyło dodać do standardu, chodźby tylko opcjonalną właściwość border - tak dla kompatybilności. A teraz z innej beczki. Załóżmy, że mamy już te ramki zgodne ze standardem (które fatalnie wyglądają) i chcemy teraz w jednej umieścić animację flash. I tutaj się zaczynają dopiero przekrety. Po pierwsze XHTML wygnał tag <embed>. Więc jedynym tagiem umożliwiającym wstawienie flasha jest <object>. I to nazywa się "The Satay Method". Drugą obecnie stosowaną metodą jest uzycie Javascriptu do wstawienia odpowiednich tagów, zależnie od przeglądarki [ czytaj o skrypcie ]. Jest to powszechnie używana metoda na stronach oferujących filmiki w odtwarzaczach flash. Czemu akurat skrypt w JS? A bo obchodzi się w ten sposób walidator W3C ]:) Sprytne, ale jednak dziwne. Czy ja to rozumię dobrze? Jeśli chcę coś zrobić zgodnie ze standardem to mam używać trików, by sprawiać wrażenie, że to standard... Chyba poeksperymentuję ze zmianą struktury stronki używając wyłącznie tagów <div>. Stawia mnie to jednak przed nowym wyzwaniem. Każde przeładowanie strony, będzie na nowo ładować menu we flashu, a co za tym idzie za każdym razem pokazywał animację z dzwiękami dzwonków. Po czasie to może być nawet bardzo irytujące. Wiem, że można to też zrobić przy użyciu technologi typu AJAX itp. , by tylko wczytywały się pewne fragmenty strony, bez konieczności przełądowania całej, ale a) jak ktoś ma wyłączony JS to nie działa (przynajmniej kumpel mi tak mówił, a on jest zawodowo webdeveloperem) i b) jak narazie to jest to dla mnie wyższa szkoła jazdy - niestety... Podsumowując. Nie żebym miał coś przeciwko standardowi XHTML, ale mimo moich oczekiwań, nie ułatwia on człowiekowi pracy. ]:)

1 komentarz:

Anonimowy pisze...

I say briefly: Best! Useful information. Good job guys.
»