Babylon Design

par Samuel Le Morvan

Chez vous aussi, utilisez un Web de qualité

Tutoriels HTML/CSS

Revigorez vos travaux d’intégration en suivant les préconisations des instances mondiales de l’Internet !

Tutoriels HTML/CSS

La règle @import, une bonne pratique

Cet article a pour but de présenter la règle CSS @import et également de présenter, grâce à celle-ci, une bonne pratique d’organisation de vos feuilles de styles.

Importer une feuille de styles

La règle CSS @import a pour fonction d’importer des feuilles de style depuis d’autres feuilles de styles. La spécification du W3C indique que toutes les règles @import doivent précéder toutes autres règles (excepté la règle de @charset, si elle est présente).

Cette règle doit avoir comme valeur une URL, spécificié par la syntaxe url("") ou entourée de guillemets. Cependant, même si ces deux façons de spécifier l’URL fonctionne, utilisez la syntaxe url("") car celle-ci est l’originale.

Ainsi, pour importer une feuille de styles depuis un autre, il suffit d’écrire dans votre CSS :

 @import "mystyle.css"; 

ou :

@import url("mystyle.css");

En outre, les navigateurs dinosaures tel que Netscape 4 ne gèrent pas l’@import. Mais en considérant le niveau de mal-compréhension des CSS de ces navigateurs, il est préférable qu’ils n’affichent aucune CSS au bénéfice d’une lecture correcte à l’écran.

Vous pouvez consulter les spécifications de la règle @import du W3C.

Importer une feuille de styles par média

Vous pouvez également indiquer pour quel type de média vous souhaitez importer une CSS, il suffit de l’indiquer après l’URL. Si vous souhaitez l’importer pour plusieurs médias, écrivez tous les médias en les séparants par une virgule.

 @import url("paper.css") print; @import url("screen.css") projection, tv;

Si aucun média n’est spécifié, la feuille de style sera importée pour tous les médias.

Attention ! Importer une feuille de styles pour des médias spécifiques via la règle @import n’est pas recommandé. En effet, Internet Explorer (même la version 7) ne sait pas gérer les médias via cette règle. Vous pouvez faire le test de comptabilité par la règle @import.

Se servir de la règle @import, une bonne pratique

Tout d’abord, séparer les feuilles de styles pour bien dissocier les éléments relève selon moi de la bonne pratique (même si je ne le fais pas moi-même à chaque intégration de site…). En effet, cette pratique permet à une personne reprennant votre CSS de cerner beaucoup plus rapidement votre code. Personnellement, j’ai déjà récupéré des CSS de 4000 lignes et ça fait peur ! Même si c’est parfois bien commenté, scroller en permanence est vraiment déroutant ! On peut séparer ses feuilles de styles comme on le souhaite (ex: design global, formulaires, etc.), l’important c’est que ce ne soit pas limpide que pour vous…

C’est là où la règle @import peut se révéler extrêmement utile. Classiquement, beaucoup de personnes ont le réflexe de lier toutes leurs feuilles de styles via la balise <link />. Ce qui schématiquement, donne ceci :

Chaque page HTML est lié à chaque CSS

Ceci ne pose pas de réels problèmes lors d’une évolution de contenu par la création de nouvelles pages HTML car bien souvent on utilise des gabarits. Il suffit de lier à nouveau les N feuilles de styles depuis la nouvelle page HTML. Schéma :

On doit relier les N CSS à la nouvelle page HTML

Le problème se pose lorsque l’on désire rajouter un pan de CSS bien distinct via une nouvelle feuille. On doit alors repasser sur toutes les pages HTML pour ajouter une balise <link />. Ce qui peut devenir vite laborieux ! Alors, dans un souci de création de code à l’arrache bien sale, on place du code CSS dans une feuille qui n’a pas été catégorisée pour le recevoir. Schéma :

Chaque page HTML doit être retravaillée

C’est là que la règle @import peut nous permettre de faire du code CSS propre dans un souci d’évolution facile.

Grâce à la règle @import, vous pouvez centraliser l’appel aux feuilles de styles dans un seul fichier CSS. Faîtes en sorte que toutes vos pages HTML soit liés à une seule feuille de styles qui gèrera seule l’appel aux autres CSS. Ainsi sans modifier vos pages HTML vous pouvez désactiver, supprimer ou ajouter autant de feuilles de styles que vous le souhaitez. Pour moi, il est clair que ce mode de fonctionnement vous apportera sans aucun doute une flexibilité très productive.

La CSS générale centralise les autres CSS

En conclusion

L’utilisation la règle @import étant limitée pour cause de compatibilités navigateurs, il est obligatoire de lier des feuilles de CSS via la balise <link /> pour chaque type de média.

Ceci étant, pour chaque média vous pouvez centraliser vos feuilles de styles en utilisant sans modération la règle @import.

[html] <link rel="styslesheet" type="text/css" href="style1.css" /> <link rel="styslesheet" type="text/css" href="style2.css" media="print" /> <link rel="styslesheet" type="text/css" href="style3.css" media="tv" /> <!-- etc. -->

Schéma de centralisation de feuilles de styles via la règle @import


Ce que nos lecteurs en disent :

  1. Rémi

    Intéressant, mais je préfère passer par un script qui charge les bonnes css en fonction des navigateurs (je détèste les hacks).

    Avec une méthode des hacks je serais obligé de dupliquer chaque css pour chaque navigateur ca deviendrait vite ingérable :s

  2. hapax

    Je suis moi aussi fan des @import.
    Je suis en train de travailler sur un CMS qui gère un site portail + une 15aine de minisite qui ont tous une charte graphique commune avec uniquement quelques éléments de couleurs spécifiques.

    J’ai un template 3 colonnes et un template 2 colonnes. Le @import m’a été très utile.

    Une feuille CSS globale qui gère les éléments communs à tous les sites.
    Une feuille avec un @import qui gère les spécificités du template 3 colonnes
    Une dernière avec un @import qui gère les spécifité du template 2 colonnes.

    Et comme tu le dis si bien au lieu d’avoir une feuille CSS de 30 km de long appelée 50 fois. J’en ai 3 courtes avec un seul appel dans mes pages.

    Comme dirait une grande philosophe du XXIeme siècle : "Le @import c’est de la boullette".

  3. Sébastien

    Très bon article, mais tu ne parles des limittes de la technique. On est limitté en nombre d’import par CSS, et en profondeur.
    Je crois que la limitte c’est 8 imports et 8 niveau
    @import "mystyle0.css";
    @import "mystyle1.css";
    @import "mystyle2.css";
    @import "mystyle3.css";
    @import "mystyle4.css";
    @import "mystyle5.css";
    @import "mystyle6.css";
    @import "mystyle7.css";
    @import "mystyle8.css"; /* 8 ne sera pas chargé */

    &

    @import "mystyle0.css"; > @import "mystyle1.css"; > @import "mystyle2.css"; > @import "mystyle3.css"; > @import "mystyle4.css"; > @import "mystyle5.css"; > @import "mystyle6.css"; > @import "mystyle7.css"; > @import "mystyle8.css"; /* 8 ne sera pas chargé */

  4. Sébastien

    Bon j’ai vérifié en fait c’est seulement 4 niveau imbriqués, et juste pour IE6 et 7.

    Testcase : aenonfiredesign.com/sandb…

  5. Thibaut

    Personnellement je ne connaissais pas du tout cette règle import qui est certe pratique mais pour beaucoup de personne inutile.

    Ceux qui programme en PHP préféront passer par un include(style.php) avec le fichier style.php contenant l’ensemble des feuilles a inclure par exemple.
    Et pour ceux n’utilisant pas PHP on peut faire de même avec un petit JAVASCRIPT.

    Mais il est vrai que tout le monde n’utilise pas JAVASCRIPT et/ou PHP donc c’est une bonne chose

    Merci bien

  6. mattew

    Bonjour,

    je suis tombé par hazard sur ton article en cherchant des infos sur @import. Dans un premier temps il m’a été utile car je cherchais pourquoi IE ne prennait pas en compte ma syntaxe @import url() media;

    Donc merci :)

    Mais dans un deuxième temps je souhaite mettre en garde contre l’utilisation des @import en matière de performances. En effet, il semblerait que le navigateurs charge les CSS avant le HTML et ne charge rien du HTML pendant ce laps de temps. En utilisant des @import en cascade, vous bloquez vraiment tout pendant le chargement des CSS qui se chargent "dans un même flux", à l’inverse de plusieurs balises link qui permettront aux différents CSS de se charger parallèlement. Pour plus de détail, je vous invite à consulter ce très bon article où des test concrets ont été effectués sur cette méthode. L’auteur déconseille donc les @import.
    performance.survol.fr/200…
    Personnellement, j’ai simplement utilisé @import pour importer le style.css dans mon print.css afin de ne pas avoir à dédoubler toutes mes balises link en screen ET en print. A savoir que je suis sur le développement d’une application intranet.

    • Shemu

      Je te confirme le problème de performance dont je n’avais pas conscience lors de l’écriture de cet article. Merci pour ton retour !

Les commentaires sont clos.