28172 sujets

CSS et mise en forme, CSS3

Bonjour, j'ai un problème sous chrome uniquement avec les légendes des fieldsets mais qui m'a posé un cas de conscience !

En fait mes légendes sont composées d'image et de combobox, bref que des phrasing content pour respecter les spec du W3C. Elles ont une raison d'être dans la légende dans la mesure ou le contenu du fieldset est relatif au combobox choisi donc la légende est décrite grace à la valeur selectionnée dans les combobox.

Dans le code en simplifié ça donne ça :


<fieldset>
		<legend>
			<span id="navigation"> 
			<img src="flechegauche.png" alt="précédent" /> 
			<img src="flechedroite.png" alt="suivant" />
			</span> 
                        <span id="filtre">
			<select>
					<option value="1">choix 1</option>
					<option value="2">choix 2</option>
					<option value="3" selected>choix 3</option>
  			</select> 
			<select>
					<option value="1b">choix 1b</option>
					<option value="2b" selected>choix 2b</option>
					<option value="3b">choix 3b</option>
					<option value="4b">choix 4b</option>
			</select>
                        </span>
		</legend>
</fieldset>


fieldset > legend > span
{
        float                                  : left
}

fieldset > legend > #navigation
{
	margin				: 0 0.25 0 0.25em;
}

fieldset > legend > #filtre
{
	margin				: 0.4em 0.25 0.4em 0.25em;
}

fieldset > legend img
{
	width 				: 2em;
	height				: 2em;
}


Le code html est validé par le W3C ça m'a rassuré sur le contenu de ma légende par contre ce qui est plus douteux et qui me pose problème c'est la css, à savoir les propriétés float sur mes span.

Sans cette propriété l'alignement entre mes images et mes selects est mauvaise car les images sont plus grandes que le texte et le texte se cale au même niveau que l'image.

Les marges top et bottom n'étant applicables qu'aux éléments de type bloc je ne peux pas les utiliser directement sur ma span, or j'y ai accès depuis que j'ai attribué la propriété float à mes span. Du coup j'en ai déduis que cette propriété transformait implicitement le container en block. Ca a été confirmé lorsque du coup j'ai essayé d'attribuer une hauteur à un élément de type span. Celle-ci n'est prise en compte que si je pose la propriété float.

Du coup, deux questions :
La première : Si l'attribue float converti un élément de type inline en type bloc, ne doit-il pas être totalement proscrit d'une légende (ça me ferait bien ch... mais bon ^^).

La deuxième va avec la première : Si le float remet bien en question le type display du container, doit on finalement considérer (malgré les recommandations du w3c oO) que select et img, à qui nous pouvons attribué des valeurs de type margin-top ou bottom et des valeurs de tailles n'ont pas non plus leur place dans une legend ?

La troisième qui est très étrange et qui n'a rien à voir : Chrome ... Pourquoi est ce qu'il n'affiche rien dans la légende si la légende n'est composée que d'élément en float ? Il suffit de lui rajouter un simple élément qui float pas pour arranger le problème.(ce qui était facile dans mon cas, je n'ai d'ailleurs plus aucun élément qui float, j'utilise uniquement les select et img comme balise directement enfant de la légende et je les positionne via le vertical align, des tailles et des marges)

Exemple :

<legend>
<img src="superimage.jpg" style="float:left" alt="Image super jolie"/>
<span style="float : left">
<span>elem 1</span>
<span> elem 2</span>
</span>
</legend>
ça ça ne s'affiche pas !

Par contre

<legend>
<img src="superimage.jpg" style="float:left" alt="Image super jolie"/>
<span>
<span style="float : left">elem 1</span><span> elem 2</span></span>
</legend>

Lui affiche tout ...

Sous chrome uniquement, firefox et ie affiche tout.
ÉTRANGE !
Modifié par Gadwin (13 Sep 2013 - 14:16)
Administrateur
Bonjour,

Gadwin a écrit :
Le code html est validé par le W3C ça m'a rassuré sur le contenu de ma légende

En HTML 4.01, même un legend en dehors d'un fieldset (je crois) et un fieldset en dehors d'un form (sûr) sont valides parce qu'il n'y a pas moyen pour la DTD de faire plus contraignant.
Mais je n'ose imaginer le résultat dans un lecteur d'écran, pour commencer. Cet élément est prévu pour accueillir un texte de présentation. Selon le contexte, on pourrait envisager un fieldset dans un fieldset (et des légendes plus simples).


Gadwin a écrit :
Si l'attribue float converti un élément de type inline en type bloc, ne doit-il pas être totalement proscrit d'une légende

CSS ne modifie pas la sémantique d'une page ou d'un élément, il en modifie l'aspect.
HTML c'est la sémantique ; CSS en modifie l'aspect.
Un legend reste un legend (à moins de le cacher avec display: none ou visibility: hidden parce que là oui ce sera caché pour tout le monde Smiley smile ).
Mais au lieu d'être affiché par défaut ... euh très bizarrement, prenons plutôt un span... donc un span est par défaut affiché de façon inline et avec display: block sera affiché de façon block mais il ne devient pas pour autant un p... et d'ailleurs pourquoi il ne deviendrait pas un h1 ou h6 puisque eux aussi sont block par défaut ? Smiley cligne

Sinon pour arriver au défaut d'affichage sous Chrome, essaie de coller un overflow: hidden sur le fieldset parent (ou display: table ou autre instruction conférant un "block formatting context" - BFC) ; j'ai un souci similaire qui se règle de cette manière.
Faut pas trop chercher le pourquoi du comment ; CSS ne définit pas ce que doivent faire exactement les éléments de formulaire et les navigateurs ont une certaine liberté dont ils abusent un peu... toujours difficile les formulaires Smiley cligne
Modifié par Felipe (13 Sep 2013 - 16:44)
Bonjour,

Merci pour la réponse, j'ai testé l'overflow à hidden et effectivement ça marche Smiley biggol .

Bon j'ai pas trop compris l'intérêt de cacher l'overflow pour que ça marche par contre du coup j'ai voulu essayer tout simplement en affectant une hauteur à la légende et sans surprise ça a marché aussi... en fait les éléments qui float ne sont pas considérés par l'élément parent pour définir la taille de ce dernier ? C'est curieux comme réaction, d'autant qu'il prend bien en compte la largeur par contre m'affiche aucun texte... Pour un problème de ce genre j'aurais plus vu un truc du style que le cadre du fieldset se superpose au texte parce que justement la taille du texte n'est pas considéré... Là on ne voit juste rien ... Smiley mur .

Bref, Merci à toi ! (j'adore ce site et ce forum.....) Smiley confused