CSS, когда линейный разрыв элементов строки, родительская оболочка не соответствует новой ширине

Как вы получаете элемент inline-block для соответствия его ширине содержимого, если линия содержимого прерывается из-за ширины экрана?

<!-- parent inline-block -->
<div style='display: inline-block;'>
    <div style='display: inline-block; width:200px;'></div>
    <!--
        If this child line breaks, 
        two 200px wide blocks are stacked vertically.
        That should make the parent width 200px,
        but the parent stays much wider than that
    -->
    <div style='display: inline-block; width:200px;'></div>
</div>

Я не могу придумать, как сформулировать вопрос так, чтобы он звучал легко, но я собрал простой JSFiddle, иллюстрирующий.

#wide {
  position: relative;
  width: 100%;
  border: 1px solid black;
  padding: 5px;
}
#narrow {
  position: relative;
  width: 175px;
  border: 1px solid black;
  padding: 5px;
}
.wrap {
  display: inline-block;
  border: 1px solid green;
  margin: auto;
}
.inlineblock {
  display: inline-block;
  vertical-align: top;
  background: red;
  min-width: 100px;
  min-height: 100px;
  border: 1px solid black;
}
<section id='wide'>
  <div class='wrap'>
    <div class='inlineblock'></div>
    <div class='inlineblock'></div>
  </div>
</section>
<p>
  When the red inline-blocks are forced to line break, how do you make a parent with display:inline-block (the green border) snap to fit? How do you get rid of all the extra horiztonal space in the lower green bordered div?
</p>
<section id='narrow'>
  <div class='wrap'>
    <div class='inlineblock'></div>
    <div class='inlineblock'></div>
  </div>
</section>

Ответ 1

Ты не можешь По умолчанию элементы inline-block имеют ширину сжатия:

Ширина усадки:
min(max(preferred minimum width, available width), preferred width).

Затем,

  • Когда preferred minimum width <= preferred width <= available width, ширина будет preferred width, как вы пожелаете.
  • Когда available width <= preferred minimum width <= preferred width, ширина будет preferred minimum width, по вашему желанию.
  • Когда preferred minimum width <= available width <= preferred width, ширина будет available width, даже если она вам не нравится.

Если вы действительно не хотите этого, я думаю, вы можете добавить слушатель события resize с помощью JS и установить желаемую ширину вручную.

Ответ 2

элементы inline-block не могут достигнуть этого расположения - как продемонстрировано @Oriol - но,

CSS Grid может достичь этого макета.

body {
  margin: 0;
}

ul {
  display: inline-grid;
  grid-template-columns: repeat(auto-fit, 100px);
  min-width: 50vw;
  
  /* decorative properties */
  grid-gap: 10px;
  padding: 0;
  list-style: none;
  border: 5px solid salmon;
  box-sizing: border-box;
  
  /* center the grid */ 
  position: relative;
  left: 50vw;
  transform: translateX(-50%);
}
li {
  background-color: lightblue;
  height: 100px;
}
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
  <li>13</li>
  <li>14</li>
  <li>15</li>
  <li>16</li>
  <li>17</li>
  <li>18</li>
  <li>19</li>
  <li>20</li>
  <li>21</li>
  <li>22</li>
</ul>

Ответ 3

Один из подходов, который я использовал, дает внешний вид родителя с выравниванием ширины дочернего содержимого:

  • Обернуть inline элемент в элемент inline-block или уровня block
  • Применить box-decoration-break: clone встроенный элемент. Примечание. В этом свойстве отсутствует поддержка IE/Edge.

От MDN:

CSS-свойство box-decor-break указывает, как следует отображать фрагменты элемента при разбивании на несколько строк, столбцов или страниц.

И немного о значении clone.

Каждый фрагмент блока отображается независимо с указанными рамкой, отступом и полем, обертывающим каждый фрагмент.

Без использования box-decoration-break: clone вы увидите на левом поле, как обрабатываются первые фрагменты текста после каждого переноса строки.

enter image description here

Хотя это правда, что с этим решением дополнительное пространство в родительском элементе все еще существует… enter image description here

… Это решение хорошо для решения визуальной проблемы: enter image description here

Вот оно в действии:

enter image description here

демонстрация

.outer {
  line-height: 1.4;
  padding: 2px 0;
  margin: 0.5em auto;
}

.outer>span {
  padding: 0.45rem;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
  background-color: blue;
  color: white;
  font-size: 1.5em;
}
<div class="outer">
  <span>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deleniti explicabo provident eaque qui, at facilis a, repudiandae</span>
</div>

<div class="outer">
  <span>Short text</span>
</div>