CSS - позиция: абсолютная; - автоматическая высота

У меня проблема с некоторыми div

        

Внешний div имеет минимальную высоту, но внутренние divs - все разные высоты. Поскольку внутренние divs являются абсолютными, они не влияют на внешнюю высоту divs. Есть ли способ заставить эти внутренние divs влиять на высоту внешнего div?

Причина, по которой я стилю эти divs с положением: абсолютное - это то, что все они начинаются в верхней части контейнера div.

Ответ 1

Насколько я знаю, нет никакого способа, чтобы абсолютно позиционированные дочерние элементы влияли на высоту их статически или относительно позиционированных родительских элементов, используя только CSS. Или:

  • Реорганизовать так, чтобы дочерние элементы оставались в потоке документа.
  • Используйте JavaScript при загрузке страницы, чтобы установить высоту родителя на высоту самого большого дочернего элемента

Эта проблема распространена в слайдах слайдов в режиме fade-in/fade-out и из того, что я видел либо: 1) нужно определить высоту родительского контейнера или 2) высота родительского контейнера устанавливается динамически для каждого слайдов.

Ответ 2

Недавно я столкнулся с этой проблемой при слайд-шоу перехода в/в CSS и решил решить его, предоставив первый дочерний элемент position: relative;, а остальные position: absolute; top:0; left: 0;, который гарантирует, что высота контейнеров совпадает с высотой первого элемента. Поскольку мое слайд-шоу перехода CSS использует свойство непрозрачности, размеры контейнера никогда не меняются во время слайд-шоу.

Увы, поскольку мне также нужно было предоставить резерв javascript для старых браузеров, мне все равно пришлось устанавливать высоту контейнера для этих браузеров (из-за jQuerys fadeIn/fadeOut на самом деле установка display: none;, я бы догадался).

Ответ 3

Я думаю, что вы должны позиционировать их относительно и просто изменить "вертикальное выравнивание" на "верх" в внутренних div. Тогда у вас не будет проблемы с приемом абс div.

Ответ 4

Вы можете просто плавать divs, если хотите, чтобы они находились на одной горизонтальной плоскости.

Ответ 5

Вот вам давно назревшее кросс-браузерное решение вашей проблемы. Больше не статично width, не более em hack.

<style>
  /* clearfix */
  .container:after {
    content: '';
    display: table;
    clear: left;
  }

  .page {
    float: left; /* display side-by-side */
    width: 100%; /* be as wide as parent */
    margin-right: -100%; /* take up no width */
  }
</style>

<div class="container">
  <div class="page"></div>
  <div class="page"></div>
</div>

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

Вот демо: https://jsfiddle.net/eqe2muhv/

Это также работает для встроенных блоков, конечно. Хотя вам может потребоваться установить font-size или letter-spacing контейнера в 0. Я бы также рекомендовал использовать vertical-align: top в .page, чтобы имитировать регулярный элемент блока.

Вот демо: https://jsfiddle.net/dzouxurs/8/

Ответ 6

Проверьте display: inline-block на элементе, который нуждается в автоматической высоте.