2013-09-23 3 views
6

У меня есть одно требование, где мне нужно применить ширину к родительскому элементу, который равен ширине первого дочернего элемента. Это можно легко достичь, используя display: inline-block или float: left родительскому элементу, если он имеет только один дочерний элемент. Но у меня есть более двух дочерних элементов в div. Что-то вроде этого:Перерыв букв второго дочернего div

Fiddle

<div class="main"> 
    <div class="first">first</div> 
    <div class="value">valuevalue</div> 
</div> 

Прямо сейчас, если я применяю display: inline-block к родительскому элементу, то имеющий ширину второго дочернего элемента.

enter image description here

Чтобы не случилось этого, я попытался break-word, word-break CSS свойства на второй дочерний элемент, но до сих пор не используется.

То, что я пытаюсь получить показано на следующем скриншоте:

enter image description here

Некоторые важные моменты:

  • ширина родительского элемента должен быть равен первому элементу ребенка.
  • Высота родительского элемента должна быть равна сумме всех дочерних элементов.
  • Я не знаю ширины первого дочернего элемента.
  • (EDIT) Первый дочерний элемент имеет фиксированную ширину и высоту. Я не знаю этих ценностей.

Я хочу сделать это, используя только css. css3 приветствуется. (Я знаю, как это сделать, используя javascript)

+0

Вы должны держать эту точную структуру DOM? – Itay

+0

Ваше второе требование «высота родительского элемента должно быть равно второму/последнему дочернему элементу», по-видимому, означает, что элемент '.value' должен каким-то образом определить высоту родительского контейнера, что также означает, что родительский контейнер должен игнорировать высоту элемента '. first '. Пожалуйста, уточните, спасибо. –

+0

@yay да, но если у вас есть самое близкое решение с меньшими изменениями, я могу подумать об этом :). То, что у меня на самом деле в моем проекте, является родительским элементом со списком дочерних элементов. –

ответ

3

Вы можете легко получить это благодаря новым внутренним и внешним значениям CSS3 (min-content в этом случае), хотя он не поддерживается IE, поэтому он не является жизнеспособным вариантом, но я просто опубликую его, поскольку это интересно, мы сможем сделать это в будущем:

http://jsfiddle.net/S87nE/

HTML:

<div class="main"> 
    <div class="first">first</div> 
    <div class="value">valuevaluevalue</div> 
</div> 

CSS:

.main { 
    background-color: cornflowerblue; 
    width: -moz-min-content; 
    width: -webkit-min-content; 
    width: min-content; 
} 
.first { 
    width: 50px; /* I don't know this width */ 
    height: 50px; /* I don't know this height */ 
    background-color: grey; 
} 

.value{ 
    word-break: break-all; 
} 

Я думаю, что в худшем случае вы можете использовать его для новых браузеров и JS для IE и более старых версий.

Ссылка:

+0

Да, у тебя это приятель. Где вы все это время ...? Большое спасибо человеку: D. –

+2

Я занимался исследованиями в течение двух последних часов, потому что то, что вы хотели заинтересовать меня на моем сайте xD – aleation

+0

, мы учимся, и мы учимся, и мы продолжаем учиться. +1 для этого. – avrahamcool

0

Посмотрите на мой последний комментарий к ссылке Fiddle. Я тоже кое-что изменил в html. Установил значение div внутри первого div, чтобы использовать его ширину, и добавил слово-wrap в значение div.

.main { 
    display: inline-block; 
    background-color: cornflowerblue; 
    position: relative; 
} 
.first { 
    width: 50px; /* I don't know this width */ 
    position: relative; 
    background-color: grey; 
} 

.first p { 
    margin-bottom: 30px; 
    margin-top: 0; 
} 

.value { 
    max-width: 100%; 
    word-wrap:break-word; 
    background-color: cornflowerblue; 
} 

HTML:

<div class="main"> 
    <div class="first"> 
     <p>first</p> 
     <div class="value">valuevalue</div> 
    </div> 
</div> 

http://jsfiddle.net/jxw4q/12/

+0

Я не могу изменить ширину первого дочернего элемента. На самом деле, я не знаю его ширины. –

+0

ОБНОВЛЕНО здесь: http://jsfiddle.net/jxw4q/2/ это так, как вы этого хотели? –

+0

вы передаете ширину родительскому элементу. Родительский элемент должен иметь ширину, равную первому дочернему элементу (и я не знаю эту ** фиксированную ширину **). Я понимаю, что это невозможно даже с помощью css3. –

0

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

вы можете иметь тот же вид, что и вы, но без натяжения родительской высоты. используя position:absolute; на втором div.

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

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

(Я не думаю, что это ваш случай, но, возможно, это поможет другим пользователям, которые могут наткнуться на этот вопрос.) в любом случае, я считаю, что единственным вариантом является использование Script.

Для тех, кто подпадает под потребительной случае я описал, Вот Working Fiddle

HTML: (никаких изменений здесь)

<div class="main"> 
    <div class="first">First div set the width</div> 
    <div class="value">second fiv should wrap if bigger then first</div> 
</div> 

CSS:

.main 
{ 
    display: inline-block; 
    position: relative; 
} 
.first 
{ 
    background-color: gray; 
} 
.value 
{ 
    position: absolute; 
    background-color: cornflowerblue; /* moved here */ 
} 
+0

Это отлично работает для двух дочерних элементов, но не более двух. [Скрипка] (http://jsfiddle.net/venkateshwar/CXWmc/1/). Во всяком случае, я понял, что это невозможно с помощью только css. Благодарю. –

+0

Я согласен с тобой. вот почему я сказал, что это не будет хорошо .. если только это не для конкретного случая использования. Я написал этот ответ только для будущих адептов, которые ** могут ** попадать в категорию прецедентов. – avrahamcool

0

Я не думаю, что вы сможете достичь этого без небольшой поддержки javascript. Представьте себе следующую разметку и CSS:

<div class="main"> 
     <div class="first content">first</div> 
     <div class="second content">valuevalue</div> 
</div> 

, а затем следующий CSS:

.main{ 
    background-color : red; 
    display: inline-block; 
    max-width: 50px; 
} 
.first{ 
    background-color : blue; 
} 
.second{ 
    background-color : green; 
} 
.content{ 
    word-break: break-word; 
} 

Теперь все, что вам нужно сделать, это установить максимальную ширину вашего .main DIV равным вашей первый элемент и добавить класс содержимого к каждому элементу. Я полагаю, вы добавляете свои элементы динамически.

1

В идеале, стиль макета для HTML фрагмент кода, как:

<div class="main"> 
    <div class="first">first</div> 
    <div class="value">firstvaluevalue</div> 
    <div class="value">second value value</div> 
    <div class="value">third valuevalue</div> 
    <div class="value">valuevalue on the fourth line</div> 
</div> 

достижимо с помощью следующего CSS:

.main { 
    display: inline-block; 
    background-color: cornflowerblue; 
    position: relative; 
    width: 50px; 
} 
.first { 
    width: 50px; /* I don't know this width */ 
    height: 50px; /* I don't know this height */ 
    background-color: grey; 
} 
.value { 
    word-break: break-all; 
    margin: 1.00em 0; 
} 

, как показано на: http://jsfiddle.net/audetwebdesign/tPjem/

Однако, я должен был установите для ширины .main элемент .first, чтобы получить свойство word-break.

Проблема с CSS-рендерингом заключается в том, что вы хотите, чтобы ширина братьев и сестер равнялась неизвестной ширине .first, что невозможно сделать только с помощью CSS.

CSS-рендеринг по существу является однопроходным алгоритмом сверху вниз, что означает, что родительские элементы не могут наследовать значения из дочерних элементов (таблицы имеют многопроходный алгоритм, но в этом случае это не поможет). Это может измениться в будущих версиях CSS, но для этого нам нужно разработать в соответствии с этими ограничениями.

Решение JavaScript/jQuery состоит в том, чтобы получить ширину от .first и применить ее к .main и привязать ее к действию изменения размера окна.

В некоторой степени эта проблема имеет смысл, если .first содержит изображение, которое имеет внутреннюю высоту и ширину. Если бы это было так, было бы целесообразно установить ширину .main на разумное значение, а затем масштабировать изображение в .first, чтобы заполнить ширину блока .main.

Не зная больше о реальном содержании, трудно найти альтернативы.

+0

+1 Спасибо за объяснение :). –

0

Я получил решение !!

HTML

<div class="main"> 
    <div class="first">first</div> 
    <div class="value">valuevalue</div> 
</div> 

CSS

.main { 
    overflow:hidden; 
    width:1px; 
    display:table; 
    background-color: cornflowerblue; 
} 
.first { 
    width: 50px; /* I don't know this width */ 
    height: 50px; /* I don't know this height */ 
    background-color: grey; 
    display: inline-block; 
} 
.value { 
    word-break: break-all; 
} 

Working Fiddle

Related link

Смежные вопросы