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

Как достичь равных высот divs (расположенных бок о бок) с HTML/CSS?

У меня есть два div внутри контейнера. Один слева, один справа, бок о бок. Как я могу сделать каждый из них одинаковой высоты, даже если они имеют различный контент.

Например, правый div имеет много контента и удваивает высоту левого div, как сделать левое div растягиваться на одну и ту же высоту правого div?

Есть ли какой-нибудь код JavaScript (jQuery) для выполнения этого?

4b9b3361

Ответ 1

Вы можете использовать jQuery, но есть лучшие способы сделать это.

Этот вопрос возникает много, и в целом есть 3 ответа...

1. Использовать CSS

Это лучший способ сделать это, поскольку это самый семантически чистый подход (не прибегая к JS, у которого есть свои проблемы). Лучшим способом является использование display: table-cell и связанных значений. Вы также можете попробовать искусственную фоновую технику (которую вы можете использовать с градиентами CSS3).

2. Использовать таблицы

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

3. Используйте jQuery/JavaScript

Это дает преимущество при использовании самой семантической разметки, кроме как с отключенным JS, вы не получите желаемого эффекта.

Ответ 2

Здесь способ сделать это с помощью чистого CSS, однако, как вы заметите в примере (который работает в IE 7 и Firefox), границы могут быть трудными - но они не невозможны, поэтому все зависит от того, что Вы хотите сделать. Этот пример предполагает довольно общую структуру CSS body > wrapper > контейнер содержимого > столбец 1 и столбец 2.

Ключ - нижнее поле и его отмена.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Equal Height Columns</title>
<style type="text/css">
<!--
* { padding: 0; margin: 0; }
#wrapper { margin: 10px auto; width: 600px; }
#wrapper #main_container { width: 590px; padding: 10px 0px 10px 10px; background: #CCC; overflow: hidden; border-bottom: 10px solid #CCC; }
#wrapper #main_container div { float: left; width: 263px; background: #999; padding: 10px; margin-right: 10px; border: 1px solid #000; margin-bottom: -1000px; padding-bottom: 1000px; }
#wrapper #main_container #right_column { background: #FFF; }
-->
</style>
</head>

<body>
<div id="wrapper">
    <div id="main_container">
        <div id="left_column">
            <p>I have two divs inside of a container. One on the left, one on the right, side by side. How am I able to make each one be of equal height, even though they have different content.</p>
        </div><!-- LEFT COLUMN -->
        <div id="right_column">
          <p>I have two divs inside of a container. One on the left, one on the right, side by side. How am I able to make each one be of equal height, even though they have different content.</p>
          <p>&nbsp;</p>
          <p>For example, the right div has a lot of content, and is double the height of the left div, how do I make the left div stretch to the same height of the right div?</p>
          <p>&nbsp;</p>
          <p>Is there some JavaScript (jQuery) code to accomplish this?</p>
        </div><!-- RIGHT COLUMN -->
    </div><!-- MAIN CONTAINER -->
</div><!-- WRAPPER -->
</body>
</html>

Это выглядит так:

enter image description here

Ответ 3

вы можете заставить его работать с js:

<script>
    $(document).ready(function() {
        var height = Math.max($("#left").height(), $("#right").height());
        $("#left").height(height);
        $("#right").height(height);
    });
</script>

Ответ 4

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

Известные недостатки:

  • Не поддерживает несколько строк элементов в случае контейнера с динамической шириной.
  • Не работает в IE6.

База:

base layout

  • красный - контейнер (вспомогательный), который вы использовали для установки поля для содержимого.
  • зеленый - position: relative; overflow: hidden и (необязательно, если вы хотите, чтобы столбцы были центрированы) text-align: center; font-size: 0; line-height: 0;
  • синий display: block; float: left; или (необязательно, если вы хотите, чтобы столбцы были центрированы) display: inline-block; vertical-align: top;

Пока ничего необычного. Независимо от того, какой контент имеет элемент синий, вам нужно добавить абсолютно позиционированный элемент ( желтый; обратите внимание, что z-index этого элемента должен быть ниже фактического содержимого синий блок) с этим элементом и установите top: 0; bottom: 0; (не устанавливайте левое или правое положение).

base with absolute

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

enter image description here

Для этого вам нужно добавить padding-bottom (темно-зеленый) экв к фиксированному по высоте содержимому в элементы синий.

enter image description here

Затем в желтых элементах создается еще один абсолютно позиционированный элемент (left: 0; bottom: 0;) ( темно-синий).

enter image description here

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

yellow:hover + blue {}

Вот код и демонстрация:

HTML:

<div id="products">
    <ul>
        <li class="product a">
            <a href="">
                <p class="name">Ordinary product description.</p>
                <div class="icon-product"></div>
            </a>
            <p class="name">Ordinary product description.</p>
        </li>
        <li class="product b">
            <a href="">
                <p class="name">That lenghty product description or whatever else that does not allow you have fixed height for these elements.</p>
                <div class="icon-product"></div>
            </a>
            <p class="name">That lenghty product description or whatever else that does not allow you have fixed height for these elements.</p>
        </li>
        <li class="product c">
            <a href="">
                <p class="name">Another ordinary product description.</p>
                <div class="icon-product"></div>
            </a>
            <p class="name">Another ordinary product description.</p>
        </li>
    </ul>
</div>

SCSS/МЕНЬШЕ:

#products { 
    ul { position: relative; overflow: hidden; text-align: center; font-size: 0; line-height: 0;  padding: 0; margin: 0;
        li { display: inline-block; vertical-align: top; width: 130px; padding: 0 0 130px 0; margin: 0; }
    }

    li {
        a { display: block; position: absolute; width: 130px; background: rgba(255,0,0,.5); z-index: 3; top: 0; bottom: 0;
            .icon-product { background: #ccc; width: 90px; height: 90px; position: absolute; left: 20px; bottom: 20px; }
            .name { opacity: 1; }
        }

        .name { position: relative; margin: 20px 10px 0; font-size: 14px; line-height: 18px; opacity: 0; }

        a:hover {
            background: #ddd; text-decoration: none;

            .icon-product { background: #333; }
        }
    }
}

Обратите внимание, что демо использует обходное решение, которое включает дублирование данных для исправления z-index. В качестве альтернативы вы можете использовать pointer-events: none и любое решение для IE.

Ответ 5

здесь очень простое решение с коротким дисплеем css: table

<div id="main" class="_dt-no-rows">
  <div id="aside" contenteditable="true">
    Aside
    <br>
    Here the aside content
  </div>
  <div id="content" contenteditable="true">
    Content
    <br>
    geht pellentesque wurscht elementum semper tellus s'guelt Pfourtz !. gal hopla
    <br>
    TIP : Just clic on this block to add/remove some text
  </div>
</div>

здесь css

#main {
 display: table;
 width: 100%;
}
#aside, #content {
  display: table-cell;
  padding: 5px;
}
#aside {
  background: none repeat scroll 0 0 #333333;
  width: 250px;
}
#content {
background: none repeat scroll 0 0 #E69B00;
}

выглядит так:

enter image description here

Ответ 6

Ну, я не делаю тонну jQuery, но в мире CSS/Javascript я бы просто использовал объектную модель и написал инструкцию следующим образом:

if(leftDiv.style.height > rightDive.style.height)
   rightDiv.style.height = leftDiv.style.height;
else
   leftDiv.style.height = rightDiv.style.height)

Ответ 7

Также есть плагин jQuery под названием equalHeights, который я использовал с некоторым успехом.

Я не уверен, что тот, который я использую, это тот, который указан выше, или если он тот, который был первым google result... В любом случае плагин jquery, вероятно, является самым простым и гибким способом.

Ответ 8

Используйте это в функции готовности jquery. Учитывая, что есть два div с идентификаторами "left" и "right".

var heightR = $("#right").height();
var heightL = $("#left").height();

if(heightL > heightR){
    $("#right").css({ height: heightL});
} else {
    $("#left").css({ height: heightR});
}

Ответ 9

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

var rightHeight = document.getElementById('right').clientHeight;
var leftHeight = document.getElementById('left').clientHeight;
if (leftHeight > rightHeight) {
document.getElementById('right').style.height=leftHeight+'px';
} else {
document.getElementById('left').style.height=rightHeight+'px';
}

С "left" и "right", являющимся идентификатором двух тегов div.

Ответ 10

Это то, что я использую в простом javascript:

Кажется длинным, но очень несложным!

function equalizeHeights(elements){
    //elements as array of elements (obtain like this: [document.getElementById("domElementId"),document.getElementById("anotherDomElementId")]

    var heights = [];
    for (var i=0;i<elements.length;i++){
        heights.push(getElementHeight(elements[i],true));
    }

    var maxHeight =  heights[biggestElementIndex(heights)];

    for (var i=0;i<elements.length;i++){
        setElementHeight(elements[i],maxHeight,true);
    }
}

function getElementHeight(element, isTotalHeight){
    // isTotalHeight triggers offsetHeight
    //The offsetHeight property is similar to the clientHeight property, but it returns the height including the padding, scrollBar and the border.
    //http://stackoverflow.com/questions/15615552/get-div-height-with-plain-javascript
    {
        isTotalHeight = typeof isTotalHeight !== 'undefined' ? isTotalHeight : true;
    }

    if (isTotalHeight){
        return  element.offsetHeight;
    }else{
        return element.clientHeight;
    }
}

 function setElementHeight(element,pixelHeight, setAsMinimumHeight){

    //setAsMinimumHeight: is set, we define the minimum height, so it can still become higher if things change...
    {
        setAsMinimumHeight = typeof setAsMinimumHeight !== 'undefined' ? setAsMinimumHeight : false;
    }
    var heightStr = "" + pixelHeight + "px";
    if (setAsMinimumHeight){
        element.style.minHeight = heightStr; // pixels
    }else{
        element.style.height = heightStr; // pixels
    }
}

 function biggestElementIndex(arr){
    //http://stackoverflow.com/questions/11301438/return-index-of-greatest-value-in-an-array
    var max = arr[0];
    var maxIndex = 0;

    for (var i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            maxIndex = i;
            max = arr[i];
        }
    }
    return maxIndex;
}

Ответ 11

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

https://jsfiddle.net/0hdtLfy5/3/

function make_children_same_height(element_parent, child_elements) {
    for (i = 0; i < child_elements.length; i++) {
    var tallest = 0;
    var an_element = child_elements[i];
    $(element_parent).children(an_element).each(function() {
      // using outer height since that includes the border and padding
      if(tallest < $(this).outerHeight() ){
        tallest = $(this).outerHeight();
      }
    });

    tallest = tallest+1; // some weird shit going on with half a pixel or something in FF and IE9, no time to figure out now, sowwy, hence adding 1 px
    $(element_parent).children(an_element).each(function() {
        $(this).css('min-height',tallest+'px');
    });
  }
}