Luettelen alla aihealueittain tekemäni aihepiirit. Paluulinkkeinä tähän aihepiiriin on tämä valikko ja sivun yläreunassa oleva linkki Aihepiiriluettelo.
| ||||||||||||||||||
![]() | Aihepiiriluettelo > CSS-oppaan etusivu > Oppaan lisäsivut > P Millaisia CSS-totetusvirheitä on Netscape/Mozilla-selaimissa |
|---|
Suoran CSS.n (style="...") liittäminen on ongelmallista.
Toisaalta sen käyttö on huono asia, sillä Netscape 4.x
saattaa kaatua tai käyttäytyä omituisesti. Toisaalta sen käyttö
on joskus välttämätöntä, koska linkitetty CSS ei aina
toimi. Havaitsin tämän asian testatessani dynaamisia
valikoita
.
Jos suora CSS ei sovi muille selaimille, ne voivat saada ulkopuolisten CSS-tiedostojen
avulla sopivan CSS:n, jos ulkoisissa tiedostoissa olevissa CSS-kuvauksissa käytetään
!important sääntöä. Sääntöä
käytettäessä on kuitenkin syytä välttää säännön
ylikuormittamista (moneen kertaan uudelleen määrittämistä),
sillä selaimet eivät aina hyväksy ylikuormitettuja sääntöjä.
Monissa tilanteissa on järkevää ohittaa Netscape 4.x -selaimet.
Periaatteessa ne voi ohittaa käyttämällä tuotisääntöäe![[S]](../Kuvat/buttons/S.gif)
ja yhdistämällä se JavaScript-koodaukseen. Koska
Opera 4.x+ -selaimisa on moodi Identify Mozilla 4.x/Esittäydy:
Mozilla 4.x skriptin ehto tulisi laatia siten, että Opera ei lue
Netscape 4.x:lle tarkoitettu aCSS:ää. Koodi tulee kirjoittaa seuraavaan
tapaan:
<script language="JavaScript" type="text/javascript">
<!--
if (document.layers) /* Mitkään muut kuin Netscape 4.x -sarjan selaimet eivät tue tätä metodia, joilloin Opera kuten muutkin selaimet ohittavat lohkon, joka on tämän ehdon jälkeen (annan edempänä toisen vaihtoehdon) */
{document.write('\<\lin'+'k\ rel=\"stylesheet\"\ type=\"text/css\" href=\"Netscape4xStyle.css\"\>'); }
//-->
</script>
<style type="text/css">
<!--
@import url(muilleSelaimille.css);
-->
</style>
Sain tämän perusvihjeen Sam Marshallilta, mutta olen
selaintunnistuksen suhteen muuttanut tunnistustapaa. Systeemi toimii nyt kaikilla
selaimilla. MS IE, Opera ja uusien Netscape/ Mozilla Gecko -selaimilla ei haittaa mitään, vaikka JavaScript-tuki olisi kytketty pois päältä. Vain Netscape 4.x tarvitsee sitä ja tyylisivut eivät toimi Netscape 4.x -sarjan selaimissa, jos JavaScript ei ole päällä. Joissakin tilanteissa osa CSS:stä saattaa olla järkevää antaa JavaScript-koodin avulla. Käsittelen tällaisia tapauksia eräällä lisäsivulla, joka käsittelee dynaamisia valikoita
.
Edellisesessä esimerkissä mainitun käytännön ongelmana on se, että medialohkojen
avulla toteutettuja mediatyyppivalintoja ei voi käyttää, jos tarkoitus on se, että CSS toimii myös Mac -selaimissa. MS IE Mac (koskee ainakin versioon 5.0 asti) ei nimittäen tue medialohkoja (@media {...} vaan se hyppää kaiken medialohkojen sisään kirjoitetun CSS:n ohi.
Opera-selaimissa on toinen erityisongelma. Se lukee aina kaikki @import at-säännön sisältämän CSS kaikille mediatyypeille, jos ei nimenomaisesti ole kerrottu mitä mediatyyppiä sääntö koske (koskee ainakin versioon 5.11 asti). Mediatyyppitarkennin (esim. @import url(...) screen;) toimii vain harvoissa selaimissa. @media ja @import at-sääntöjä ei tulisi käyttää ollenkaan, jos tarkoituksena on luoda CSS kaikille meditatyyppejä tukeville!
Parempi vaihtoehto samasta perusideasta on luoda Netscape 4.x -sarjan selaimille omia CSS-tiedostoja ja laittaa kommentit sellaisten tiedostojen ympärille, joita Netscape 4.x ei pidä lukea. Alla esitetty tapa tekee mahdolliseksi mediatyyppien toimivuuden myös Mac-selaimissa (koodi on tarkoitettu XHTML-dokumentteihin):
<script language="JavaScript" type="text/javascript"><!--
if (document.layers)
{document.writeln('\<lin'+'k\ rel=\"stylesheet\"\ type=\"text/css\"\ href=\"../Css/basicNetscape4.css\"\ \/\>');
document.writeln('\<lin'+'k\ rel=\"stylesheet\" type=\"text/css\"\ href=\"../Css/Netscape4SomeOtherSite.css\"\ \/\>');}
//-->
</script>
<script language="JavaScript" type="text/javascript">
<!--
if (document.layers)
{document.write('\<'+'!\-\-'); } /* Jos kommentteja ei luoda kahdessa osassa selaimet saattavat käsitellä niitä virheellisesti! Jos\-\-sijasta kirjoitetaan--tarkistuspalvelu tulkitsevat koodin siten, että dokumenteissa on käytetty sisäkkäisiä kommentteja, jotka eivät ole sallittuja. */
//-->
</script>
<link rel="stylesheet" type="text/css" href="../Css/CssSitePrint.css" media="print" />
<link rel="stylesheet" type="text/css" href="../Css/CssSiteProjection.css" media="projection" />
<link rel="stylesheet" type="text/css" href="../Css/CssSiteScreen.css" media="screen" />
<script language="JavaScript" type="text/javascript">
<!--
if (document.layers)
{document.write('--'+'\>'); }
//-->
</script>
Olen havainut, että ensimmäisten ja viimeisten Netscape 4.x -sarjan selainten välillä on suuri luotettavuusero. Netscape 4.04 kaatuu hyvin helposti mutta Netscape 4.79 suhteellisen vakaa. Oletettavasti myös Netscape 4.6x on suhteellisen vakaa. Jos on tarpeen, on mahdollista myös tehdä eri CSS eri Netscape 4.x -sarjan selaimille. Alla olevassa esimerkissä Netscape 4.0x-4.5x ja uudemmat Netscape 4.x -sarjan selaimet saavat erilaisen CSS:n:
<script language="JavaScript" type="text/javascript">
<!--
if (document.layers)
{document.writeln('\<lin'+'k\ rel=\"stylesheet\"\ type=\"text/css\"\ href=\"../Css/basicNetscape4.css\"\ \/\>');}
//-->
</script>
<script language="JavaScript" type="text/javascript">
<!--
/* Koska tässä tapauksessa tarvitaan tarkempi CSS, prosessiin kuuluu kaksi osaaecause. Tavoitteena on, että Opera voisi ohittaa kaikissa olosuhteisa Netscape 4.x -selaimille tarkoitetun CSS:n */
if (navigator.userAgent.indexOf('Opera')!=-1){} /* Koska Opera havaitsee tunnistusmerkkijonon, joka sopii sille se ohittaa seuraavan lohkon siinäkin tapauksessa että se teeskentelisi olevansa Netscape 4.x -selain. Toimii luotettavasti ainakin Opera 4.02+ lähtien. Vanhemmat Opera-selaimet eivät aina anna tätä tunnistusmerkkijonoa, joten niitä ei voi luotettavasti tunnistaa tällä tavoin. Periaatteessa myös document.getElementById
voitaisiin käyttää, mutta saamani s-postin mukaan Netscape 4.x -selaimilla on toisinaan vaikeuksia ei-tuettujen metodien kanssa. */
else if (navigator.appName.indexOf("Netscape")!=-1 &&
navigator.appVersion.indexOf("4.7")>=0) /* Ilman ensimmäistä ehtoa lohko voisi koskea myös Opera-selaimia, jos ne esittäytyvät Netscape 4.7x -selaimina. */
{document.writeln('\<lin'+'k\ rel=\"stylesheet\" type=\"text/css\"\ href=\"../Css/Netscape4CssSite.css\"\ \/\>');}
//-->
</script>
Huomautus. JavaScript-koodauksen avulla on mahdollista tunnistaa myös muiden asioiden kuin nimen tai versionumeron perusteella, esim. näytön värisyvyyden ja koon perusteella ja siten luoda näytön ominaisuuksiin perustuvia CSS-tiedostoja. Sen sijaan vain harvat selaimet tarjoavat mahdollisuuden valita oletustyylisivun ja vaihtoehtoisen tyylisivun välillä. Voit etsiä JavaScript esimerkkejä yleisillä hakukoneilla (kuten Altavista ja Google) esim. avainsanoilla javascript+window+color depth jajavascript+window+size.
JavaScript-koodauksen vaihtoehtona on serveripuolen koodaus, joka ei ole riippuvainen siitä onko JavaScript-tuki päällä vai ei. Mutta serveripuolen koodilla ei voi testa, mitä piirteitä eri selainten JavaScript-tulkit tukevat, joten metodeihin perustuvat tunnistukset eivät toimi. Ainakin Opera voi helposti saada virheellisen CSS:n. JavaScript-koodauksella on helpompi ottaa huomioon tilanteet, joissa JavaScript-tuki on poissa päältä. Käsittelen sekalaisilla tietotekniikkaa käsittelevillä sivuilla PHP:llä
toteutettua selaintunnistusta.
Voit käyttää ilman linkitystä:
BODY taustaominaisuudet ilman taustakuvan asemointia (vanhimmat versiot eivät hyväksyneet monitasoisille BODY elementin sisällä oleville elementeille taustamääreitä).Annan kaksi esimerkkiä, miten määritellä CSS Netscape 4.x -selaimille:
![[S]](../Kuvat/buttons/S.gif)
.![[S]](../Kuvat/buttons/S.gif)
, because they don't work properly with Netscape 4.x.Kun yritetään luoda hyvä lopputulos erityisesti seuraavat asiat ovat ongelmallisia:
SPAN käyttö täytyy testata, sillä selaimen käytös on virheellinen. Pahinta on se, että tekstit voivat mennä toistensa päälle. Elementti sentään joskus toimii.background-color ominaisuus toimii virheellisesti. Jos reunuksia ei ole taustaväri tulee vain osaan elementtiä. Reunoja käytettäessä Netscape 4.x tekee aina läpinäkyvän täytteen reunusten ja sisällön väliin (tämän ongelman ratkaisemiseksi on sentään jotain tehtävissä ja käsittelen ongelmaa vielä edempänä).border ja width ominaisuudet ne käyttäytyvät oudosti.Koska et voi tehdä seuraaville asioille yhtään mitään suosittelen määrittelemään CSS:n niin, että Netscape 4.x ei lue niitä tai se saa ne vain joissakin tilanteissa:
text-align:justify voi käyttää vain hyvin yksinkertaisissa dokumenteissa.BODY ja HTML ei pidä antaa reunuksia, sillä selain kaatuu niitä käytettäessä.
Netscape 4.04 kohdalla myös muille elementeille annetut reunukset saattavat kaataa selaimen - ylipäätänsä Netscape 4.04:lla on erittäin vakavia ongelmia monimutkaisten CSS-määrittelyjen kanssa. Ongelman ydin on monitasoiset reunukset omaavat sisäkkäiset elementit (uusimmat 4-sarjan selaimet, esim. Netscape 4.79, eivät kaadu tästä syystä). Yhden tason reunukset eivät kaada selaimia. Jos sivuilla on yksinkertainen rakenne ja sivut ovat suhteellisen lyhyitä BODY-elementille voi antaa reunukset. Yhtenä reunusongelmana on vielä se, että selain ei eri värejä eri elementin reunoille.border:none. Vanhat Netscape 4.x -sarjan selaimet saattavat kaatua määrittelystä. Niille monitasoiset taustaominaisuudet ovat aina ongelmallisia, jolloin myöskään GIF-kuviin perustuva ratkaisu ei toimi. Jos on tarpeen tee useita CSS-versioita eri Netscape 4.x -sarjan selaimille. CSS:n sijaan on mahdollista käyttää sisäkkäisiä taulukoita. Niiden avulla voi luoda myös nättejä reunustuksia. Tosin taustakuvat toimivat paremmin ILAYER ja LAYER elementtien kanssa. Koska ne ovat selainkohtaisia, olen käyttänyt joissakin dynaamisten valikoiden malleissa
sivun yläreunassa lyhyillä JavaScript-koodauksilla tuotettuja LAYER elementtejä.BODY elementin fontin, tulee määritellä ainakin elementit
TD ja TH (myös muut elementit saattavat tarvita määrittelyjä), koska perityminen ei toimi kunnolla. Koska periytyminen toimii vain osittain joissakin tapauksissa tulee määritellä tarkkoja tunnistettavia hahmoja, esim. p code, blockquote cite {font-size:small} (olen havainnut, että p, blockquote, code, cite {font-size:small} ei antanut toivottua tulosta).8px-16px. Tämän otannan perusteella joka neljäs fonttikoko on oikein (testissä fonttikoot 8px, 12px ja 16px). Seurauksena on myös se. että joka neljäs pikselimääritetty fonttikoko puuttuu kokonaan (testissä fonttikoot 11px ja 15px). Muut arvot ovat pikselin verran liian pieniä.list-style-type systemaattisesti siten, että joka listatasolla on eri listamerkki, sillä Netscape 4.x ei osaa käyttää listakuvia. Listojen kanssa ei toimi juuri mikään CSS. Vain ensimmäisen tason listakohtien väriä voi vaihtaa.float käyttö
(yksinkertaiset määrittelyt toimivat - testaa toimivuutta CSS1 Test Suite avulla).![[S]](../Kuvat/buttons/S.gif)
(sivulle ei ole paluulinkkiä tältä sivulta - käytä vaihtoehtoisia ikkunoita).LI käytä tekstin ympärillä DIV elementtiä. Määritä sitten ominaisuudet elementille DIV tai määritä fonttiin liittyvät ominaisuudet emoelementille (OL tai UL).LI, mutta voit ensin määritellä ne elementeille OL ja UL. Voit sitten ohittaa ne tuontisääntöä käyttäen, jolloin uudemmat selaimet voivat käyttää eri arvoja.margin ja padding ominaisuudet saattavat muuttaa kuvan paikka täysin käsittämättömällä tavallaproperties.SELECT ja OPTION elementeille annetut reunusominaisuudet tuhoavat elementtien toimivuude kokonaan ja selaimet saattavat kaatua.A-elementtiin. Netscape käsittelee <A
name="anchor_name"> ikään kuin näennäisluokkana vaikka sen ei tulisi niin menetellä. Vain attribuutin href (esim. <A href="some.html">) tulisi vasta linkkinäennäisluokkiin. Tälle virheelle voidaan tehdä seuraavia asioita (helpointa olisi määritellö id attribuutti lähimmälle aloitusmerkkaukselle (muulle elementille kuin A); valitettavasti Netscape 4.x -sarjan selaimet eivät ymmärrä attribuuttia id ankkureiden tunnistimine vaan ainostaan CSS ja JavaScript tunnistimina):
A (a {text-decoration:none}), jolloin myös <A href="some.html"> ei saa alleviivausta.<BODY
link=""...>. Kaikki näennäisluokat ovat sitten linkitetty vain muille selaimille.< A
name="anchor_name"></A>. Ongelmana tässä on se, että näin tulisi aina muistaa menetellä! Tosin ilman sisältöä olevat ankkurit eivät toimi joissakin vanhoissa selaimissa.class="name"), jonka määrität siten, että sillä ei ole alleviivausta (text-decoration:none). Myös tällä menettelyllä on sama ongelma kuin edellisellä eli näin tulisi aina muistaa menetellä).
.
Lista CSS1 Test
Suite![[S]](../Kuvat/buttons/S.gif)
esiin tulevista virheistä on hirvittävän pitkä ja sen tulisi olla itse asiassa paljon pidempikin, mutten ollut varma kaikesta, mitä listaan kuuluisi laittaa.
Muista. Netscape 4.x:n CSS-toteutus on monessa suhteessa hyvin huono. Varmasti monessa suhteesa samalla tasolla kuin MS IE 3.02 (merkittävimpänä erona on se, että se tukee useimpia CSSP
(P = position
= asemointi
) piirteitä (CSSP on nykyisin osa CSS2 spesifikaatiota). Dokumenttien perusstruktuurien tulisi perustua HTML 3.2:een. Netscape 4.x:ää pitäisi käsitellä lähinnä HTML 3.2 kykenevänä selaimena, jolle voi antaa hieman CSS:ää.