Как разместить два div рядом, где LEFT один имеет размер, а другой занимает оставшееся место?

Я пытаюсь разместить два div рядом друг с другом со следующими критериями:

  1. Оба блока div должны оставаться на одной строке.
  2. Приоритет должен быть отдан левому div. Как можно больше текста должно отображаться в левом блоке div до точки, где используется многоточие в случае переполнения.
  3. Текст правого блока должен быть выровнен по правому краю. В случае переполнения следует использовать многоточие.
  4. Текст является динамическим, поэтому нельзя использовать проценты или фиксированную ширину.
  5. Необходимо работать только в браузере на основе webkit, поэтому решение CSS3 предпочтительнее.

Вот несколько примеров изображений того, как это будет выглядеть:

Ввод

<div class='left'>I should always fit. If not, ellipsis should be used.</div><div class='right'>Right align and fit me if space available here.</div>

Вывод

введите здесь описание изображения

Ввод

<div class='left'>I should always fit. If not, ellipsis should be used. And some more text and more, and more text.</div><div class='right'>Right align and fit me if space available here.</div>

Вывод

введите здесь описание изображения

Ввод

<div class='left'>This text is left aligned.</div><div class='right'>This text is right aligned.</div>

Вывод

введите здесь описание изображения


person Philip Murphy    schedule 16.09.2013    source источник


Ответы (2)


У меня это есть, за исключением того, что когда есть пустое место, мой правый div ест его (с текстом, выровненным по правому краю). Вы не указываете это как вопрос, поэтому я не был уверен, что это именно то, как вы это нарисовали? Поиграйте здесь: http://jsfiddle.net/mdares/fSCr6/

HTML:

<div class="container">
    <div class="left">Some Text, Repeat, Repeat, Repeat, ,Some Text, and then: </div>
    <div class="right">other Text ttt other Text tttother Text tttother Text ttt</div>
</div>

<p />

<div class="container">
    <div class="left">Some Text, Repeat, Repeat, Repeat, ,Some Text, Some Text, Repeat, Repeat, Repeat, ,Some Text,</div>
    <div class="right">other Text ttt other Text tttother Text tttother Text ttt</div>
</div>

<p />

<div class="container">
    <div class="left">Some Text, Repeat, Repeat, Repeat, ,Some Text, </div>
    <div class="right">other Text ttt</div>
</div>

CSS:

.container {
    width: 600px;
}
.left {
    max-width: 100%;
    background:red;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    -ms-text-overflow:ellipsis;
    float: left;
}
.right {
    background:yellow;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    -ms-text-overflow:ellipsis;
    text-align: right;
}

И наконец:

введите здесь описание изображения

person Matthew    schedule 24.09.2013
comment
Привет, Мэтью, это действительно выглядит очень хорошо. Я могу добавить один пробел между ними, чтобы решить проблему с пробелами, о которой вы упоминаете. Поскольку я не хочу использовать фиксированную ширину, я протестировал его без ширины: 600 пикселей на элементе контейнера, и, похоже, он работает хорошо. Он отлично работает в Chrome, однако в Safari, когда правый div полностью выталкивается из представления, он (т.е. правый div) переносится на следующую строку. Можно ли это исправить? - person Philip Murphy; 25.09.2013
comment
Контейнер предназначен только для имитации того, что будет содержать их в div - т.е. он не предназначен для того, чтобы быть частью решения, просто имитирует страницу, на которой они находятся. Что касается Safari - я думаю, что он установлен на работе, и я попытаюсь посмотреть, что там наверху. - person Matthew; 25.09.2013
comment
Ок - воспроизвел. Я этого не видел, так как это происходит только тогда, когда контейнер не имеет фиксированного размера (цифры). И только при изменении размера (обновление снова заставит его выглядеть правильно). Сейчас пытаюсь разобраться. - person Matthew; 25.09.2013
comment
Хорошо - попробовал пару вещей, и я не вижу никакого единственного способа CSS для обработки изменения размера окна без фиксированного размера в контейнере. У меня это нормально работает в Safari, если страница начинается меньше, чем ширина левого div. Вы можете сделать это в JS, используя что-то вроде: $(window).resize(function(){ $('#right').width($(window).width() - $('#left').width()); }); - person Matthew; 25.09.2013
comment
Привет, Мэтью, я приму ваш ответ, поскольку он работает, когда страница загружается, и соответствует всем критериям, изначально указанным в вопросе. При изменении размера окна в Safari оно прерывается, так как текст переносится на следующую строку. Я не думаю, что это будет проблемой на практике, поскольку это предназначено для мобильного браузера, размер которого нельзя изменить. Просто из любопытства и для лучшего понимания, вы знаете, почему текст переносится при изменении размера? - person Philip Murphy; 27.09.2013
comment
PS для удобства других читателей вы можете использовать a для создания пробела между элементами div. - person Philip Murphy; 27.09.2013
comment
Попробуйте использовать разрыв слова для div и пробел без переноса для контейнера. - person Anobik; 27.09.2013
comment
@Anobik Мне тоже это не исправляет. Кроме того, Филип: Понятия не имею, почему он это делает, поиграл с ним еще немного, и я не смог выполнить другие ваши условия и предотвратить опускание div с помощью одного лишь CSS. - person Matthew; 27.09.2013
comment
@Anobik Fiddle или этого не было? :) - person Matthew; 27.09.2013
comment
@Matthew FYI, я пытался использовать предложенный вами JS, чтобы предотвратить перенос, но это не останавливает его - скрипка: jsfiddle.net/philipjmurphy/fSCr6/18 Я внес только два изменения в исходную скрипку: Добавлено создание JS селекторы классов из селекторов идентификаторов и изменили ширину контейнера на 100% - person Philip Murphy; 28.09.2013

За исключением ширины контейнера, которая может быть определена в%, вот решение. Единственная работающая трещина заключалась в том, чтобы поставить фон контейнера как у дочернего.

иначе последнее условие действительно трудно достичь :) Просто быть правдой.

Вот ссылка на скрипку

ширина скрипки

Вот css

.container {
width: 100%;
overflow:hidden;
whitespace:nowrap;
max-width:100%;
    background-color:red;
}
.left {
    width:auto;
    background:red;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    -ms-text-overflow:ellipsis;
    float: left;
    position:absolute;
    max-width:inherit;
}
.right {
    background:yellow;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    -ms-text-overflow:ellipsis;
    text-align: right;
    width:auto;
    float:right;
}

Посмотрите, подходит ли он. Последнее условие действительно сложное, если у кого-то есть другое решение для последнего изображения, которое вы вставили, пожалуйста, поделитесь :)

person Anobik    schedule 25.09.2013
comment
Ваша абсолютная позиция не имеет смысла с вашим поплавком или, возможно, со страницей, если контейнер не расположен относительно друг друга, или установите для контейнера значение relative, но вы не сможете сделать это по отношению к остальной части его страницы, которую мы не делаем не знаю. Избавьтесь от всего этого, и тогда вы получите мой ответ :) - person Matthew; 25.09.2013
comment
Наверно по кругу все 5 состояние :) Протестировал все по мере возможности. Я знаю, что некоторые стили могут быть лишними :) я плохо с этим справлюсь - person Anobik; 25.09.2013
comment
Спасибо за ваши старания. Правильный div должен быть отодвинут от представления, и должно появиться многоточие, поэтому я присудил награду Мэтью. - person Philip Murphy; 27.09.2013
comment
Хорошо :) попробуйте, никогда не навредите, на самом деле я не предпочитаю код jquery :) - person Anobik; 27.09.2013
comment
На самом деле я пытался придерживаться последнего пункта. Работать нужно только в браузере на основе webkit, поэтому предпочтительнее решение CSS3. Потому что это легко даже с jquery и javascript. :) - person Anobik; 27.09.2013
comment
Да - всегда стоит попробовать :) Удивительно, что это оказывается довольно сложно. CSS иногда кажется несколько ограниченным, когда дело доходит до любой сложности с макетами. Спасибо за ваш вклад - это ценится. - person Philip Murphy; 27.09.2013
comment
Спасибо :) думаю, более высокая версия заменяет js и jquery: P, как она развивается: D - person Anobik; 27.09.2013