28173 sujets

CSS et mise en forme, CSS3

Bonjour a tous.

Je vais la faire courte. Comme tout le monde ici (je suppose), je suis confronter a quelques soucis d'affichage des elements de mon site en fonction du naviguateur.
En gros Gecko ne rends pas la meme chose que IE.

Alors pour contourner le problème j'ai utiliser une méthode simple, en javascipt, pour que IE utilise une CSS particuliaire. Ca fonctionne très bien, je n'ai plus de soucis, juste que mon bout de script n'est pas valide XHTML selon le validateur du W3C.

Voici le script en question :


<script type="text/javascript">
var navig = navigator.appName;

if (navig == 'Microsoft Internet Explorer')

{
document.write("<link rel='stylesheet' href='css/abc_ie.css' type='text/css' media='all' />");
document.write("<link rel='stylesheet' href='css/abc2_ie.css' type='text/css' media='all' />");
document.write("<link rel='stylesheet' href='css/abc3_ie.css' type='text/css' media='all' />");
document.write("<link rel='stylesheet' href='css/abc4_ie.css' type='text/css' media='all' />");
}

else

{
document.write("<link rel='stylesheet' href='css/abc_autre.css' type='text/css' media='all' />");
document.write("<link rel='stylesheet' href='css/abc2_autre.css' type='text/css' media='all' />");
document.write("<link rel='stylesheet' href='css/abc3_autre.css' type='text/css' media='all' />");
document.write("<link rel='stylesheet' href='css/abc4_autre.css' type='text/css' media='all' />");
}

</script> 


Fonctionnement, j'interroge le client avec "navigator.appName" et si la réponse est 'Microsoft Internet Explorer', javascript écrit a la volée les liens qui pointent sur les CSS pour IE, dans le cas contraire il ecrit les liens qui pointent vers les CSS pour les autres naviguateurs.

Comme je le disais, pas de soucis ca fonctionne avec IE7, Ffox 1.5 et sup ............
Mon seul problème est que ce n'est pas valide.

Est ce que quelqun c'est déjà pencher sur le problème ? Y a t'il eventuellement une autre solution plus perenne a laquelle je n'ai pas songer ?
Ca m'ennui vraiment d'avoir une erreur a chaque ligne du script.

L'erreur est simple, le validateur me reponds :

Line 30 column 113: document type does not allow element "link" here.

...ie.css' type='text/css' media='all' />");

Comme si ma declaration n'étais pas entre les balises <head> mais entre les balises <body>
Modifié par AddiKTiV (17 May 2007 - 13:47)
Modérateur
Salut,

Ce que tu fais là via ton script est à proscrire. Smiley cligne

Microsoft a mis en place un système fiable et recommandé : Les commentaires conditionnels.

Par ailleurs, il convient d'éviter le media all car, là, tu envoies ta feuille de style sur tout type de support... y compris ceux que tu ne contrôles pas.
un media="screen, projection" convient bien (media="screen" pour IE)
Mes escuses, j'ai un peu épurer le code, j'ai virer l'arborescence menant au .css,
remplacer : media='projection, screen, tv' par media='all' ........................ histoire de ne pas alourdir la lecture.

Je vais visiter ton lien de ce pas, merci pour la rapidité de la réponse Smiley cligne
Juste une précision, pour avoir un résultat opérationnel pour moi,

il faut donc que je declare ma CSS pour gecko, et ensuite (en dessous) je declare celle pour IE avec les paramètres conditionnels. C'est bien ca ?

Parceque si je fais l'inverse, les propriétés pour Gecko ecraseront celle pour IE si elles sont lues après .

C'est bien ca ??

<link rel='stylesheet' href='css/abc_autre.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc2_autre.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc3_autre.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc4_autre.css' type='text/css' media='all' />
<!--[if IE]>
<link rel='stylesheet' href='css/abc_ie.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc2_ie.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc3_ie.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc4_ie.css' type='text/css' media='all' />
<![endif]-->
Encore mieux :
<!--[if !IE]><-->
<link rel='stylesheet' href='css/abc_autre.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc2_autre.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc3_autre.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc4_autre.css' type='text/css' media='all' />
<!--><![ endif]-->
<!--[if IE]>
<link rel='stylesheet' href='css/abc_ie.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc2_ie.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc3_ie.css' type='text/css' media='all' />
<link rel='stylesheet' href='css/abc4_ie.css' type='text/css' media='all' />
<![ endif]-->


Sans les espaces entre "[" et "endif".
Modifié par CNeo (17 May 2007 - 13:34)
Modérateur
IE lit les deux feuilles de style alors que les autres ne lisent que celles qui ne se trouvent pas entre commentaires conditionnels donc ici, il vaut mieux déclarer la feuille conditionnelle en aval oui. Smiley ravi

Habituellement, on met les feuilles de style générales pour tout le monde et on complète par quelques ajouts au coup par coup pour IE.

Si vraiment les deux feuilles de style sont complètement différentes, on peut faire comme l'a dit CNeo mais ça n'a rien de mieux non, on augmente la charge de travail. Smiley cligne

Nota : Pour le commentaire conditionnel "négatif", c'est :
		<!--[if !IE]> <!-->
...
		<!--> <![ endif]-->
Et bien NI-KEL !!!!

Merci a vous pour le coup de main, effectivement, le code est plus agréable, il est valide, et fonctionne a la perfection.

J'ai en fait pris la decision de passer par mes CSS normales; puis de lire (au conditionnel) une seule CSS qui elle contiens uniquement les modifs pour IE

Ca me donne cela (c'est pour SPIP, d'ou le code un peu 'particulier')

[(#REM) Feuilles de style CSS pour moteur Gecko ]

<link rel="stylesheet" href="[(#CHEMIN{css/spip_style.css}|direction_css)]" type="text/css)]" media="all" />
<link rel="stylesheet" href="[(#CHEMIN{css/habillage.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
<link rel="stylesheet" href="[(#CHEMIN{css/spangya.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
<link rel="stylesheet" href="[(#CHEMIN{css/teamspeakdisplay.css}|direction_css)]" type="text/css" media="projection, screen, tv" />

[(#REM) Feuilles de style CSS pour Internet Explorer avec appel conditionnel ]

<!--[if IE]>
<link rel="stylesheet" href="[(#CHEMIN{css/debug_ie.css}|direction_css)]" type="text/css" media="projection, screen, tv" />
<![endif]-->


Et le validateur XHTML de w3.org me dit :

This Page Is Valid XHTML 1.0 Transitional!

UN VRAI GRAND MERCI POUR TOUT !!!!