Просто удалите width:100%
, и вы лучше поймете:
section {
background: lightgrey;
width: 1000px;
}
div {
background: red;
display: flex;
}
form {
background: blue;
box-sizing: border-box;
}
input {
box-sizing: border-box;
margin: 0.3125em 0 0.625em;
}
<section>
One input field.
<div>
<form action="">
<input type="text">
</form>
</div>
</section>
<section>
Two input fields.
<div>
<form action="">
<input type="text">
<input type="text">
</form>
</div>
</section>
<section>
Three input fields.
<div>
<form action="">
<input type="text">
<input type="text">
<input type="text">
</form>
</div>
</section>
<section>
Four input fields.
<div>
<form action="">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
</form>
</div>
</section>
Входы определяют ширину синей рамки, а затем эта ширина будет ссылкой на width: 100%;
, делая все входные данные равными полной ширинеit.
По существу, процентное значение нуждается в ссылке, поэтому сначала вычисляется ширина синего поля с учетом содержимого, а затем входные данные будут использовать эту ширину в качестве ссылки.
Этоможет также случиться с простыми элементами inline-block
section {
background: lightgrey;
width: 1000px;
}
div {
background: red;
display: inline-block;
}
form {
background: blue;
box-sizing: border-box;
}
input {
box-sizing: border-box;
width:100%;
margin: 0.3125em 0 0.625em;
}
<section>
<div>
<form action="">
<input type="text">
</form>
</div>
</section>
<section>
<div>
<form action="">
<input type="text">
<input type="text">
</form>
</div>
</section>
<section>
<div>
<form action="">
<input type="text">
<input type="text">
<input type="text">
</form>
</div>
</section>
<section>
<div>
<form action="">
<input type="text">
<input type="text">
<input type="text">
<input type="text">
</form>
</div>
</section>
Подробнее о размерах в процентах здесь: https://www.w3.org/TR/css-sizing-3/#percentage-sizing
Вы можете найти явный пример такого поведения:
Например, в следующей разметке:
<article style="width: min-content">
<aside style="width: 50%;">
LOOOOOOOOOOOOOOOOOOOONG
</aside>
</article>
При расчете ширины внешней <article>
внутренняя <aside>
ведет себя как width: auto
, поэтому<article>
устанавливает ширину длинного слова.Так как ширина <article>
не зависела от «реального» макета, тем не менее, она обрабатывается как определенная для разрешения <aside>
, ширина которого равна половине ширины <article>
.
При использовании display: block все работает как положено.
Просто потому, что вычисление ширины элемента блока отличается и не зависит от содержимого в отличие от inline-блочные элементы или гибкие элементы, содержимое которых определяет ширину