Как сохранить элемент 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 ответов:
обновление
добавление кода, который работает:
.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 канарейка.
Update: это не ответ. Это решает разные проблемы, и это был шаг в поиске реального ответа. Поэтому я сохраняю его по историческим причинам. Пожалуйста, не голосуйте за него.
Я считаю, что это ваш ответ: http://jsfiddle.net/iamanubhavsaini/zWtBu/2/
см. 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/
этот пример действительно помог мне: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; }
-- Нет ширины и до сих пор работает. И вот что я вижу.
--после комментария
- 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
способ делать вещи, очевидно, делает этот код бесполезным на других двигателях. Для повторного использования код, на нескольких движках браузераfloat
ing следует использовать.ниже приведены некоторые примеры 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/