28172 sujets

CSS et mise en forme, CSS3

Bonjour à tous,

Désolé pour ce titre plutôt abscons. Je programme un jeu multijoueur en HTML5+javascript+ARIA, et je suis plutôt nul en CSS. Pas facile d'expliquer son problème sans recourir à des images.

L'application se compose globalement de cinq zones :
- Un historique tout à gauche affichant les messages envoyés par le serveur au fur et à mesure qu'ils arrivent
- Trois zones à droite les unes des autres et à droite de l'historique contenant des boutons permettant d'agir sur le jeu, organisés par groupes: les actions directes du jeu lui-même, les options permettant de gérer la partie, et les options globales du genre rejoindre/inviter/quitter.
- En-dessous des quatre zones, une cinquième permettant de chatter

L'idée étant que les quatre premières zones soient côte à côte et de taille fixe mais de la bonne hauteur de sorte qu'il n'y ait ni place perdue, ni qu'il soit jamais nécessaire d'utiliser la barre de défilement générale de la page. IL ne devrait normalement non plus pas y avoir besoin de défiler la page pour aller chatter dans la zone en-dessous. D'où la restriction que je m'impose, ne pas utiliser de px ou autres unités absolues pour que tout puisse s'adapter automatiquement sans que je n'aie rien à faire.

Je voudrais en particulier que l'historique, première zone à gauche, possède une barre de défilement spécifique et défile automatiquement vers les derniers messages au fur et à mesure qu'ils arrivent, et qu'aucun message ne passe jamais hors écran. De même dans les trois autres zones, s'il y a trop de boutons, une barre de défilement spécifique à la zone apparaîtrait.

Ce qui a été constaté avec mon code actuel, c'est que :
1 - La barre de défilement spécifique à l'historique apparaît bien, mais elle n'est jamais utilisée par le navigateur, elle reste toujours grisée, et la zone s'agrandit à chaque fois qu'un message arrive sans limite de hauteur, forçAnt au bout d'un moment à sans cesse utiliser la barre de défilement générale de la page (ce qui est bien sûr plutôt gênant). Comment y remédier ? Comme déjà dit, je voudrais que la taille de la zone reste fixe et que les messages qui arrivent par le bas poussent les anciens vers le haut en affichant une barre de défilement qui serait toujours tout en bas par défaut.
2 - Lorsque les intitulés des boutons sont trop longs, les div de droite sont temporairement poussées en-dessous de l'historique, et reprennent leur place lorsque les boutons fautifs disparaîssent. Ce va-et-vient est relativement perturbant... comment l'empêcher?

Bonus n°1: Une ligne bleue de focus apparaît lorsque l'élément #keytrap a le focus, peut-on la faire disparaître ? Cet élément est néecessaire et sert à attraper toutes les touches utilisées dans le jeu (pour éviter que les touches exécutent les actions du navigateur). Ceci a été observé sur IE 8, 9 et 10.

Bonus n°2: Pourrais-je faire en sorte que la zone de chat soit alignée avec la seconde zone et non pas avec la première ? autrement dit, faire en sorte que l'historique prenne toute la hauteur sur la gauche, ou encore dit autrement que le clear:left ne s'applique que sur les trois derniers float:left mais pas le premier ? Cette mise en forme est probablement plus logique, plus intuitive, et elle aurait le mérite de plus se conformer à l'agencement du logiciel client en version bureau windows.

Bonus n°3: puis-je faire en sorte que sur téléphone où il n'y a probablement pas la place pour afficher les quatre zones côte à côte, qu'elles soient affichées deux par deux, sans changer le code HTML ?

Merci beaucoup pour vos réponses.

Voici le code actuel ci-dessous.

CSS :

#gamelog, #menuArea, #gameArea  {
height: 88%;
overflow-y: scroll;
float: left;
}

#gamelog { width: 36%; }
#menuArea { width: 29%; }
#gameArea, #tableArea  { width: 17%; }
#chatArea { clear: left; }
 
.hidden { text-indent: -1000000px; }


HTML:

<h1>Client web</h1>
<div id="app" role="application">
<h2 id="historyH2" class="hidden">Historique</h2>
<div id="gamelog" contenteditable="true" tabindex="0" aria-labelledby="historyH2" aria-readonly="true"></div>
<h2 id="menuH2" class="hidden">Menu</h2>
<div id="keytrap" class="hidden" aria-labelledby="menuH2"></div>
<div id="menuArea"></div>
<h2 id="gameH2" class="hidden">Actions</h2>
<div id="gameArea"></div>
<h2 id="tableH2" class="hidden">Table</h2>
<div id="tableArea"></div>
<h2 class="hidden">Chat</h2>
<form id="chatArea" data-check="disable">
<p><label id="chatlbl" for="chat">Chat: </label>
<input type="text" id="chatBox" aria-labelledby="chatlbl" />
<button type="submit">Envoyer</button>
<span id="volsliderlbl">Volume: </span>
<span id="volslider" role="slider" tabindex="0" aria-labelledby="volsliderlbl" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100">100%</span>
</p></form>
</div><!--app-->


Du texte est ajouté à l'historique sur le modèle
<span class="colorX">XXX</span><br />

Des boutons apparaissent et disparaissent dynamiquement dans les trois autres zones sur le modèle :
<button type="button">XXX</button> + éventuellement. <br />
ou bien dans un tableau <table> sans cellule vide de max. 10x10.

A noter qu'il y a un header avec un menu général au site en-dessus de l'application, et un footer contenant un lien contact + mention copyright en-dessous. Je n'ai pas mis le code parce que je suppose qu'il n'est pas nécessaire.

Merci.
Pas encore de réponse... personne n'a d'idée, ou tout le monde est parti en vacances ???

- Est-ce que je m'exprime mal ?
- Est-ce que j'en demande trop ?
- Est-ce que ce que je demande est impossible ? Faites-le moi savoir, je ne peux pas deviner.
- Est-ce que je ne suis pas assez clair dans mes explications ?

N'hésitez pas à me demander des précisions si vous na'vez pas assez d'informations pour m'aider convenablement. J'ignore si j'aurais pu oublier quelque chose de primordial ?

J'ai peut-être oublié de préciser les navigateurs cibles: dans la mesure du possible tous ou en tout cas les principaux (IE, firefox, safari et chrome), mais je me fiche totalement de IE6 et IE7 (de toute façon le jeu est en HTML5 et ne fonctionne pas sous IE6 et IE7).

Merci.
C'est un gros pavé qui donne pas du tout envie de lire, faut y aller par étape, ce qui t'embête le plus.

Ensuite on y va creshendo, la avec tous ce que tu demandes on sait pas vraiment par ou commencer. Fait un jsFiddle ça nous aidera à pouvoir te répondre rapidement & efficacement.
a écrit :
C'est un gros pavé qui donne pas du tout envie de lire, faut y aller par étape, ce qui t'embête le plus.

C'était clair dans ma tête mais peut-être pas dans les vôtres, désolé. J'ai deux questions principales et des questions bonus. Par bonus, je sous-entends que vous pouvez répondre si vous savez et si vous en avez envie, mais que si vous ne répondez pas ce n'est pas grave du moment que j'avance sur mon problème principal.

a écrit :
Ensuite on y va creshendo, la avec tous ce que tu demandes on sait pas vraiment par ou commencer.

Dans l'ordre ! Les deux questions principales d'abord, puis les bonus si vous vous sentez d'attaque, sans aucune obligation.

a écrit :
Fait un jsFiddle ça nous aidera à pouvoir te répondre rapidement & efficacement.

J'ai pas trop compris comment on utilise ce site et à quoi il sert. De toute manière mon problème n'est pas en javascript, mais en CSS.

Entre temps, j'ai essayé de changer complètement de stratégie, mais ça ne fonctionne pas non plus. Avec la variante ci-dessous, je n'ai même plus de barre de défilement grisée. J'ai aussi essayé de remplacer la hauteur de 91% par une valeur en pixels volontairement exagérée (800px), mais ça ne marche pas plus !
Par contre pour tout le reste, cette version paraît graphiquement plus réussie que l'autre.

HTML :

<h1>Client web</h1>
<div id="app" role="application">
<div id="apptable">
<h2 id="historyH2" class="hidden">Historique</h2>
<div id="gamelog" contenteditable="true" tabindex="0" aria-labelledby="historyH2" aria readonly="true"></div>
<h2 id="menuH2" class="hidden">Menu</h2>
<div id="keytrap" class="hidden" aria-labelledby="menuH2"></div>
<div id="menuArea"></div>
<h2 id="gameH2" class="hidden">Actions</h2>
<div id="gameArea"></div>
<h2 id="tableH2" class="hidden">Table</h2>
<div id="tableArea"></div>
</div><!--apptable-->
<h2 class="hidden">Chat</h2>
<form id="chatArea" data-check="disable">
<p><label id="chatlbl" for="chat">Chat: </label>
<input type="text" id="chatBox" aria-labelledby="chatlbl" />
<button type="submit">Envoyer</button>
<span id="volsliderlbl">Volume: </span>
<span id="volslider" role="slider" tabindex="0" aria-labelledby="volsliderlbl" aria-valuemin="0" aria-valuemax="100" aria-valuenow="100">100%</span>
</p></form>
</div><!--app-->


CSS :

#app {
/* Le but de ce code qui ne fait en gros rien est de faire en sorte que le positionnement de la zone chat en bas de la zone de l'application fonctionne; ça ça marche correctement.  */
position: relative;
top: 0px; left: 0px;
height: 100%;  
}
#apptable { display: table; }
#gamelog, #menuArea, #gameArea  {
display: table-cell;
height: 91%; /* ON dirait qu'il ne prend pas en compte cette hauteur, la zone s'étend à mesure que le texte arrive du serveur  */
overflow-x: hidden;
overflow-y: scroll; /* La barre de défilement n'est pas présente malgré ça ! */
}
#gamelog { width: 36%; }
#menuArea { width: 29%; }
#gameArea, #tableArea  { width: 17%; }
#chatArea {
/* La zone chat est positionnée tout en bas relativement à l'application; ça, ça fonctionne.  */
position: absolute;
width: 100%;
height: 1.5em; /* Espace à peu près suffisant pour une ligne de texte */
bottom: 0px;
}


Merci pour votre aide.
Voici le jsFiddle avec l'html et le CSS que tu as mis dans le sujet,
JSfiddle permet de montrer ce qui nous chagrine en JS / CSS / HTML, pas forcément que du JS, c'est bien pratique pour exposer un soucis rencontré avec du code qu'on puisse débuguer.

Question bête, tu pourrais faire une image grossière pour montrer ce que tu veux ?


http://jsfiddle.net/kh2v6/
Salut,

J'avoue que deux images (même grossiere) de "ce que je veux" et "ce que j'ai" pourrait facilité la compréhension du future résultat voulue.
Eh non, c'est bien là une de mes particularités, je ne peux pas vous montrer une image. JE suis déficient visuel... c'est pour cette raison que j'essaie de décrire au mieux ce que je voudrais.

Donc en ce qui concerne le graphisme, je me base essentiellement sur mon instinct et ce qu'on me dit. Mon site est donc basiquement moche, je fais juste en sorte qu'il soit au moins utilisable à peu près correctement sans trop de gêne.

A l'origine du problème, en fait, c'est la non-lecture de voice over, la synthèse vocale de mac. La zone des messages a comme instruction d'être lue dès que du nouveau arrive grâce à ARIA (live region). Elle l'est au début, mais après un certain temps elle ne l'est plus, et il s'avère que c'est très probablement parce que le texte ajjouté passe en-dehors de l'écran à cause de mon code CSS. La philosophie de voice over se veut d'être très proche du rendu visuel, à l'écran = je lis, hors écran = je lis pas, ce qui est cohérent mais parfois gênant.

Bon, et c'est quand même bien si tout le monde peut utiliser le chat sans avoir à scroller sans arrêt.