Как сохранить элемент flex от переполнения из-за его текста? [дубликат]


этот вопрос уже есть ответ здесь:

у меня есть следующий макет в виду для списка. Каждый элемент списка представлен двумя столбцами. Второй столбец должен занимать все доступное пространство, но он должен быть закреплен справа с его минимальным количеством размер если первый столбец занимает слишком много места. Первый столбец должен содержать многоточие.

проблема происходит в этом последнем случае. Когда первый столбец состоит из слишком большого количества текста, вместо того, чтобы показывать многоточие, он вытягивается из flexbox, вызывая появление горизонтальной полосы прокрутки, а второй столбец не привязан справа.

Я хотел бы, чтобы он был представлен следующим образом (макет):

Как я могу добиться этого?

Это образец скрипка .

.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 60

7 ответов:

обновление

добавление кода, который работает:

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

оригинальный ответ / объяснение.

спецификация W3C говорит, "по умолчанию элементы flex не будут уменьшаться ниже минимального размера содержимого (длина самого длинного слова или элемента фиксированного размера). Чтобы изменить это, установите свойство’ min-width ‘или’ min-height'."

если следовать этой линии рассуждений, я считаю, что ошибка была удалена из Канарейка, а не наоборот.

проверьте, как только я поставил min-width до 0, он работает на Канарском языке.

так ошибка была в старых реализациях, и канарейка удаляет эту ошибку.

этот пример работает на Канарском языке. http://jsfiddle.net/iamanubhavsaini/zWtBu/

я использовал Google Chrome версии 23.0.1245.0 канарейка.

вы можете установить предпочтительный размер ребенка, установив третье значение flex свойство авто, например:

flex: 1 0 auto;

Это стенография для установки flex-basisсвойства.

(пример)

как отмечалось в комментариях, однако, это, кажется, не работает в Chrome Canary, хотя я не уверен, почему.

Update: это не ответ. Это решает разные проблемы, и это был шаг в поиске реального ответа. Поэтому я сохраняю его по историческим причинам. Пожалуйста, не голосуйте за него.

Я считаю, что это ваш ответ: http://jsfiddle.net/iamanubhavsaini/zWtBu/2/

enter image description here

см. W3C

первый элемент

-webkit-flex: 0 1 auto; /* important to note */

и для второго элемента

-webkit-flex:1 0 auto; /* important to note */

- это свойства и значения, которые делают трюк.

подробнее на http://www.w3.org/TR/2012/WD-css3-flexbox-20120612/#flex


и вот как вы меняете порядок:http://jsfiddle.net/iamanubhavsaini/zWtBu/3/

и этот с предопределенной минимальной шириной Красной фоновой вещи:http://jsfiddle.net/iamanubhavsaini/zWtBu/1/

для mozilla вы должны добавить " min-width: 1px;"

этот пример действительно помог мне: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;
}

Update: это не ответ. Это решает разные проблемы, и это был шаг в поиске реального ответа. Поэтому я сохраняю его по историческим причинам. Пожалуйста, не голосуйте за него.

EDIT 2: Этот ответ не решает проблему. Существует тонкая разница между целью вопроса и ответом.

прежде всего,text-overflow:ellipsis работает с overflow:hidden. На самом деле, он работает с чем угодно, кроме overflow:visible . Ref

затем, повторите:

http://jsfiddle.net/iamanubhavsaini/QCLjt/8/

вот, я поставил overflow и max-width свойства. max-width:60%; и overflow:hidden это то, что заставляет вещи выглядеть так, как вы намеревались, как hidden останавливает отображение текста и 60% фактически создает поле определенного размера в случае слишком большого количества текстовых данных.

тогда, если вы действительно заинтересованы в flex box model вот как все складывается через -webkit-order.

http://jsfiddle.net/iamanubhavsaini/QCLjt/9/

--код--

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

обеспокоенный 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;
}

​-- Нет ширины и до сих пор работает. И вот что я вижу.

enter image description here

--после комментария

- webkit-order: N; - это то, что мы будем использовать после 2-х лет вместо float:---; и многие другие хаки(если W3C остается на этом конечно, а также если каждый поставщик браузера следовать)

здесь, заказ 1 для левого div и 2 для правого div. таким образом, они находятся слева-справа.

http://jsfiddle.net/iamanubhavsaini/QCLjt/10/

то же самое здесь, но только если вы ищете справа налево, просто измените порядок вещей, как div>first-child { -webkit-order:2; } div>last-child{-webkit-order:1;}

Примечание: этот -webkit-flex способ делать вещи, очевидно, делает этот код бесполезным на других двигателях. Для повторного использования код, на нескольких движках браузера floating следует использовать.

ниже приведены некоторые примеры JS; это не отвечает на вопрос -после комментария

я думаю, что это ответ на ваш вопрос и многое другое, чтобы прийти, есть некоторые другие способы и различные решения, но не совсем решение для этого вопрос. http://jsfiddle.net/iamanubhavsaini/vtaY8/1/ http://jsfiddle.net/iamanubhavsaini/9z3Qr/3/ http://jsfiddle.net/iamanubhavsaini/33v8g/4/ http://jsfiddle.net/iamanubhavsaini/33v8g/1/

вы должны сделать положение контейнера: относительное и дочернее положение: абсолютное.