Как сделать высоту div, чтобы заполнить доступное пространство - PullRequest
10 голосов
/ 26 мая 2011

У меня есть 3 колонки с некоторыми деталями под колонками.

enter image description here

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

Можно ли это сделать с помощью HTML / CSS или мне нужно использовать какой-то JavaScript?


HTML-код (соответствующая его часть):

<div id="content">

    <div id="iconsHolder">

        <div id="info">
            <div id="info_content">
                <p><?php echo img('images/man.png'); ?></p>
                <h2>Some guy over here</h2>
                <p class="light justify">It doesn't matter what is being said at the moment. Nothing is said here.</p>
            </div>
        </div>

        <div id="comp">
            <div id="comp_content">
                <p><?php echo img('images/computer.png'); ?></p>
                <h2>Computer Development</h2>
                <p class="light justify">Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...</p>
            </div>
        </div>

        <div id="story">
            <div id="story_content">
                <p><?php echo img('images/library.png'); ?></p>
                <h2>Story telling</h2>
                <p class="light justify">This is another short story.</p>
            </div>
        </div>
    </div>
    <div id="details">
        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    </div>

</div>

CSS-код (соответствующая его часть):

#content {
    width: 60em;
    margin: 0px auto;
}

#info,#comp,#story {
    width: 18em;
    float: left;
    padding-left: 1em;
    padding-right: 1em;
    padding-top: 2em;
    background-color: #DDD;
    height: 100%;
}

#info_content,#comp_content,#story_content {
    text-align: center;
}

#details {
    clear: both;
    background-color: #EEF;
    padding: 1em;
}

Ответы [ 8 ]

7 голосов
/ 26 мая 2011

Решение CSS состоит в том, чтобы стилизовать внешний контейнер с цветом фона, это называется поддельным (искусственным) bakcground.

Как это:

#iconsHolder {
    background-color: #DDD;
}

Этот метод (по крайней мере, в этом случае) гарантирует, что фон будет одинаковым для всех.

3 голосов
/ 26 мая 2011

Вместо того, чтобы плавать делители, вы можете расположить их в пределах div#iconsHolder (что вы будете делать position:relative. В любом случае вы устанавливаете ширину, просто установите слева от каждого деления соответствующее смещение и укажите каждому top:0и bottom:0 правила CSS.

1 голос
/ 29 апреля 2013

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

<table id="content" cellspacing="0">
<tr id="row">
<div id="iconsHolder">

    <td id="info">
        <div id="info_content">
            <p><?php echo img('images/man.png'); ?></p>
            <h2>Some guy over here</h2>
            <p class="light justify">It doesn't matter what is being said at the moment. Nothing is said here.</p>
        </div>
    </td>

    <td id="comp">
        <div id="comp_content">
            <p><?php echo img('images/computer.png'); ?></p>
            <h2>Computer Development</h2>
            <p class="light justify">Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...</p>
        </div>
    </td>

    <td id="story">
        <div id="story_content">
            <p><?php echo img('images/library.png'); ?></p>
            <h2>Story telling</h2>
            <p class="light justify">This is another short story.</p>
        </div>
    </td>
</div>
</tr>
    <tr id="bottom">
<td id="details" colspan="3">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
</td>
    </tr>
</table>

Затем вам нужно удалить float:left; из строки 8 вашего CSS и вставить этот код внизу.

tr#row td {
    width: 30%;
    background-color: #DDD;
    vertical-align: top;
}
0 голосов
/ 27 мая 2011

Как вы сказали, проблема с использованием искусственного фона с вашим #iconHolder заключается в выделении каждого столбца при наведении курсора.

Итак, вот что я предлагаю:

1) сделать отдельные искусственные столбцы абсолютно расположенными в том же месте, что и исходный столбец

Вы будете использовать свойство z-index, чтобы обеспечить верхнюю часть содержимого

HTML

<div id="col1"></div>
<div id="col2"></div>
<div id="col3"></div>

<div id="faux1"></div>
<div id="faux2"></div>
<div id="faux3"></div>

CSS

#iconHolder {
    position: relative;
}

#col1, #col2, #col3 {
    position: relative
    z-index: 100;
}

#faux1, #faux2, #faux3 {
    position: absolute;
    top: 0;
    bottom: 0;
    background-color: #DDD /* don't add a background to your real columns, just your faux */
    z-index: 50;
}

#faux2 {
    left: 20em;
}

#faux3 {
    left: 40em;
}

2) прикрепить события onmouseover / onclick к столбцу faux И к обычному столбцу

function highlight() {
     faux.style.backgroundColor = "yellow"
}

function whatever() {
    //your code here
}

column.onmousover = highlight
faux.onmouseover = highlight
column.onclick = whatever
faux.onclick = whatever

Если вам нужно больше подробностей о javascript, просто спросите, я просто не имею никакого представления о эквиваленте jQuery.

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

0 голосов
/ 27 мая 2011

Можно ли это сделать с помощью HTML / CSS или мне нужно использовать какой-нибудь JavaScript?

.. это можно сделать с помощью чистого CSS, используя display: table-cell .. но естьнет поддержки iE7 и ниже: (

Вот решение, использующее оба метода (jQuery * и CSS), jQuery, конечно, сделает то же самое для других браузеров, но это решение означает, что большинство пользователей получатчистое решение CSS с IE7 и ниже, нуждающееся в jQuery для «улучшения»

, если вы хотите использовать решение jQuery для всех браузеров, тогда вам не понадобятся свойства отображения table-cell или table-row ипотребуется удалить хак !ie7 из свойства float - поплавки также должны содержаться кросс-браузерно, чтобы вы могли добавить overflow: hidden в #iconsHolder div - и просто оставить zoom: 1; на месте, если вам нужноэто работает в IE6;)

CSS:

#content {
    width: 60em;
    margin: 0px auto;
}

#iconsHolder { 
    display: table-row; /* good browsers - IE7 and below ignore this */
    zoom: 1; /* for IE to contain the floats so the jQuery can get a height from it */
    /* overflow: hidden; would be needed here if jQuery solution is preferrred */
}

#info,#comp,#story {
    width: 18em;
    padding-left: 1em;
    padding-right: 1em;
    padding-top: 2em;
    background-color: #DDD;
    display: table-cell;
    float: left !ie7; /* IE7 and below hacked value - remove the !ie7 part to expose this to all browsers */ 
}

#info_content,#comp_content,#story_content {
    text-align: center;
}

#details {
    clear: both;
    background-color: #EEF;
    padding: 1em;
}

HTML:

<div id="content">
 <div id="iconsHolder">
  <div id="info">
    <div id="info_content">
     <p><img src="http://placekitten.com/100/100/" alt=""></p>
     <h2>Some guy over here</h2>
     <p class="light justify">It doesn't matter what is being said at the moment. Nothing is said here.</p>
    </div>
   </div>
   <div id="comp">
    <div id="comp_content">
     <p><img src="http://placekitten.com/100/100/" alt=""></p>
     <h2>Computer Development</h2>
     <p class="light justify">Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit... Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...</p>
    </div>
   </div>
   <div id="story">
    <div id="story_content">
     <p><img src="http://placekitten.com/100/100/" alt=""></p>
     <h2>Story telling</h2>
     <p class="light justify">This is another short story.</p>
    </div>
  </div>
 </div>

  <div id="details">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
</div>

jQuery: (внутри условного комментария, поэтому только IE7 и ниже sэ-э))

<!--[if lte IE 7]>
<script type="text/javascript">
$(document).ready(function() {

    var divHeight = $("#iconsHolder").outerHeight();          
    $("#iconsHolder > div").css("height", divHeight);

});
</script>
<![endif]-->

Добавлено: JSfiddle

Примечание: на скрипке не добавлен jQuery, так как я не знаю, как это вставитьусловный комментарий к скрипке)


  • Я прошу прощения, если вы предпочитаете чистое решение javascript, я не могу этого сделать - но я уверен, что если выхочу, чтобы кто-то мог добавить чистый JS к моему ответу для вас!
0 голосов
/ 26 мая 2011

В настоящее время ваши столбцы охватывают весь текст.Если я правильно понял ваш вопрос, вы бы хотели, чтобы цвет фона / изображения столбцов выходил за пределы доступных данных.Если это то, что вы хотите, то вам нужно создать поддельные столбцы (Faux Columns), так как ваши данные в этих столбцах не охватывают всю высоту.

Я думаю, что самый простой способ - применить повторяющееся фоновое изображение к элементу, который охватывает всю высоту вашего слоя.Это может быть какая-то оболочка, которая закрывает ваши столбцы.В вашем случае вы можете применить тонкое изображение, которое разделено на три цветных полосы (по 18 мкм каждая и каждая сопоставлена ​​для покрытия определенного столбца) для элементов info, comp и story.Это изображение будет иметь ширину 60 мкм и будет повторяться по оси y, например:

#content 
{
background: #ccc url(fake-columns.gif) repeat-y left top;
}

Это предполагает, что изображение находится в той же папке, что и файл css (не рекомендуется, images / fake-columns.gifлучше, чтобы на изображение ссылались из папки изображений).Repeat-y будет повторять крошечное изображение вниз, покрывая всю высоту, которую покрывает div содержимого.Левый верхний угол гарантирует, что изображение начнет мозаично отображаться в левом верхнем углу, что вы обычно и хотите делать!Символ фунта перед содержимым, похоже, исчезает из моего примера css выше.

0 голосов
/ 26 мая 2011

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

Вы можете добавить float:left к контейнеру, как ответ Ричарда или Если вы не хотите, чтобы контейнер плавал, вы можете добавить пустой «чистый» div после этого.Это менее семантически правильно, но если вы не можете или не хотите, чтобы контейнер перемещался, это еще один вариант.

JsFiddle: http://jsfiddle.net/gvJrJ/4/

0 голосов
/ 26 мая 2011

Довольно простое решение - сделать иконку контейнера div в качестве фона, например:

#iconsHolder { background-color: #DDD; float:left;}

Добавьте это к вашему CSS, и оно должно работать во всех браузерах.

...