1485 sujets

Web Mobile et responsive web design

Bonjour à tous,

cherchant toujours à améliorer mon site pour les terminaux mobiles et les petites résolutions d'écran, j'ai besoin d'aide pour discipliner mes infobulles...
J'ai recours à ces infobulles pour définir des termes complexes. Auparavant, j'utilisais une div sur le bord droit de l'écran pour afficher les définitions, mais c'est peu pratique pour les petites résolutions.
J'ai réussi à mettre au point des infobulles fonctionnelles (sans avoir recours à la fonction <title> qui ne correspondait pas à mes besoins). Cependant, elles sont décalées sur la droite à l'affichage et elles sortent de l'écran sur les petites résolutions. Comment les ramener dans le droit chemin et les empêcher de sortir de la div où se trouve le texte? Pour vous rendre compte du problème, voici le lien vers la page en question: http://tbouffand.free.fr/citath/agora.php

Ci-dessous, mes styles css en rapport avec les infobulles:
.documentlarge  /* C'est la div où j'aimerais que les infobulles soient cantonnées sans pouvoir en déborder */ {
background-color: #bfb6b6;
float: left;
display: block;
padding:10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 0px;
border-radius: 10px;
width:60%;
position: relative;
text-align:justify} 

@media screen and (max-width: 800px){
.documentlarge{
	float: left;
	width: 94%;
}
}

.info  /* C'est le style du texte qui doit être défini par une infobulle. */{
text-align: justify;
font-weight:bold;
color: #B14934;
font-size: 0.9em;
line-height:1.2em;
font-family: Tahoma;
position:relative
}

.info span /*C'est le texte mis en infobulle*/{
   display: none; /* On masque l'infobulle. */
   background-color: #B14934;
   color:white;
   border-radius:10px 10px 10px 10px;
   width:150px;
   text-align:left;
   padding:5px;
   margin:10px
}
.info:hover {
   z-index: 500; /* On définit une valeur pour l'ordre d'affichage. */
   cursor: help; /* On change le curseur par défaut par un curseur d'aide. */
  }
  
.info:hover span {
   display: inline; /* On affiche l'infobulle. */
   position:absolute;
  }


Et voici le code html de la page en question:
 <meta charset="utf-8">
  <title>Citoyenneté et démocratie à Athènes (Ve-IVe s. av JC)</title>
  <link rel="stylesheet" href="style.css">
  <script language="javascript" type="text/javascript" src="scripts.js"></script>
  <LINK rel=STYLESHEET href="../spip/squelettes/css/styles.css" type="text/css">
  
 
</head>

<body>
<?php include_once("analyticstracking.php") ?>

	<div class="background">
		<div class="body">
			<div class="titre">Les institutions athéniennes</div>
			

	<!-- on met ici le menu -->
		<div class="menu">
			<div class="conteneurmenu">
			<?php include("menuvertical.php"); ?>
			</div>
		</div>
		

			<div class="contenu">
				<div class="documentlarge"<!-- Je ne veux pas que l'infobulle dépasse de cette div --> >
				<b>Le découpage territorial de l'Attique</b><br>
					<div class="imageattique">
					<?php echo file_get_contents ('admattique.svg'); ?>
					</div>
				Ce découpage territorial est l'oeuvre du réformateur Clisthène (v. 508-500 av JC). Les citoyens athéniens sont répartis par <a class="info">dèmes <span>Circonscription administrative de base correspondant à un village ou un quartier.</span></a>, par <a class="info">trittyes<span>Circonscription admnistrative regroupant un nombre variable de dèmes.</span></a> et par <a class="info">tribus.<span>Groupement de citoyens appartenant à 3 trittyes situées chacune dans une région différente du territoire de la cité.</span></a> <br>Il existe 10 tribus qui sont un cadre essentiel de la vie politique du citoyen puisque magistrats, bouleutes, héliastes... doivent représenter également les 10 tribus (c'est pour cela que le nombre des magistrats, juges, bouleutes... est un multiple de 10). C'est également au sein de sa tribu que le citoyen est mobilisé pour la guerre. <br>Les citoyens participent également à une vie politique locale au niveau du dème.
				</div>
			</div>
		</div>
	</div>

  
</body>
</html>


Merci d'avance pour vos suggestions!
Modifié par bouffandt (05 Aug 2016 - 11:44)
Bonjour !

Je ne vois qu'une solution : il faut que vous calculez s'il reste assez de place à droite du lien pour le positionner... à droite. Sinon, il faut positionner l'"info-bulle" à gauche ou exactement en dessous...

Il y a une fonction qui a l'air bien et semble bien supportée aussi : getBoundingClientRect() qui permet d'avoir les coordonnées d'un élément...

Il faut comparer l'encombrement de l'"info-bulle" positionnée à droite avec la largeur de l'article... et faire les ajustements en conséquence...

Smiley smile

PS : Vous devriez proposer à vos élèves de faire tout ça... un excellent exercice...

Edit : Certaines cartes ne sont pas franchement lisibles... (en particulier "Le découpage territorial de l'Attique aux Ve et IVe s. av. JC") et l'"info-bulle", je la mettrais plutôt en inline-block qu'en inline...
Modifié par Zelena (23 Jul 2016 - 18:33)
Bonsoir,
j'ai revu la taille de la carte en question au passage, merci pour votre suggestion.
Je ne comprends pas comment cette infobulle, qui est normalement enfant de la div ".documentlarge", peut en sortir (je sais bien que les enfants finissent par s'émanciper, mais il ne me semblait pas que c'était le cas dans le monde merveilleux du css Smiley cligne )? Je pensais qu'en jouant sur le margin, je la contraindrais à rester dans son conteneur, mais ce n'est pas le cas.
Je vais tenter la solution que vous me proposez. Mais s'adapte-t-elle à toutes les résolutions, ou faudra-t-il que j'anticipe plusieurs cas de figure avec des mediaquery?

PS: j'ai bien des élèves qui seraient capables de régler ça (il y en a même un qui m'a fait des offres de services pendant l'année!) mais je vais les laisser profiter de leurs vacances!
bouffandt a écrit :

Je ne comprends pas comment cette infobulle, qui est normalement enfant de la div ".documentlarge", peut en sortir

Oh, c'est très fréquent, ces histoires... quand il est question de float ou de positionnement en absolu...

bouffandt a écrit :

Je vais tenter la solution que vous me proposez. Mais s'adapte-t-elle à toutes les résolutions, ou faudra-t-il que j'anticipe plusieurs cas de figure avec des mediaquery?


Je ne suis pas une spécialiste des mobiles mais il s'agit de comparer l'encombrement d'un bloc avec la place disponible sur le parent (ou l'article)... Je ne vois pas comment faire intervenir les media queries de façon pertinente.

bouffandt a écrit :

PS: j'ai bien des élèves qui seraient capables de régler ça (il y en a même un qui m'a fait des offres de services pendant l'année!) mais je vais les laisser profiter de leurs vacances!

Comment ai-je pu oublier ce détail ? Smiley rolleyes

Smiley smile
Zelena a écrit :

Oh, c'est très fréquent, ces histoires... quand il est question de float ou de positionnement en absolu...

J'ai fini par comprendre pourquoi... Les paramètres de margin de l'infobulle la positionnent par rapport au mot auquel on a appliqué le style ".info" (dans mon cas). Ce qui peut finir par la pousser hors du cadre où je voudrais qu'elle reste. Donc quel que soit le réglage du margin, ça ne marchera pas pour tous les cas de figure puisque le mot, en fonction de la résolution de l'écran de l'utilisateur, peut aussi bien se retrouver à droit qu'à gauche ou au milieu du texte...

Pour mettre en oeuvre votre solution avec getBoundingClientRect(), je ne vois pas très bien comment m'y prendre (je suis un novice absolu) et la doc que je trouve sur internet ne me permet pas de tout comprendre... Pourriez-vous m'expliquer comment je peux utiliser cette fonction?

Merci! Smiley smile
Modifié par bouffandt (23 Jul 2016 - 23:37)
Bonjour !

Eh bien, quand on utilise "getBoundingClientRect()" sur un élément, on obtient l'abscisse et la largeur de cet élément (entre autres...).

Il suffit alors de comparer le total de l'abscisse et de la largeur de l'élément avec le total de l'abscisse et de la largeur de la div ".documentlarge" pour savoir si l'élément 'rentre' dans ".documentlarge"... et si ça ne rentre pas à droite (le positionnement par défaut), il faut alors le mettre à gauche.

Là où il y a problème, c'est que vos "info-bulles" sont, par défaut, en display : none... ils n'ont ni abscisse, ni largeur... avant qu'ils n'apparaissent.

Je conseille plutôt de les laisser en "display : inline-block" et de les mettre en "opacity : 0"... pour ensuite les faire apparaitre avec "opacity :1".

Il reste la question de l'événement qui va déclencher la fonction "on va positionner l'info-bulle à gauche ou on la laisse à droite". Cette décision dépend de la largeur de la fenêtre et ne va changer que si on redimensionne la fenêtre... et ce pour chaque "info-bulle"...

Alors, éventuellement, lancer cette fonction dès le départ et mettre des classes "gauche" aux info-bulles... et ne la relancer que s'il y a un événement "resize" sur window...

Voilà, c'est une piste, je l'ai dit, je ne suis pas une spécialiste...

Smiley smile
Bonjour Zelena,

je réponds rapidement pour ne pas te laisser sans retour de ma part. Je n'ai pas réussi à mettre en oeuvre la solution que tu proposais. Je me suis rabattu sur un bricolage: à l'aide d'une fonction javascript, j'appelle au survol du mot à définir une div cachée (visibility:hidden) elle-même contenue dans la div où se trouve le mot à définir.
En réglant la position en "absolute" et en mettant un margin un peu bricolé (top: 25%; right: 0; left: 0; bottom: auto;) j'arrive à centrer mon infobulle.

Merci cependant pour ton aide!