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

Expected rendering

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>
60
demandé sur user 2012-08-19 01:10:27

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.

110
répondu matharden 2016-01-19 11:48:26

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.

8
répondu Marcus Stade 2012-08-20 23:57:12

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 /

enter image description here

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 /

2
répondu 2016-02-12 01:36:57

pour mozilla, vous devez ajouter "min-width: 1px; "

0
répondu goksel 2012-11-02 17:42:45

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;
}
0
répondu Con Antonakos 2015-11-23 05:04:53

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.

enter image description here

--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/

0
répondu 2016-02-12 01:37:36

vous devez rendre la position du conteneur: relative et la position de l'enfant: absolue.

-3
répondu Radu Brehar 2014-05-23 09:59:02