Problème
J'ai un <select>
où l'un de ses <option>
Le texte des valeurs de l'entreprise est très long. Je veux que le <select>
pour qu'il ne soit jamais plus large que son parent, même s'il doit couper le texte affiché. max-width: 100%
devrait le faire.
Avant de redimensionner :
Ce que je veux après le redimensionnement :
Mais si vous charger cet exemple jsFiddle et redimensionnez la largeur du panneau "Résultat" pour qu'elle soit inférieure à celle de l'écran de l'utilisateur. <select>
vous pouvez voir que la sélection à l'intérieur du <fieldset>
ne parvient pas à réduire sa largeur.
Ce que je vois réellement après le redimensionnement :
Cependant, le page équivalente avec un <div>
au lieu d'un <fieldset>
se met à l'échelle correctement. Vous pouvez le voir et tester plus facilement vos modifications si vous avez a <fieldset>
et un <div>
à côté les uns des autres sur une même page . Et si vous supprimer l'environnement <fieldset>
tags le redimensionnement fonctionne. Le site <fieldset>
est en quelque sorte à l'origine de la rupture du redimensionnement horizontal.
El <fieldset>
agit comme s'il existait une règle CSS fieldset { min-width: min-content; }
. ( min-content
signifie, en gros, la plus petite largeur qui ne fait pas déborder un enfant). Si je remplace le <fieldset>
avec un <div>
con min-width: min-content
c'est exactement la même chose. Pourtant, il n'y a pas de règle avec min-content
dans mes styles, dans la feuille de style par défaut du navigateur, ou visible dans l'inspecteur CSS de Firebug. J'ai essayé de remplacer tous les styles visibles dans la feuille de style par défaut du navigateur. <fieldset>
dans l'inspecteur CSS de Firebug et dans la feuille de style par défaut de Firefox. forms.css mais cela n'a pas aidé. Plus précisément, le remplacement de min-width
y width
n'a rien fait non plus.
Code
HTML du jeu de champs :
<fieldset>
<div class="wrapper">
<select id="section" name="section">
<option value="-1"></option>
<option value="1501" selected="selected">Sphinx of black quartz, judge my vow. The quick brown fox jumps over the lazy dog.</option>
<option value="1480">Subcontractor</option>
<option value="3181">Valley</option>
<option value="3180">Ventura</option>
<option value="3220">Very Newest Section</option>
<option value="1481">Visitor</option>
<option value="3200">N/A</option>
</select>
</div>
</fieldset>
Mon CSS qui devrait fonctionner mais ne fonctionne pas :
fieldset {
/* hide fieldset-specific visual features: */
margin: 0;
padding: 0;
border: none;
}
select {
max-width: 100%;
}
Réinitialisation de la width
les propriétés à les valeurs par défaut ne fait rien :
fieldset {
width: auto;
min-width: 0;
max-width: none;
}
Autres CSS dans lesquels je essayer et échouer à résoudre le problème :
/* try lots of things to fix the width, with no success: */
fieldset {
display: block;
min-width: 0;
max-width: 100%;
width: 100%;
text-overflow: clip;
}
div.wrapper {
width: 100%;
}
select {
overflow: hidden;
}
Plus de détails
Le problème se pose également dans cette exemple jsFiddle plus complet et plus compliqué qui est plus proche de la page web que j'essaie de corriger. Vous pouvez voir que le <select>
n'est pas le problème - un bloc en ligne div
ne parvient pas non plus à redimensionner. Bien que cet exemple soit plus compliqué, je suppose que la correction du cas simple ci-dessus résoudra également ce cas plus compliqué.
(voir les détails de la prise en charge du navigateur ci-dessous).
Une chose curieuse à propos de ce problème est que si vous définissez div.wrapper { width: 50%; }
le <fieldset>
arrête de se redimensionner au moment où la taille réelle <select>
aurait touché le bord de la fenêtre. Le redimensionnement se fait comme si le <select>
a width: 100%
même si le <select>
On dirait qu'il a width: 50%
.
Si vous donner le <select>
lui-même width: 50%
ce comportement ne se produit pas ; la largeur est simplement correctement définie.
Je ne comprends pas la raison de cette différence. Mais elle n'est peut-être pas pertinente.
J'ai également trouvé la question très similaire Le jeu de champs HTML permet aux enfants de s'étendre indéfiniment . Le demandeur ne trouvait pas de solution et devine qu'il n'y a pas de solution en dehors de la suppression de la <fieldset>
. Mais je me demande, si c'est vraiment impossible de faire le <fieldset>
affichage droit, pourquoi ça ? Qu'est-ce que <fieldset>
's spec o CSS par défaut ( à partir de cette question ) provoque ce comportement ? Ce comportement spécial est probablement documenté quelque part, puisque plusieurs navigateurs fonctionnent de cette manière.
Objectif et exigences de base
J'essaie de le faire dans le cadre de l'écriture de styles mobiles pour une page existante comportant un grand formulaire. Le formulaire comporte plusieurs sections, dont une partie est enveloppée dans un fichier de type <fieldset>
. Sur un smartphone (ou si vous réduisez la taille de la fenêtre de votre navigateur), la partie de la page comportant le symbole <fieldset>
est beaucoup plus large que le reste de la forme. La largeur de la plus grande partie du formulaire est bien limitée, mais la section avec l'icône <fieldset>
ne le fait pas, ce qui oblige l'utilisateur à faire un zoom arrière ou un défilement vers la droite pour voir toute cette section.
Je me méfie de la suppression pure et simple de la <fieldset>
Il est généré sur de nombreuses pages d'une grande application et je ne sais pas quels sélecteurs CSS ou JavaScript peuvent en dépendre.
Je peux utiliser JavaScript si j'en ai besoin, et une solution JavaScript est mieux que rien. Mais si JavaScript est le seul moyen de faire cela, je serais curieux d'entendre une explication sur la raison pour laquelle cela n'est pas possible en utilisant seulement CSS et HTML.
Modifier : support du navigateur
Sur le site, je dois prendre en charge Internet Explorer 8 et plus (nous venons d'abandonner la prise en charge d'IE7), la dernière version de Firefox et la dernière version de Chrome. Cette page particulière doit également fonctionner sur les smartphones iOS et Android. Un comportement légèrement dégradé mais toujours utilisable est acceptable pour Internet Explorer 8.
J'ai refait le test mon brisé fieldset
exemple sur différents navigateurs. En fait, il fonctionne déjà dans ces navigateurs :
- Internet Explorer 8, 9 et 10
- Chrome
- Chrome pour Android
Il se casse dans ces navigateurs :
- Firefox
- Firefox pour Android
- Internet Explorer 7
Ainsi, le seul navigateur qui m'intéresse et dans lequel le code actuel ne fonctionne pas est Firefox (sur le bureau et sur le mobile). Si le code était corrigé pour fonctionner dans Firefox sans être cassé dans les autres navigateurs, cela résoudrait mon problème.
Le modèle HTML du site utilise les commentaires conditionnels d'Internet Explorer pour ajouter des classes telles que .ie8
y .oldie
à la <html>
élément. Vous pouvez utiliser ces classes dans votre CSS si vous devez contourner les différences de style dans IE. Les classes ajoutées sont les mêmes que dans cette ancienne version de HTML5 Boilerplate .
42 votes
Félicitations pour cet excellent article
0 votes
Votre exemple simple : donner
<fieldset>
(oudiv.wrapper
) la largeur dont il a besoin, etselect { width:100% }
.max-width
semble donner à l'élément un certain % de la valeur de son parent. original n'est pas mis à l'échelle, alors quewidth
s'adapte à son parent. Je pense que cela fera ce que vous voulez (mais je pourrais avoir mal compris). Dans votre manipulation plus complexe, essayez de donner aux champs de la colonne de gauche un % de largeur, et une largeur minimale en pixels. Puis donnez aux champs de droite 100 - (left-fields-%-width) % de largeur.0 votes
Je viens d'avoir une autre idée : et si vous définissiez la largeur minimale du champ à 0 ? En soi, cela ne résoudra probablement pas le problème, mais cela vaut peut-être la peine d'essayer. Je suis en train de travailler sur un autre chemin, mais si ça ne marche pas, je vais aussi essayer.
0 votes
L'étiquette et le champ doivent-ils rester sur la même ligne ? Dans les petites fenêtres, ils se chevauchent. Pourquoi ne pas faire en sorte qu'ils soient plus ou moins réactifs et qu'ils s'ouvrent sur une nouvelle ligne si nécessaire ?
0 votes
@trojansdestroy Sur le site réel, j'ai déjà une CSS avec une requête média qui fait que les étiquettes et les champs sont sur des lignes séparées à 640px de largeur ou plus étroites. Pour les largeurs supérieures, j'ai besoin que l'étiquette et le champ restent sur la même ligne, mais vous n'avez probablement pas besoin de faire quelque chose de spécial pour que cela fonctionne.
0 votes
Je me rends compte que je n'ai pas vraiment répondu à votre demande spécifique d'une solution multi-navigateur parce que le simple fait d'ajouter le fichier
display: table-*
casse le rendu dans IE. Dans cette optique, j'ai décrit un moyen de limiter cette déclaration à Firefox et expliqué pourquoi je pense que c'est justifié.2 votes
Question connexe : Comment faire en sorte que les éléments de sélection se réduisent à un pourcentage de la largeur maximale dans les champs ?