Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

22mai/0811

Flex Styles: Utilisation des CSS et des sélecteurs (Class / Type)

Vous pouvez utiliser les CSS pour définir des styles pour vos composants. Bien que vous pouviez utiliser les CSS à l'exécution, nous allons voir comment ils sont utilisés à la compilation Flex.CSS est une méthode standard pour appliquer des styles à travers des plate-formes, langages et frameworks. La syntaxe des CSS en Flex est identique à celle utilisée pour le HTML.

Par exemple, voici un sélecteur de classe pour une application Flex, écrit en CSS:

.example {
	color:red;
}

Bien que la syntaxe des CSS dans Flex soit identique à celle utilisée pour le HTML, toutes les propriétés HTML ne sont pas disponibles dans Flex.

Quand vous définissez des CSS pour une application RIA Flex, vous avez deux options de base: feuilles de styles externes ou définitions de style locales. Dans les deux cas, le CSS est compilé dans l'application donc ces options sont fonctionnellement identiques. Cependant, il y a des avantages aux deux méthodes. Les feuilles de style externes (External Stylesheets) vous permettent de faire une meilleure distinction entre la mise en page (layout MXML) et le style (documents CSS externes). De plus, quand utilisez des feuilles CSS externes, vous pouvez définir les styles à un endroit et les utiliser à l'intérieur d'un document MXML sans avoir à les redéfinir. De l'autre côté, les définitions locales sont plus pratiques quand vous voulez utiliser seulement un fichier MXML.

Une feuille CSS externe est un fichier texte que vous compilez dans une application Flex en utilisant l'attribut "source" du tag MXML Style.

La code suivant est un exemple de tag Style qui compile une CSS externe nommée styles.css. Les styles définis dans ce document sont ensuite disponibles dans le document MXML dans lequel le tag Style apparaît.

<mx:Style source="styles.css"/>

Si vous voulez utiliser des définitions locales, vous pouvez simplement placer le code CSS dans la balise Style comme ceci:

<mx:Style>
	.example {
		color:red;
	}
</mx:Style>

Que vous utilisiez des CSS externes ou locales, vous pouvez définir les mêmes sélecteurs de style, de type ou de classe. Les sélecteurs de classe commencent toujours par un point suivi du nom de la classe comme dans l'exemple précédent. L'exemple précédent définit uniquement un style pour un sélecteur. L'exemple suivant en défini deux:

<mx:Style>
	.example {
		color:red;
		font-style: italic;
	}
</mx:Style>

Quand vous voulez appliquer un sélecteur de classe à un composant, vous devez fixer la propriété styleName du composant. La valeur de styleName devra être le nom de la classe en question sans le point. L'exemple suivant fixe la propriété styleName d'un bouton avec la classe de l'exemple précédent:

<mx:Button label="Exemple" styleName="example"/>

Si vous voulez utiliser la propriété styleName d'un composant en utilisant Action Script, utiliser cette syntaxe:

button.styleName="example";

L'autre type de sélecteur est appelé sélecteur de type, est il est automatiquement appliqué à tous les composants du type spécifié par le nom du sélecteur. Par exemple, vous pouvez définir un sélecteur de type appelé Button, et il sera automatiquement appliqué à tous les boutons:

Button {
	color:red;
}

Les sélecteurs de classe sont toujours prioritaires par rapport aux sélecteur de type. L'exemple suivant définit un sélecteur de type (Button) et un sélecteur de classe. Dans ce cas, le texte sera en italique car c'est le sélecteur de type qui le définit comme tel. Cependant, puisque le sélecteur de classe définit la couleur comme vert, le bouton sera vert et non pas rouge:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	>
	<mx:Style>
		Button {
			color: red;
			font-style:italic;
		}
		.example {
			color: green;
		}
	</mx:Style>

	<mx:Button label="Exemple" styleName="example"/>

</mx:Application>

Ni les CSS externes, ni les CSS locales ont une priorité particulière. Si vous utilisez les deux dans un document, vous verrez que l'ordre dans lequel elle apparaissent dans le document détermine lequel prend le dessus. Si on prend par exemple pour illustrer cela, avec une CSS externe styles.css contenant uniquement ce sélecteur de classe:

.example {
	color:red;
	font-style: italic;
}

L'exemple suivant utilise cette feuille CSS externe mais aussi une définition locale du même sélecteur. Dans ce cas, le bouton à un label vert en italique car la définition locale prend le dessus car elle apparaît après l'inclusion de la CSS externe dans le code:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	>
	<mx:Style source="styles.css"/>
	<mx:Style>
		.example {
			color: green;
		}
	</mx:Style>

	<mx:Button label="Exemple" styleName="example"/>

</mx:Application>

Si vous inversez l'ordre des tags Styles, vous verrez que le label du bouton est maintenant rouge.

Propriétés de Style

En Flex, tous les noms de propriétés de style doivent être capables d'être traitées comme variables. C'est pour cette raison qu'il est nécessaire pour tous les noms de propriétés de style de suivre les même règles que pour les variables. Ce qui veut dire qu'elles ne doivent contenir que des caractères alphabétiques ou numériques. Notamment, les variables de peuvent contenir de tiret. Cependant, le CSS traditionnel supporte les propriétés contenant un tiret (font-family par ex.), et pour cette raison, Flex le supporte aussi. En fait, Flex va convertir cette valeur avec tiret en une valeur normée. Par exemple, si vous voulez fixer le nom de la police, vous devez utiliser la propriété de Style font-family ou fontFamily en CSS. Cependant, vous ne pouvez pas pas utiliser de valeur avec des tirets en ActionScript quand vous utlisez setStyle() ou des style inline.

Articles similaires

Commentaires (11) Trackbacks (3)
  1. Salut,

    Est-il possible de récupérer les éléments flex comme en html avec javascript?

    par la class css (avec jquery):
    $(".maClasse"):array

    ou bien par leur nom :
    getElementByTagName('nameElement'):array

    un équivalent as3 pour flex?

  2. Je pense que la solution que tu cherches est :
    StyleManager.getStyleDeclaration(".newSelector");
    Plus d'infos dans cet article:
    http://www.flex-tutorial.fr/2008/05/22/flex-styles-utilisation-du-stylemanager-et-setstyledeclaration/

    Fabien

  3. Merci pour l'information, mais j'ai l'impression que StyleManager.getStyleDeclaration(".newSelector"); ne récupère pas tous les éléments, dans un tableau, qui porte la class ".newSelector" mais elle permet de modifier les styles de se selector ".newSelector". (si j'ai bien compris).

    Je cherche vraiment à faire comme en javascript (si cela est possible), récupérer dans un tableau tous les éléments qui porte cette class ".selector" ou une autre solution équivalente qui me permetré de pouvoir boucler mon tableau et accèder au éléments.

    merci d'avance

  4. Ah ok, tu veux récupérer tous les objets de ton application qui on un styleName="monSelector" et pas le style CSS "monSelector". C'est un peu tordu de passer par un style css pour récupérer des instances d'objet non ? :P
    A mon avis, ce n'est pas aussi simple qu'en jQuery ou il faut parcourir le DOM (et ou les "class" ne servent pas qu'aux styles CSS me semble-t-il).
    A mon avis, tu dois essayer d'enregistrer tes composants autrement, s'ils sont éparpillés dans ton application et que tu as besoin d'accéder aux instances et pas aux styles. La solution sale que j'ai à l'instant et qu'ils envoient un event à la création qui enregistre leur référence quelque part dans l'application. Mais bon …

    Fabien

  5. Hello!

    Cet article est très intéressant. J'allais attaquer la mise en page, et je constate que les choses sont simples.

    À propos des styles, je tiens à signaler l'existence d'un outil intéressant. Il s'agit d'une interface qui permet de tester les paramètres des styles sur divers composants.

    http://examples.adobe.com/flex3/consulting/styleexplorer/Flex3StyleExplorer.html#

    A+

  6. Bonjour,

    il y aurait une documentation (en gros comment styler les composants flex), mis à part le site 'styleexplorer' (à mon gout il manque des infos). parce que j'ai l'impression que c'est le parcour du combattan pour enlever une simple bordure au composant button :) lol.

    Merci d'avance

  7. Salut,
    si tu regardes dans les livedocs, tu as tous les styles associés à un bouton. La plupart des noms sont assez explicites pour savoir directement sur quoi ils agissent. Au pire, tu auras le détail plus bas

    Fabien

  8. Salut,

    merci beaucoup effectivement la doc explique tout, je la lis pas assez souvent. Avant de poster je jetterais un oeil :)

    merci encore

  9. Pas de souci ;)
    On sous-estime souvent les docs car celles des autres produits sont souvent incomplètes alors que les livedocs Adobe sont de très bonne facture je pense

    Fabien

  10. Salut,

    Qu'en est-il des performances entre l'utilisation d'un de sélecteur de type par rapport à un selecteur de classe ?

  11. @loop
    Salut, je ne pense pas qu'il ait une différence. En tout cas, je n'ai jamais entendu parler d'une référence

    Fabien


Leave a comment

(required)