Сделать родителей ростом до 100% от абсолютно позиционированного ребенка
Я много гуглил, но не нашел хорошего ответа.
Предположим, что родительский элемент имеет два дочерних элемента: жидкое изображение (ширина: 100% его родительского элемента) и абсолютный элемент div. если я решу наложить div, чтобы полностью соответствовать изображению (конечно, если div не имеет большого количества содержимого, чтобы переопределить границы изображения), я могу. пример:
*{
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.container{
position: relative;
width: 30%;
min-width: 250px;
}
img{
display: block;
width: 100%;
}
.caption{
display: flex;
flex-direction: column;
padding: 20px;
background-color: rgba(0, 0, 150, .2);
position: absolute;
top: 0;
width: 100%;
height: 100%;
}
.caption .caption-text{margin: auto; text-align: center;}
<div class="container">
<img src="https://via.placeholder.com/400x300" alt="">
<div class="caption">
<div class="caption-text">
<h3>Hello World</h3>
<p>Some random text</p>
</div>
</div>
</div>
но в противном случае, если я решу расположить одно и то же плавное изображение абсолютно так, чтобы оно перекрывало элемент div, высоты не встретятся, и это потому
- жидкие изображения являются гибкими, но они в основном меняют размер в зависимости от их соотношения
- изменяемый размер элемента div с текстовым содержимым в зависимости от его родительских размеров
Итак, как я могу сделать так, чтобы рост родителей был равен 100% роста абсолютно позиционированного ребенка img?
Thanx
1 ответ
Это не так, как это работает. position: absolute
удаляется из родительского потока. Что фактически означает: "его родитель ведет себя так, как будто его нет в детстве".
Итак, когда у вас есть два элемента, которые вы хотите перекрыть, вы даете один из них position:absolute
(тот, который должен быть проигнорирован родителем), и вы оставляете контент, который должен иметь размер родителя, невыставленным (или с position
ценность static
или же relative
) (вы оставляете его в потоке, что позволяет ему определять размер родительского элемента).
Смотрите этот ответ для более подробного объяснения.
Если вы хотите изменить размер своего изображения на основе текущего содержания родителя, лучше всего использовать его как background-image
на родителя. background-size
позволяет его размер соответственно cover
, contain
, так далее...):
*{
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.container{
position: relative;
width: 30%;
min-width: 250px;
background: url(https://via.placeholder.com/400x300) no-repeat center /cover;
}
.caption{
display: flex;
flex-direction: column;
padding: 20px;
background-color: rgba(0, 0, 150, .2);
}
.caption .caption-text{margin: auto; text-align: center;}
<div class="container">
<div class="caption">
<div class="caption-text">
<h3>Hello World</h3>
<p>Some random text</p>
</div>
</div>
</div>
Обратите внимание, я удален position:absolute
из содержимого я хочу, чтобы размер родительского (потому что я хочу, чтобы размер родительского).
Очевидно, что вы можете достичь того же, все еще используя <img>
пометить и позиционировать его абсолютным и убедиться, что он отображается под содержимым, но background
изначально был разработан для этой цели, поэтому имеет смысл использовать его.
Вот как это будет выглядеть с <img>
позиционируется абсолют:
а) содержать:
*{
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.container{
position: relative;
width: 30%;
min-width: 250px;
}
.container .positioner {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: -1;
display: flex;
align-items: center;
justify-content: center;
}
.positioner img {
max-width: 100%;
max-height: 100%;
}
.caption{
display: flex;
flex-direction: column;
padding: 20px;
background-color: rgba(0, 0, 150, .2);
}
.caption .caption-text{margin: auto; text-align: center;}
<div class="container">
<div class="positioner">
<img src="https://via.placeholder.com/400x300">
</div>
<div class="caption">
<div class="caption-text">
<h3>Hello World</h3>
<p>Some random text</p>
</div>
</div>
</div>
б) обложка:
*{
box-sizing: border-box;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.container{
position: relative;
width: 30%;
min-width: 250px;
}
.container .positioner {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: -1;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
}
.positioner img {
max-width: 100%;
}
.caption{
display: flex;
flex-direction: column;
padding: 20px;
background-color: rgba(0, 0, 150, .2);
}
.caption .caption-text{margin: auto; text-align: center;}
<div class="container">
<div class="positioner">
<img src="https://via.placeholder.com/400x300">
</div>
<div class="caption">
<div class="caption-text">
<h3>Hello World</h3>
<p>Some random text</p>
</div>
</div>
</div>