Сделать родителей ростом до 100% от абсолютно позиционированного ребенка - PullRequest
0 голосов
/ 26 января 2019

Я много гуглил, но не нашел хорошего ответа.

Предположим, у родительского элемента есть два дочерних элемента: жидкое изображение (ширина: 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 Ответ

0 голосов
/ 26 января 2019

Это не так, как это работает.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>:

a) содержит:

*{
  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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...