xulfr.org

3.2 Positionnement d'éléments de fenêtres

Écrit par Neil Deakin. Traduit par Jean Pascal Milcent (25/02/2004).
Page originale : http://www.xulplanet.com/tutorials/xultu/boxstyle.html xulplanet.com

Ici nous apprendrons à controler la position et la taille d'un élément.

Positionnement des éléments de boîte

Jusqu'ici, nous avons appris à placer des éléments horizontalement ou verticalement à l'intérieur d'une boîte. Nous aurons souvent besoin de plus de contrôle sur la position et la taille des éléments à l'intérieur d'une boîte. Pour cela, nous devons d'abord comprendre le fonctionnement d'une boîte.

La position d'un élément est déterminée par le style de disposition de son conteneur. Par exemple, la position d'un bouton dans une boîte horizontale est à droite du bouton précédent, s'il y en a plusieurs. La taille d'un élément est déterminée par deux facteurs, la taille que cet élément cherche à posséder et la taille que vous avez spécifié. La taille qu'un élément cherche à avoir est déterminé par ce qu'il contient. Par exemple, la largeur d'un bouton est déterminée par la quantité de texte à l'intérieur du bouton.

Un élément sera généralement juste assez large pour les besoins de l'affichage de son contenu, et pas plus large. Quelques éléments, tels que les boîtes de textes ont une taille par défaut, qui sera utilisée. Une boîte aura une largeur nécessaire à l'affichage des éléments qu'elle contient. Une boîte horizontale contenant trois boutons aura la largeur de ces trois boutons plus la marge.

Dans l'image ci-dessous, les deux premiers boutons ont la taille nécessaire à l'affichage de leur texte. Le troisième bouton est plus large parce que son contenu est plus grand. La largeur de la boîte contenant les boutons correspond au total des largeurs de ces boutons plus la marge entre eux. La hauteur des boutons est une taille adaptée à l'affichage du texte.

Images de la fenêtre produite par l'exemple 3.2.2.

Vous pourriez avoir besoin de plus de contrôle sur la taille d'un élément dans une fenêtre. Il y a plusieurs dispositifs qui vous permettent de contrôler la taille d'un élément. La façon la plus rapide est d'ajouter simplement des attributs width et height sur un élément, un peu comme vous feriez avec la balise HTML img. Voir l'exemple ci-dessous :

Exemple 3.2.1 : Source Voir

<button label="OK" width="100" height="40"/>

Cependant, ce n'est pas recommandé de faire comme ça. Ce n'est pas vraiment portable et peut ne pas être adaptable avec certains thèmes. Une meilleure solution est d'utiliser des propriétés de style, dont le fonctionnement est similaire aux feuilles de style du HTML. Les propriétés CSS suivantes peuvent être utilisées.

width
Ceci indique la largeur d'un élément.
height
Ceci indique la hauteur d'un élément.

En plaçant l'une ou l'autre de ces deux propriétés, l'élément sera créé avec cette largeur et cette hauteur. Si vous spécifiez seulement une de ces deux propriétés, l'autre est calculée en fonction de ses propres besoins. La taille de ces propriétés de style doivent être définie par un nombre suivi d'une unité de mesure.

Les tailles sont assez faciles à calculer pour les éléments non flexibles. Ils répondent simplement à leur spécificité de largeur et de hauteur, et si la taille n'est pas définie, la taille par défaut de l'élément est juste assez large pour s'adapter au contenu. Pour les éléments flexibles, le calcul est légèrement plus rusé.

Les éléments flexibles sont ceux qui ont un attribut flex dont la valeur est supérieure à 0. Rappelez vous que les éléments flexible s'étirent et s'élargissent jusqu'à remplacer l'espace vide. Leur taille par défaut reste calculée de la même façon que les éléments inflexibles. L'exemple suivant démontre cela :

Exemple 3.2.2 : Source Voir

<window orient="horizontal"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<box>
<button label="Oui" flex="1"/>
<button label="Non"/>
<button label="Je ne connais pas vraiment cette manière ou l'autre"/>
</box>

La fenêtre apparaîtra initialement comme dans la capture précédente. Les deux premiers boutons seront dimensionnés à une largeur par défaut convenable et le troisième bouton sera plus large parce que son label est plus long. Le premier bouton est flexible et les trois éléments ont été placés à l'intérieur d'une boîte. La largeur de la boîte correspondra à la largeur totale des trois boutons (environs 515 pixels dans l'image).

Si vous augmentez la largeur de la fenêtre, des éléments sont vérifiés pour voir s'ils sont flexibles afin de remplir l'espace vide qui devrait apparaitre. Le bouton est le seul élément flexible, mais il ne s'élargira pas plus. C'est parce que la boîte qui contient le bouton n'est pas flexible. Un élément inflexible ne change jamais de taille même lorsque de l'espace est disponible, c'est pourquoi le bouton ne peut pas se développer non plus. Ainsi, le bouton ne pourra pas s'élargir.

La solution est de rendre la boîte flexible également. De cette façon, quand vous élargirez la fenêtre l'espace supplémentaire sera disponible, alors la boîte s'élargira pour remplir l'espace supplémentaire. Puisque la boîte est plus grande, une plus grande quantité d'espace supplémentaire est créée à l'intérieur d'elle-même, et le bouton flexible qu'elle contient s'élargira pour occuper l'espace disponible. Ce processus est répété pour toutes les boîtes présentes autant de fois que nécessaire.

Réglage des tailles minimum et maximum

Vous pouvez vouloir autoriser un élément à être flexible tout en contraignant sa taille de sorte qu'elle ne puisse pas être plus grande qu'une certaine valeur. Ou, vous voulez peut-être définir une taille minimum. Vous pouvez régler ceci en employant quatre attributs :

minwidth
Ceci indique la largeur minimum que l'élément peut posséder.
minheight
Ceci indique la hauteur minimum que l'élément peut posséder.
maxwidth
Ceci indique la largeur maximum que l'élément peut posséder.
maxheight
Ceci indique la hauteur maximum que l'élément peut posséder.

Les valeurs sont toujours mesurées en pixels. Vous pouvez également employer les propriétés CSS correspondantes, min-width, min-height, max-width et max-height.

Ces propriétés sont seulement utiles pour les éléments flexibles. En plaçant une hauteur maximum, par exemple, un bouton extensible s'étirera seulement jusqu'à une certaine hauteur maximum. Vous pourrez toujours agrandir la fenêtre au delà de ce point mais la taille du bouton cessera de s'accroître. La boîte, dans laquelle le bouton se trouve, continuera également à se développer, à moins que vous placiez aussi une hauteur maximum sur la boîte.

Si deux boutons sont également flexibles, normalement ils se partageront tous les deux la quantité d'espace supplémentaire. Si un bouton a une largeur maximum, le second devrait continuer à se développer et à prendre tout l'espace restant.

Si une boîte a une largeur ou une hauteur maximum, les enfants ne peuvent pas se développer au delà de cette taille maximum. Si une boîte a une largeur ou une taille minimum, les enfants ne peuvent pas rétrécir au delà de cette taille minimum. Voici quelques exemples de réglage des largeurs et des hauteurs :

<button label="1" style="width: 100px;"/>
<button label="2" style="width: 100em; height: 10px;"/>
<button label="3" flex="1" style="min-width: 50px;"/>
<button label="4" flex="1" style="min-height: 2ex; max-height: 100px"/>
<textbox flex="1" style="max-width: 10em;"/>
<description style="max-width: 50px">Ceci est quelques peu ennuyant mais c'est un texte s'étalant simplement.</description>

Exemple 1 : le premier bouton sera affiché avec une largeur de 100 pixels (le px signifie pixels). Vous devez ajouter l'unité ou la largeur définie sera ignorée.

Exemple 2 : le deuxième bouton sera montré avec une hauteur de dix pixels et une largeur de 100 em (un em correspond à la taille d'un caractère dans la police courante).

Exemple 3 : le troisième bouton est flexible ainsi il se développera en se basant sur la taille de la boîte qui le contient. Cependant, le bouton ne rétrécira jamais au-dessous de 50 pixels. D'autres composants flexibles tels que des spacers (espaces) absorberont l'espace restant, brisant ainsi le rapport de flexibilité.

Exemple 4 : le quatrième bouton est flexible et n'aura jamais une hauteur inférieure à 2 ex (un ex correspond habituellement la taille de la lettre X dans la police courante) ou une largeur supérieure à 100 pixels.

Exemple 5 : le champ de saisie de texte est flexible mais sa largeur ne sera jamais supérieure à 10 em. Vous voudrez souvent employer les ems quand vous précisez les tailles des champs de saisie de texte en fonction du texte qu'ils contiennent. Cette unité est utile pour des champs de saisie de texte de sorte que la police puisse changer et les champs de saisie de texte aient toujours une taille appropriée, même si la police est très grande.

Exemple 6 : l'élément description est contraint à avoir une largeur maximum de 50 pixels. Le texte à l'intérieur s'étalera sur la ligne suivante, après cinquante pixels.

Ajoutons quelques uns de ces styles à notre exemple de fenêtre de recherche de fichiers. Nous le ferons de tel manière que le champ de saisie de texte s'étire afin de remplir entièrement la fenêtre.

Source Voir

<textbox id="find-text" flex="1" style="min-width: 15em;"/>

Ici, le champ de saisie de texte a été rendue flexible. De cette façon, il s'étirera si l'utilisateur change la taille de la fenêtre. C'est utile si l'utilisateur veut saisir une longue chaîne de caractères. En outre, une largeur minimum de 15 em a été définie de sorte que le champ de saisie de texte affiche toujours au moins 15 caractères. Si l'utilisateur redimensionne la fenêtre en diminuant sa taille, le champ de saisie de texte ne se rétrécira pas au-dessous de 15 em. Il sera dessiné comme s'il se prolongait au-delà du bord de la fenêtre. Notez dans l'image ci-dessous que le champ de saisie de texte s'est étiré de façon à occuper entièrement la largeur de la fenêtre.

Images de la fenêtre produite par notre exemple de fenêtre de recherche de fichiers

Empaquetage de boîte

Nous avons une boîte avec deux éléments enfants, qui ne sont pas flexibles, mais la boîte, elle, est flexible. Par exemple :

Exemple 3.2.3 : Source Voir

<box flex="1">
<button label="Heureux"/>
<button label="Triste"/>
</box>

Si vous redimensionnez la fenêtre, la boîte s'étirera pour s'ajuster à la taille de la fenêtre. Les boutons ne sont pas flexibles, ainsi leur largeur ne changera pas. Le résultat est un espace supplémentaire qui apparait sur le côté droit de la fenêtre, à l'intérieur de la boîte. Cependant, vous pouvez désirer que l'espace supplémentaire apparaisse plutôt sur le côté gauche, pendant que les boutons restent alignés sur la droite de la fenêtre.

Vous pouvez accomplir cela en plaçant un spacer (espace) à l'intérieur de la boîte, mais cela peut rendre le code confus quand vous avez à faire cela plusieurs fois. Une meilleure solution est d'utiliser l'attribut supplémentaire pack sur la boîte. Cette attribut indique comment empaqueter les éléments enfants à l'intérieur d'une boîte. Pour des boîtes orientées horizontalement, il contrôle le positionnement horizontal des enfants. Pour les boîtes orientées verticalement, il contrôle le positionnement vertical des enfants. Vous pouvez utilisez les valeurs suivantes :

start
Ceci positionne les éléments sur le bord gauche pour les boîtes horizontales et sur le bord haut pour les boîtes verticales. Ceci est la valeur par défaut.
center
Ceci centre les éléments enfants dans la boîte.
end
Ceci positionne les éléments sur le bord droit pour les boîtes horizontales et sur le bord bas pour les boîtes verticales.

L'attribut pack s'applique à la boîte contenant les éléments à empaqueter et non aux éléments eux-mêmes.

Nous pouvons modifier l'exemple précédent pour centrer les éléments de cette façon :

Exemple 3.2.4 : Source Voir

<box flex="1" pack="center">
<button label="Heureux"/>
<button label="Triste"/>
</box>

Maintenant, quand la fenêtre est redimensionnée, les boutons sont centrés horizontalement. Comparez ce comportement à celui de l'exemple précédent.

Alignement de boîte

Si vous redimenssionnez horizontalement la fenêtre dans l'exemple "Heureux-Triste", la boîte devrait s'élargir. Si vous redimensionnez verticalement la fenêtre, vous noterez que les boutons sont étirés. Ceci est dû à la flexibilité qui est affectée par défaut à l'autre direction.

Vous pouvez contrôler ce comportement avec l'attribut align. Pour les boîtes horizontales, cela contrôle le positionnement vertical des enfants. Pour les boîtes verticales, cela contrôle le positionnement horizontal des enfants. Les valeurs possibles sont similaires à celles de l'attibut pack.

start
Ceci aligne les éléments le long du bord haut pour les boîtes horizontales et le long du bord gauche pour les boîtes verticales.
center
Ceci centre les éléments enfants dans la boîte.
end
Ceci aligne les éléments le long du bord bas pour les boîtes horizontales et le long du bord droit pour les boîtes verticales.
baseline
Ceci aligne les éléments et le texte. Ceci est utilisable seulement avec des boîtes horizontales.
stretch
Cette valeur, par défaut, provoque l'agrandissement de l'élément proportionellement à la taille de la boîte, un peu à la façon d'un élément flexible, mais dans la direction opposée.

Comme avec l'attribut pack, l'attribut align s'applique à la boîte contenant les éléments à aligner et non aux éléments eux-mêmes.

Dans l'exemple ci-dessous, la première boîte aura ses enfants étirés, car c'est le comportement par défaut. La seconde boîte a un attribut align, c'est pourquoi ses enfants sont placés au centre.

Exemple 3.2.5 : Source Voir

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<window id="yesno" title="Question" orient="horizontal"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">

<hbox>
<button label="Oui"/>
<button label="Non"/>

</hbox>
<hbox align="center">
<button label="Peut-être"/>
<button label="Il se peut"/>
</hbox>

</window>

Images de la fenêtre produite par notre exemple 3.2.5

Vous pouvez aussi utilisez les propriétés de style -moz-box-pack et -moz-box-align à la place des attributs indiqués.

Vous pouvez trouver l'exemple d'alignement de boîte pratique pour tester les différentes propriétés de boîte (NdT : vous avez aussi une autre démo du même genre sur xulfr).

Coupure du texte et des boutons

Vous pourriez potentiellement créer un élément bouton qui contient un label plus large que la largeur maximum du bouton. Bien sûr, une solution serait d'augmenter la taille du bouton. Cependant, les boutons (et les autres éléments avec un label) ont un attribut spécial appelé crop qui vous permez d'indiquer de quelle manière le texte doit être coupé s'il est trop grand.

Si le texte est coupé, une ellipse (...) apparaît sur le bouton où le texte a été enlevé. Quatre valeurs possibles sont valides :

left
Le texte est coupé sur son côté gauche.
right
Le texte est coupé sur son côté droit.
center
Le texte est coupé des deux côtés.
none
Le texte n'est pas coupé. C'est la valeur par défaut.

Cet attribut est vraiment utile quand une boîte de dialogue a été conçu pour être utilisable à n'importe quelle taille. L'attribut crop peut aussi être utilisé avec l'élément description et les autres éléments qui utilisent un attribut label en tant que label. L'exemple suivant montre l'utilisation de cet attribut :

Exemple 3.2.6 : Source Voir

<button label="Pressez moi, s'il vous plait !" crop="right" flex="1"/>

Images de la fenêtre produite par notre exemple 3.2.6 Notez comment le texte sur le bouton a eu son côté droit coupé après que la fenêtre ait été réduite.


Dans la prochaine section, nous allons réalisé un petit résumé et décrire quelques détails supplémentaires sur le modèle de boîte.