Подтвердить что ты не робот

HTML/CSS set div для высоты родного брата

У меня есть 2 div, содержащихся в третьем. Один из содержащихся div перемещается слева, другой - справа. Я бы хотел, чтобы 2 div div div всегда были на одном уровне, но у меня проблема с этим. Пока я просматриваю только страницу в Firefox и полагаю, что буду беспокоиться о проблемах с несколькими браузерами после того, как я заработаю хотя бы один браузер.

Вот разметка:

<div id="main-container" class="border clearfix">
    <div id="left-div" class="border">
        ...
    </div>
    <div id="right-div" class="border">
        ...
    </div>
</div>

Вот CSS:

#main-container     { position: relative;                             min-height: 500px; }
    #left-div       { position: relative; float: left;  width: 700px; min-height: inherit; }
    #right-div      { position: relative; float: right; width: 248px; min-height: inherit; height: inherit; }

.clearfix:after     { content: " "; display: block; height: 0; clear: both; visibility: hidden; }
.clearfix           { display: inline-block; _height: 1%; clear: both; }
.clearfix           { display: block; clear: both; }
.border             { border: solid 1px #000; }

Если содержимое в #left-div больше, чем 500px, #right-div не расширяется, чтобы соответствовать. В примере, который я попробовал, Firefox сказал, что вычисленная высота стиля #main-container была 804px, высота вычисленного стиля #left-div была 800px, а высота высотой вычисленного стиля #right-div была 586.2px, поскольку он расширился, чтобы соответствовать его собственному контенту.

Я понимаю, что я ошибаюсь, и если это повторяющиеся вопросы, я извиняюсь, но я не был уверен, что искать.

4b9b3361

Ответ 1

Я могу взломать все мои мозги, но я думаю, что это действительно можно решить только с использованием поведения таблицы, то есть с помощью <table> (если вам нужно IE6 и IE7 совместимы) или display: table / table-row / table-cell (что фактически то же самое, но не смущает вас перед вашими сверстниками, потому что таблицы являются злыми.;).

Я бы пошел за столом.

Не стесняйтесь доказывать, что я ошибаюсь и отправляю разумное решение CSS, я был бы в восторге!

Ответ 2

Если вы знаете, какой из внутренних div вы хотите установить высоту макета страницы, вы можете сделать что-то вроде этого: http://codepen.io/anon/pen/vOEepW

<div class="container">
  <div class="secondary-content">
    <div class="content-inner">
    </div>
  </div>
  <div class="main-content">
  </div>
</div>

Установка содержащего div в позицию: относительная, а затем установка одного из внутренних divs в положение абсолютного позволяет другому, "не-стилизованному" div эффективно управлять высотой обоих.

.container {
  position: relative;
}
.main-content {
  width: 80%;
  margin-left: 20%;
  height: 300px;
  background-color: red;
}
.secondary-content {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  width: 20%;
  overflow-y: scroll;
}

Также возможно сделать это и, возможно, проще использовать flexbox, но у него есть некоторые проблемы с поддержкой браузера.

Ответ 3

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

  • Вы хотите, чтобы фон был того же размера?
  • Средняя граница должна быть одинаковой высоты?
  • Или есть какой-то контент внизу, который должен отображаться в строке с нижней частью другого div?

1) Если вы хотите, чтобы фон был того же размера, я советую вам стиль CSS родительского div, а в худшем - отредактировать фоновое изображение, чтобы оно соответствовало. С CSS2 вы можете легко позиционировать фон

{
background-image:url('smiley.gif');
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center;
} 

2) Всякий раз, когда я натыкаюсь на вашу проблему, мне нужна центральная граница, чтобы она была одинаковой высоты. Решение легко применить стиль границы к DIV, который будет самым длинным.

3) Объедините оба контента с третьим дочерним DIV, если вы не можете, тогда вам понадобится JavaScript. Или, как сказал Пекка, используйте display: table, если вам неинтересно IE.

Ответ 4

Я думаю, у вас есть следующие варианты:

  • faux columns - использование повторяющегося фонового изображения для контейнера div для создания внешнего вида равной высоты
  • с использованием таблицы
  • с помощью javascript для регулировки высоты div
  • с помощью javascript для добавления поддержки css в несовместимые браузеры

Ответ 5

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <title>Matching Size Divs</title>
 <meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />
 <style>
    #main-container { position:relative; min-height:500px; }    
    #left-div { width:700px; min-height:500px; }      
    #right-div { position:absolute; margin-left:700px; width:248px; top:0px; bottom:0px; }    
 </style>
</head>
<body>
    <div id="main-container" class="border clearfix"> 
    <div id="left-div" class="border"> 
        ...
    </div> 
    <div id="right-div" class="border"> 
        ... 
    </div> 
</div>
</body>
</html>

Ответ 6

Чтобы сделать это с помощью HTML и CSS с помощью div, вам нужно будет использовать JavaScript для проверки их высоты, а затем изменить его для соответствия.

Если вы не хотите использовать JavaScript, а ваш сайт имеет определенный дизайн, в вашем третьем div вы можете дать ему фоновое изображение повтора, которое будет расширяться, как это делает один из двух div. Например, скажем, у ваших двух div есть синий фон, а ваш третий содержащий div имеет серый фон. Удалите синий фон и создайте изображение, которое повторяется с помощью синего и серого, и поместите это изображение для третьего div. Таким образом, по мере того как он будет расширяться, появится два divs.

Ответ 7

Я думаю, что это можно реализовать, указав высоту div s (то есть left-div и right-div) на 100%. Таким образом, они будут занимать высоту контейнера div, и если для контейнера div не указана высота html/css, то контейнер div также расширяется для размещения его дочерних элементов. Я знаю его довольно поздно, но он может просто спасти вас от script.

Ответ 8

Они будут складываться, если места недостаточно. Удостоверьтесь, что div, содержащий оба, достаточно широк, чтобы иметь их обоих... если вы удалите их ширину для тестирования, я уверен, что это сработает.

Ответ 9

Я наткнулся на эту проблему несколько раз на этой неделе, и эта тема была самой близкой, я пришел к поиску конкретного ответа. Это расширение на ответ @Pekka для тех, кому нужно немного больше, чтобы продолжить, я, конечно, сделал.

jsFiddle

пример html:

<div class="view-table">
    <div class="view-row">
        <div class="view-type">Type</div>
        <div class="view-name">
            Lorem ipsum dolor sit amet, at assum gubergren his, 
            ex iudicabit dissentiunt intellegebat has. Ne odio detraxit
            instructior vim. Fugit velit consetetur an eos. 
            Ea suas veri mnesarchum mel.
        </div>                
    </div>
</div>

пример css:

.view-table
{
    display:table;
    width:100%;
}
.view-row
{
    display:table-row;
}
.view-row > div
{
    display: table-cell;

}
.view-name 
{
    text-align:right;
    background-color: lightblue;
}
.view-type
{
    background-color: pink;
}

Ответ 10

Это немного выходит за рамки, но у меня неприятное решение Javascript.

HTML:

<div id="element-without-height" copy-size="#element-with-height"></div>
<div id="element-with-height"></div>

Javascript (с помощью jQuery):

$(document).ready(function() {
    $(window).on('resize', function() {
        $('[copy-size]').each(function() {
            var copyEl = $($(this).attr('copy-size'));
            var targetEl = $(this);
            targetEl.width(copyEl.width() + 'px');
            targetEl.height(copyEl.height() + 'px');
        });
    });
});