Как сказал @Talmid в своем ответе, мы сталкиваемся со сложным вычислением, и использование width:0
и width:0%
не одно и то же.
Первое - это абсолютное значение (длина), которое браузер может разрешить без какой-либо ссылки, но второе - это процентное значение, относительное к ширине содержащего блока, поэтому браузер долженсначала узнать ширину содержащего блока, чтобы разрешить его. (он не будет пытаться сделать вывод, что 0%
будет таким же, как 0
)
Эта проблема будет происходить со всеми элементами, где у нас есть сокращение-to-fit поведение (float, inline-block и т. д.)
Вот еще примеры:
img {
width: 30%;
}
span {
border: 1px solid;
display: inline-block;
}
<span>
<img src="https://www.kilobaitas.lt/Images/design/KilobaitasLogo2.gif">
</span>
<span style="float:left;">
<img src="https://www.kilobaitas.lt/Images/design/KilobaitasLogo2.gif">
</span>
Это также может происходить с элементами без изображения:
span {
display:inline-block;
border:1px solid red;
}
<div style="float:left;border: 1px solid;">
<span >some text</span>
</div>
<div style="float:left;border: 1px solid;clear:left;">
<span style="width:30%;">some text</span>
</div>
<div style="float:left;border: 1px solid;clear:left;">
<span style="width:0%;">some text</span>
</div>
По сути, браузер сначала определяет размер содержащего блока (на этом шаге мы не учитываем процентное значение, определенное в свойстве width объектадочерний элемент).Логически размер содержащего блока будет определяться его содержимым (поведение сжатия к размеру).После этого мы можем разрешить процентное значение на основе ширины, рассчитанной ранее, таким образом, дочерний элемент будет сжиматься.
Конечно, мы не вернемся, чтобы снова вычислить ширину содержащего блока, поскольку у нас будет бесконечный цикл (цикл).
В случае, если дочерний элемент использует не-процентное значение (длина), браузер сначала учитывает его при определении ширины содержащего блока, поскольку это не относительное значение, а абсолютное:
span {
display:inline-block;
border:1px solid red;
}
<div style="float:left;border: 1px solid;">
<span >some text</span>
</div>
<div style="float:left;border: 1px solid;clear:left;">
<span style="width:30px;">some text</span>
</div>
<div style="float:left;border: 1px solid;clear:left;">
<span style="width:0;">some text</span>
</div>