Позиция: абсолютная и родительская высота?
У меня есть несколько контейнеров, и их дети только абсолютны/относительно расположены. Как установить высоту контейнера, чтобы их дети были внутри них?
Здесь код:
HTML
<section id="foo">
<header>Foo</header>
<article>
<div class="one"></div>
<div class="two"></div>
</article>
</section>
<div style="clear:both">Clear won't do.</div>
<!-- I want to have a gap between sections here -->
<section id="bar">
<header>bar</header>
<article>
<div class="one"></div><div></div>
<div class="two"></div>
</article>
</section>
CSS
article {
position: relative;
}
.one {
position: absolute;
top: 10px;
left: 10px;
background: red;
width: 30px;
height: 30px;
}
.two {
position: absolute;
top: 10px;
right: 10px;
background: blue;
width: 30px;
height: 30px;
}
Здесь jsfiddle. Я хочу, чтобы текст "бар" отображался между 4 квадратами, а не сзади.
http://jsfiddle.net/Ht9Qy/
Любые простые исправления?
Обратите внимание, что я не знаю высоту этих детей, и я не могу установить height: xxx для контейнеров.
Ответы
Ответ 1
Если я понимаю, что вы пытаетесь сделать правильно, я не думаю, что это возможно с CSS, сохраняя при этом детей абсолютно позиционированными.
Абсолютно позиционированные элементы полностью удаляются из потока документов, и поэтому их размеры не могут изменять размеры их родителей.
Если вам действительно нужно было добиться этого, сохраняя детей как position: absolute
, вы можете сделать это с помощью JavaScript, найдя высоту абсолютно позиционированных детей после их рендеринга и используя это, чтобы установить высоту родительского.
В качестве альтернативы просто используйте float: left
/float:right
и поля, чтобы получить тот же эффект позиционирования, сохраняя при этом детей в потоке документа, затем вы можете использовать overflow: hidden
для родительского (или любого другого метода clearfix), чтобы вызвать его высота расширяется до высоты его детей.
article {
position: relative;
overflow: hidden;
}
.one {
position: relative;
float: left;
margin-top: 10px;
margin-left: 10px;
background: red;
width: 30px;
height: 30px;
}
.two {
position: relative;
float: right;
margin-top: 10px;
margin-right: 10px;
background: blue;
width: 30px;
height: 30px;
}
Ответ 2
Вот мой способ обхода,
В вашем примере вы можете добавить третий элемент
с "одинаковыми стилями" одного и двух элементов, но без абсолютного положения и со скрытой видимостью:
HTML
<article>
<div class="one"></div>
<div class="two"></div>
<div class="three"></div>
</article>
CSS
.three{
height: 30px;
z-index: -1;
visibility: hidden;
}
Ответ 3
Это поздний ответ, но, посмотрев исходный код, я заметил, что когда видео полноэкранный, класс "mejs-container-fullscreen" добавляется в элемент "mejs-container". Таким образом, можно изменить стиль, основанный на этом классе.
.mejs-container.mejs-container-fullscreen {
// This rule applies only to the container when in fullscreen
padding-top: 57%;
}
Кроме того, если вы хотите сделать свою медиа-среду MediaElement с помощью CSS, ниже это отличный трюк Криса Койера: http://css-tricks.com/rundown-of-handling-flexible-media/
Просто добавьте это в свой CSS:
.mejs-container {
width: 100% !important;
height: auto !important;
padding-top: 57%;
}
.mejs-overlay, .mejs-poster {
width: 100% !important;
height: 100% !important;
}
.mejs-mediaelement video {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
width: 100% !important;
height: 100% !important;
}
Надеюсь, это поможет.
Ответ 4
Такую проблему с компоновкой теперь можно решить с помощью flexbox, избегая необходимости знать высоту или компоновку управления с абсолютным позиционированием или с плавающей точкой. Основной вопрос OP состоял в том, как сделать так, чтобы родитель содержал детей неизвестного роста, и они хотели сделать это в рамках определенного макета. Установка высоты родительского контейнера для "fit-content" делает это; использование "display: flex" и "justify-content: space -ween" создает макет раздела/столбца, который, я думаю, ОП пытался создать.
<section id="foo">
<header>Foo</header>
<article>
<div class="main one"></div>
<div class="main two"></div>
</article>
</section>
<div style="clear:both">Clear won't do.</div>
<section id="bar">
<header>bar</header>
<article>
<div class="main one"></div><div></div>
<div class="main two"></div>
</article>
</section>
* { text-align: center; }
article {
height: fit-content ;
display: flex;
justify-content: space-between;
background: whitesmoke;
}
article div {
background: yellow;
margin:20px;
width: 30px;
height: 30px;
}
.one {
background: red;
}
.two {
background: blue;
}
Я изменил операционную скрипку:
http://jsfiddle.net/taL4s9fj/
CSS-трюки на flexbox:https://css-tricks.com/snippets/css/a-guide-to-flexbox/
Ответ 5
Это еще один поздний ответ, но я выяснил довольно простой способ размещения текста "бар" между четырьмя квадратами. Вот изменения, которые я сделал;
В разделе bar я завернул текст "bar" в центре и теги div.
<header><center><div class="bar">bar</div></center></header>
И в разделе CSS я создал класс "bar", который используется в теге div выше. После добавления этого текста штрих-код был центрирован между четырьмя цветными блоками.
.bar{
position: relative;
}