Сделайте верхний div таким же широким, как div ниже него

Смотрите это: http://jsfiddle.net/90d7144p/

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

Это

enter image description here

должен быть

enter image description here

CSS

* { margin: 2px; }

.container { width: 100%; border: 1px solid black; }

.box { display: inline-block; width:100px; height:100px; border: 1px solid red; }

.rect { border: 1px solid green; }

HTML:

<div class="container">
    <div class="rect">The width must be as long as underlying boxes.</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div>
</div>

Есть ли решение на основе CSS или HTML?

Ответы

Ответ 1

Вот решение, основанное на моем комментарии выше, оно использует медиа-запросы:

Так как ящики имеют фиксированную ширину, можно заранее определить, сколько ящиков соответствует одной строке, если экран имеет ширину [x0, x1]. Вы можете передать эту информацию в CSS-запросы для создания нескольких правил, каждый из которых определяет ширину поля для заданного диапазона ширины. Вот пример (сгенерированный с использованием excel):

                                        .rect { width: 100px; }
@media screen and (min-width:  214px) { .rect { width: 206px; } }
@media screen and (min-width:  320px) { .rect { width: 312px; } }
@media screen and (min-width:  426px) { .rect { width: 418px; } }
@media screen and (min-width:  532px) { .rect { width: 524px; } }
@media screen and (min-width:  638px) { .rect { width: 630px; } }
@media screen and (min-width:  744px) { .rect { width: 736px; } }
@media screen and (min-width:  850px) { .rect { width: 842px; } }
@media screen and (min-width:  956px) { .rect { width: 948px; } }

Код, Демо

Примечания:

  • Я использовал кратные 106px (100px + 2px border + 4px margin).
  • min-width - ширина экрана, а не ширина контейнера. 2px добавлены для компенсации черной границы.
  • Ширины прямоугольника начинаются с 100, а не с 106, так как они уже имеют границу 2px и 4px.
  • Порядок правил @media имеет значение (минимальная ширина увеличивается).
  • Ширина "пространства" (например, между двумя встроенными блоками) зависит от различных факторов, включая семейство шрифтов и размер; Я размещал ящики так, чтобы они становились блочными элементами и пробелы не учитывались.

Ответ 2

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

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

Следующая демо нуждается в настройке, но она должна показать вам, о чем я говорю:

DEMO (измените размер окна результатов выше 650px в ширину, чтобы увидеть его работу)

Пример CSS:

@media screen and (min-width: 742px) and (max-width: 847px){
    .rect {
        width: 736px;
    }
}

Ответ 3

Здесь решение позволяет оптимизировать это дальше.

Вы можете изменить свою разметку следующим образом. (добавлен .stretch div)

    ...
    <div class="box">BOX</div>
    <div class="box">BOX</div>
    <div class="stretch"></div>
</div>

И CSS,

.stretch {
    height: 0;
    font-size: 0;
    width: 100%;
    display: inline-block;
}

.container {
    width: 100%;
    border: 1px solid black;
    text-align: justify;
    padding: 2px;
}

* {
    margin: 2px 0;
}

Таким образом, BOX es будет выравниваться, чтобы занять полную ширину родителя.

Однако последняя строка не будет иметь промежутка между ними.

Ответ 4

<style>
 .container { width: 50%; border: 1px solid black; }
.box-container
   {
    width: 640px;
   }
.box { display: inline-block;width:100px; height:100px; border: 1px solid red;;}

.rect { border: 1px solid green;
width: 630px;}

</style>
<div class="container">
    <div class="rect">The width must be as long as underlying boxes.</div>
   <div class="box-container">
    <div class="box">BOX</div>
    <div class="box">BOX</div>
    <div class="box">BOX</div> 
    <div class="box">BOX</div>
    <div class="box">BOX</div> 
    <div class="box">BOX</div>
    <div class="box">BOX</div> 
    <div class="box">BOX</div>
    <div class="box">BOX</div>
    <div class="box">BOX</div>
    <div class="box">BOX</div> 
    <div class="box">BOX</div>
    <div class="box">BOX</div> 
    <div class="box">BOX</div>
    <div class="box">BOX</div>
    <div class="box">BOX</div>
    <div class="box">BOX</div> 
    <div class="box">BOX</div>
    <div class="box">BOX</div> 
    <div class="box">BOX</div>
    <div class="box">BOX</div>
</div> 
  </div>

Ответ 5

IF и только если вы хотите сделать это просто с помощью JQuery, то следующий код для вашего запроса.

<html>
<head>
<style>
* { margin: 2px; }

.container { width: 100%; border: 1px solid black; }

.box { display: inline-block; width:100px; height:100px; border: 1px solid red; }

.rect { border: 1px solid green; }
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>

$(document).ready(function(){
  resize();
  $(window).resize(function(){
    resize();   
  });
  function resize()
  {
    var max = 0, $element;
        $('.box').each(function()
        {
            if($(this).offset().left > max)
            {
                max = $(this).offset().left;
                $element = $(this);
            }
        });

        $(".rect").css("width",max+90);
  }
});
</script>
</head>
<body>
<div class="container">
    <div class="rect">The width must be as long as underlying boxes.</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div> <div class="box">BOX</div>
    <div class="box">BOX</div>
</div>
</body>
</html>