28172 sujets

CSS et mise en forme, CSS3

Bonjour à tous

Dans l'outil d'administration que je suis en train de développer, j'ai un arbre des répertoires, le répertoire choisi étant sur fond gris.

J'essaie de styler ça pour ne pas avoir trop d'espacement vertical entre les lignes, ce qui marche à peu près, mais la hauteur du texte, contenu dans une balise <h3>, est telle que ça mord sur le <li> précédent, ce qui donne une présentation peu agréable. Je n'arrive pas à gérer ça en CSS

Voici le code CSS correspondant

ul.dirtree, ul.dirtree ul {        /* style les "branches" de l'arbre  */
	list-style:none;
	margin: -0.5em 0;
}
ul.dirtree li {                        /* style les lignes */
	position:relative;
	margin-left:2em;
	vertical-align: middle;
	line-height: 1em;
}
ul.dirtree li button {            /* bouton pour étendre/réduire les sous répertoires */
	position:absolute;
	left:-1.5em;
	height:1.5em;
	width:1.5em;
	text-align:center;
	background-color:transparent;
	border:none;
	transform:rotate(90deg); 
      /* le texte du bouton est un ">" si la liste et réduite, et un chevron pointe en bas si elle est étendue */
}
ul.dirtree li.active > h3{    /* mettre en évidence la ligne active */
	line-height:0.8em;
	vertical-align:middle;
	background-color:#dddddd;
}
ul.dirtree li.reduced > button {transform:rotate(0);} 
/* forme du bouton quand le sous répertoire est réduit */
li.reduced > ul {display:none;} /* ne pas afficher les sous répertoires si la liste est réduite */


J'obtiens le résultat suivant:
upload/1506593566-48769-dirtree.jpg

Pouvez vous me donner des conseils pour améliorer la présentation de ce bazar?
Désolé de ne pas pouvoir donner accès à la vraie page, qui est dans la partie protégée du site.
Modifié par PapyJP (28 Sep 2017 - 14:19)
Bonjour.

Qu'est-ce que ça donne si tu fais :

ul.dirtree li.active > h3 {
	margin-top: 1em;
}


Idéalement, je suppose, il faudrait pouvoir cibler l'élément parent.
Modifié par thierry (28 Sep 2017 - 14:02)
Bonjour.

Les interlignages par défaut doivent permettre d'empêcher que 'cela morde'…
Pourquoi les avez-vous changés ?


ul.dirtree li {                        /* style les lignes */
	...
	line-height: 1em;
}
ul.dirtree li.active > h3{    /* mettre en évidence la ligne active */
	line-height: 0.8em;
	...
}
thierry a écrit :
Bonjour.
Qu'est-ce que ça donne si tu fais :
ul.dirtree li.active &gt; h3 {
	margin-top: 1em;
}

Une ligne devient active quand l'utilisateur clique dessus, et cesse d'être active quand on clique sur un autre ligne. Je ne pense pas que l'utilisateur aimerait que la liste passe son temps à se décaler verticalement en fonction des clics.
thierry a écrit :
Idéalement, je suppose, il faudrait pouvoir cibler l'élément parent.

Je ne vois pas ce que tu veux dire.
Zelena a écrit :
Bonjour.
Les interlignages par défaut doivent permettre d'empêcher que 'cela morde'…
Pourquoi les avez-vous changés ?

ul.dirtree li {                        /* style les lignes */
	...
	line-height: 1em;
}
ul.dirtree li.active > h3{    /* mettre en évidence la ligne active */
	line-height: 0.8em;
	...
}

Bonne remarque, mais hélas ça ne suffit pas.

thierry a écrit :
Mettre le h3 en display: inline et changer son vertical-align (bottom ? baseline ? sub ?) ? (cf. : https://developer.mozilla.org/fr/docs/Web/CSS/vertical-align).

Je vais essayer ça.

Je reviens vers vous quand j'ai quelque chose qui me semble, sinon parfait, du moins plus satisfaisant.
Modifié par PapyJP (28 Sep 2017 - 17:59)
Modérateur
PapyJP a écrit :

Bonne remarque, mais hélas ça ne suffit pas.

Pourtant c'est bien la cause du problème: un interlignage de 1 font que les lignes sont collées, en-dessous elles se superposent et en dessus elles sont espacées.

La source du problème vient de là.

Par contre:


ul.dirtree li {
	position:relative;
	margin-left:2em;
	vertical-align: middle;
	line-height: 1em;
}

Si à l'intérieur il y a un h3 qui a un font-size plus grand, son line-height sera inférieur à 1;

il faudrait préférer la forme suivante (sans le em):

line-height: 1;


qui permettra aux enfants d'avoir un line-height proportionnel à leur font-size.
J'ai modifié le CSS, avec

ul.dirtree, ul.dirtree ul {
	list-style:none;
	margin: -0.5em 0;
}
ul.dirtree li {
	position:relative;
	margin-left:2em;
	vertical-align: middle;
	line-height: 1.5em;
}
ul.dirtree li button {
	position:absolute;
	left:-1.5em;

	height:1.5em;
	width:1.5em;
	text-align:center;
	background-color:transparent;
	border:none;
	transform:rotate(90deg);
}
ul.dirtree li > h3 {
	display:inline;
}
ul.dirtree li.active > h3{
	background-color:#dddddd;
	display:inline;
}
ul.dirtree li.reduced > button {transform:rotate(0);}
li.reduced > ul {display:none;}

Le résultat n'est pas génial:
upload/1506619596-48769-dirtree2.jpg
Modifié par PapyJP (28 Sep 2017 - 19:27)
Bonjour à tous
J'ai trouvé une solution Smiley sweatdrop visuellement satisfaisante Smiley smile , mais intellectuellement pas satisfaisante du tout! Smiley biggol
J'ai défini une image de 1px de côté "gray-dot.png" et j'ai stylé:

ul.dirtree li.active > h3{
	display:inline;
	background: url('gray-dot.png'); 
	background-size:100% 1em;
	background-position:left bottom;
	background-repeat: no-repeat;
}

Vos commentaires SVP