Чтобы прояснить проблему, вот минимальный код, иллюстрирующий разницу:
.parent {
position: relative;
background-color: chocolate;
}
.child {
position: absolute;
background-color: darkgreen;
left: 50%;
}
<a href="" class="parent">
I am a Parent
<div class="child">
I am a child
</div>
</a>
<br><br><br><br><br>
<a href="" class="parent">
<div>I am a Parent</div>
<div class="child">
I am a child
</div>
</a>
Обратите внимание, как в первом случае у вас есть текстовое содержимое внутри встроенного элемента, поэтому ширина вашего элемента используется в качестве ссылки для свойства left. Во втором случае у вас есть блочный элемент внутри встроенного элемента, и этот теперь имеет ширину, равную 0
(без окраски фона), и это то, с чем вы столкнулись в своем первом коде. left:X%
из 0
равно 0
, поэтому ничего не произойдет.
То, что вы делаете, конечно, верно, но наличие блочного элемента внутри встроенного элемента сделает рендеринг немного сложным. Из спецификации вы можете прочитать:
Когда встроенный блок содержит блок уровня входящего потока, встроенный блок (и его встроенные предки в том же строчном блоке) разбиты вокруг блока уровня блока (и любых братьев и сестер уровня блока, которые являются последовательными или разделенными только сжимаемыми пробелами и / или элементами вне потока), s разбивает встроенный блок на два поля (даже если одна из сторон пуста), по одному на каждой стороне блока (ов) уровня блока. Строчные блоки перед разрывом и после разрыва заключаются в анонимные блоки блоков, а блок уровня блока становится родственником этих анонимных блоков. Когда на такой встроенный блок влияет относительное позиционирование, любой результирующий перевод также влияет на блок уровня блока, содержащийся во встроенном блоке.
Да, непросто понять, но давайте возьмем наш пример и добавим еще CSS чтобы лучше видеть:
.parent {
position: relative;
background-color: chocolate;
border:2px solid red;
}
some text before<br>
<a href="" class="parent">
<div>I am a Parent</div>
</a>
<br> some text after
Вы можете увидеть, как блочный элемент разбил наш встроенный элемент на два куска , которые пусты.
Чтобы избежать Имея дело с этим, избегайте наличия блочного элемента внутри встроенных элементов. Используйте inline-block
, чтобы исправить эту проблему:
.parent {
position: relative;
background-color: chocolate;
border:2px solid red;
display:inline-block;
}
some text before<br>
<a href="" class="parent">
<div>I am a Parent</div>
</a>
<br>
some text after