Comment empêcher un article flex de déborder à cause de son texte? [dupliquer]
cette question a déjà une réponse ici:
- pourquoi les articles flex ne rétrécissent-ils pas la taille du contenu? 1 réponse
j'ai la disposition suivante à l'esprit pour une liste. Chaque élément de la liste est représenté par deux colonnes. La deuxième colonne devrait prendre tout l'espace disponible, mais il devrait être ancré à droite, avec sa taille minimale, si la première colonne est de prendre trop d'espace. La première colonne doit alors montrer une ellipse.
le problème se produit dans ce dernier cas. Lorsque la première colonne se compose de trop de texte, au lieu de montrer une ellipse, elle s'étire hors de la flexbox provoquant l'apparition d'un scrollbar horizontal, et la deuxième colonne n'est pas ancrée à droite.
j'aimerais qu'il soit rendu comme ceci
Comment puis-je y arriver?
C'est violon d'échantillon .
css lang-css prettyprint-override">.container {
display: -webkit-flex;
}
div {
white-space: nowrap;
text-overflow: ellipsis;
}
.container > div:last-child {
-webkit-flex: 1;
background: red;
}
<!-- a small first column; the second column is taking up space as expected -->
<div class="container">
<div>foo barfoo bar</div>
<div>foo bar</div>
</div>
<!-- a large first column; the first column is overflowing out of the flexbox container -->
<div class="container">
<div>foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar</div>
<div>foo bar</div>
</div>
7 réponses
UPDATE
ajouter le code qui fonctionne:
.container {
display: -webkit-flex;
}
.container>div:first-child{
white-space:nowrap;
-webkit-order:1;
-webkit-flex: 0 1 auto; /*important*/
text-overflow: ellipsis;
overflow:hidden;
min-width:0; /* new algorithm overrides the width calculation */
}
.container > div:last-child {
-webkit-flex: 1;
-webkit-order:2;
background: red;
-webkit-flex:1 0 auto; /*important*/
}
.container > div:first-child:hover{
white-space:normal;
}
<div class="container">
<div>foo barfoo bar</div>
<div>foo bar</div>
</div>
<div class="container">
<div>foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar</div>
<div>foo bar</div>
</div>
<div class="container">
<div>foo barfoo bar</div>
<div>foo bar</div>
</div>
<div class="container">
<div>foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar</div>
<div>foo bar</div>
</div><div class="container">
<div>foo barfoo bar</div>
<div>foo bar</div>
</div>
"151960920 Original de la réponse / explication.
spécification du W3C dit, " Par défaut, flex éléments qui ne rétrécit pas au-dessous de leur contenu minimum de la taille (la longueur du plus long mot ou une taille fixe de l'élément). Pour changer cela, définissez la propriété ‘min-width’ ou ‘min-height’. "
si nous suivons ce raisonnement, je crois que le bug a été enlevé de Canary, pas l'inverse.
Vérifiez dès que j'ai mis min-width
à 0
, il fonctionne à Canary.
donc bug était dans des implémentations plus anciennes, et canary supprime ce bug.
cet exemple fonctionne à canary. http://jsfiddle.net/iamanubhavsaini/zWtBu /
J'ai utilisé Google Chrome Version 23.0.1245.0 Canaries.
vous pouvez définir la taille préférée de l'enfant en définissant la troisième valeur de la propriété flex
à auto, comme suit:
flex: 1 0 auto;
ceci est un raccourci pour définir le flex-basis
propriété .
( exemple )
comme noté dans les commentaires cependant, cela ne semble pas fonctionner dans Chrome Canary, bien que je ne suis pas sûr pourquoi.
mise à jour: ce n'est pas la réponse. Il résout le problème est différent, et c'était une étape dans la recherche de la vraie réponse. Je le garde donc pour des raisons historiques. Merci de ne pas le voter.
je crois que c'est votre réponse: http://jsfiddle.net/iamanubhavsaini/zWtBu/2 /
refer W3C
pour le premier élément
-webkit-flex: 0 1 auto; /* important to note */
et pour le deuxième élément
-webkit-flex:1 0 auto; /* important to note */
sont les propriétés et les valeurs que faire l'affaire.
plus d'informations à http://www.w3.org/TR/2012/WD-css3-flexbox-20120612/#flex
et voici comment vous inversez l'ordre: http://jsfiddle.net/iamanubhavsaini/zWtBu/3 /
et celui-ci avec la largeur minimale prédéfinie du fond rouge-thingy: http://jsfiddle.net/iamanubhavsaini/zWtBu/1 /
cet exemple m'a vraiment aidé: http://jsfiddle.net/laukstein/LLNsV /
container {
display: -webkit-flex;
-webkit-flex-direction: row;
padding: 0;
white-space: nowrap;
}
.container>div {
overflow: hidden;
display: inline-block;
-webkit-flex: 1;
min-width: 0;
text-overflow: ellipsis;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
mise à jour: ce n'est pas la réponse. Il résout le problème est différent, et c'était une étape dans la recherche de la vraie réponse. Je le garde donc pour des raisons historiques. Merci de ne pas le voter.
EDIT 2: Cette réponse ne résout pas le problème. Il y a une différence subtile entre la cible de la question et la réponse.
tout d'Abord, text-overflow:ellipsis
travaille avec overflow:hidden
. En fait, ça marche avec autre chose que overflow:visible
. Ref
puis, itérer par:
http://jsfiddle.net/iamanubhavsaini/QCLjt/8/
Ici, j'ai mis overflow
et max-width
propriétés. max-width:60%;
et overflow:hidden
est ce qui fait apparaître les choses comme vous l'aviez prévu, comme hidden
arrête le texte de l'affichage et 60%
crée réellement la boîte de taille définie en cas de trop de données de texte.
alors, si vous êtes vraiment intéressé par modèle flex box voici comment les choses se déroulent via -webkit-order
.
http://jsfiddle.net/iamanubhavsaini/QCLjt/9/
-- code --
<div class="container">
<div>foo barfoo bar</div>
<div>foo bar</div>
</div>
<div class="container">
<div>foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar
foo barfoo barfoo barfoo barfoo barfoo barfoo bar</div>
<div>foo bar</div>
</div>
concerned CSS
.container {
display: -webkit-flex;
}
div {
white-space: nowrap;
text-overflow: ellipsis;
overflow:hidden;
}
.container>div:first-child{
-webkit-order:1;
-webkit-flex: 1;
}
.container > div:last-child {
-webkit-flex: 1;
-webkit-order:2;
background: red;
}
-- Il n'y a pas de largeur et cela fonctionne toujours. Et c'est ce que je vois.
--après commentaire
- webkit-commande: N; est ce que nous utiliserons après 2+ ans au lieu de float:---;
et beaucoup plus de hacks(si W3C reste sur ce cours et aussi si chaque fournisseur de navigateur suit)
ici, l'ordre est 1 pour la div de gauche et 2 pour la div de droite. ainsi, ils sont de Gauche à Droite.
http://jsfiddle.net/iamanubhavsaini/QCLjt/10/
même chose ici, mais seulement si vous cherchez à droite-gauche, il suffit de changer l'ordre des choses comme div>first-child { -webkit-order:2; } div>last-child{-webkit-order:1;}
NOTE: cette façon de faire -webkit-flex
rend évidemment ce code inutile sur les autres moteurs. Pour, la réutilisation du code, sur les moteurs de navigateur multiples float
ing doit être utilisé.
répondre à la question - après commentaire
je pense que cela répond à votre question et beaucoup d'autres à venir, Il ya d'autres façons et des solutions différentes, mais pas exactement la solution pour cette question. http://jsfiddle.net/iamanubhavsaini/vtaY8/1 / http://jsfiddle.net/iamanubhavsaini/9z3Qr/3 / http://jsfiddle.net/iamanubhavsaini/33v8g/4 / http://jsfiddle.net/iamanubhavsaini/33v8g/1/
vous devez rendre la position du conteneur: relative et la position de l'enfant: absolue.