Непредсказуемые привычки упаковки CSS - PullRequest
0 голосов
/ 22 мая 2018

Я получил эту простую установку с 3-мя элементами в flex-box.Они являются оправданным пространством между ними.Средний элемент .center имеет ширину 100%.По какой-то причине дочерние элементы (ссылки) переносятся независимо от ширины окна.

Каков механизм, приводящий к тому, что ссылки переносятся на следующую строку? Там достаточно места.Почему div .center не берет 100% оставшегося пространства, чтобы они не переносились.И как мне предотвратить это перенос?

PS: я хочу, чтобы .center div занимал 100% промежутка между ними.

<div class="header">
<h1>Title</h1>
<div class="center">
  <h1>
    TEST TEXT
  </h1>
</div>
<div class="nav">
    <a>A Link</a>
    <a>Another Link</a>
    <a>A Third Link</a>
</div>

.header {
    background: #ccc; 
    display: flex;
    justify-content: space-between;
}

.nav{

  width: fit-content;
}

.center{
  width:100%;
  background: lightblue;
  text-align: center;
}

div a{
  background: tomato;
}

Смотрите здесь: http://jsfiddle.net/vsx239v1/

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Измените 100% на авто;

.center{
 width:auto;
  background: lightblue;
  text-align: center;
}

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

0 голосов
/ 22 мая 2018

Чтобы понять, почему ваши элементы навигации обертываются, вам нужно понять, как работает flexbox.Я собираюсь кратко объяснить это простыми словами, но ниже вы найдете ссылку с полным и точным объяснением.

Первоначально вы установили один элемент на 100% ширины, а все остальное оставили по умолчанию.ценности.Здесь используются следующие важные значения:

В вашем случае очевидно, что у нас переполнение, поскольку один элемент установлен на width:100%, а другой на автоматический, НО механизм flexbox сократит ваш элемент и будетраспределите отрицательное свободное пространство 1 для гибких элементов во избежание переполнения.

В вашем случае первый элемент h1 больше не может сжиматься, так как егоwidth равно его минимальному содержанию, поэтому только ваш элемент .center и навигация уменьшатся, и это произойдет независимо от размера браузера, потому что у нас всегда будет отрицательное свободное пространство , так как *Элемент 1037 * имеет значение width:100%.

Если, например,вы устанавливаете flex-shrink:0 на элемент nav, у вас не будет обтекания, потому что вы отключите сжатие для этого, и все отрицательное свободное пространство будет добавлено к элементу .center (это может быть исправлением, но нелучший)

.header {
    background: #ccc; 
    display: flex;
    justify-content: space-between;
}
h1 {
 font-size:11px;
}

.center{
  width:100%;
  background: lightblue;
  text-align: center;
}

.nav {
  flex-shrink:0;
}

div a{
  background: tomato;
}
<div class="header">
    <h1>Title</h1>
    <div class="center">
      <h1>
        TEST TEXT
      </h1>
    </div>
    <div class="nav">
        <a>A Link</a>
        <a>Another Link</a>
        <a>A Third Link</a>
    </div>
</div>

Если вы отключите коэффициент сжатия для всех элементов , у нас будет переполнение , поскольку отрицательное свободное пространство не будет распределено:

.header {
    background: #ccc; 
    display: flex;
    justify-content: space-between;
}
h1 {
 font-size:11px;
}

.center{
  width:100%;
  background: lightblue;
  text-align: center;
  flex-shrink:0;
}

.nav {
  flex-shrink:0;
}

div a{
  background: tomato;
}
<div class="header">
    <h1>Title</h1>
    <div class="center">
      <h1>
        TEST TEXT
      </h1>
    </div>
    <div class="nav">
        <a>A Link</a>
        <a>Another Link</a>
        <a>A Third Link</a>
    </div>
</div>

Если вы установите flex-wrap:wrap для контейнера, мы больше не будем рассматривать отрицательное свободное пространство и сжатие, как будто недостаточно места, которое будут обертывать элементы:

.header {
    background: #ccc; 
    display: flex;
    justify-content: space-between;
    flex-wrap:wrap;
}
h1 {
 font-size:11px;
}

.center{
  width:100%;
  background: lightblue;
  text-align: center;
}

div a{
  background: tomato;
}
<div class="header">
    <h1>Title</h1>
    <div class="center">
      <h1>
        TEST TEXT
      </h1>
    </div>
    <div class="nav">
        <a>A Link</a>
        <a>Another Link</a>
        <a>A Third Link</a>
    </div>
</div>

Чтобы исправить все это, вам нужно избегать свободного отрицательного пространства и сделать общую ширину не превышающей ширину контейнера.Вместо использования width:100% вы можете рассмотреть свойство flex-grow, которое позволит элементу расти, чтобы заполнить свободное пространство.

.header {
    background: #ccc; 
    display: flex;
    justify-content: space-between;
}
h1 {
 font-size:11px;
}

.center{
  flex-grow:1;
  background: lightblue;
  text-align: center;
}
div a{
  background: tomato;
}
<div class="header">
    <h1>Title</h1>
    <div class="center">
      <h1>
        TEST TEXT
      </h1>
    </div>
    <div class="nav">
        <a>A Link</a>
        <a>Another Link</a>
        <a>A Third Link</a>
    </div>
</div>

Вот хорошая ссылка для лучшего понимания алгоритма flexbox с учетом всех свойств: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Controlling_Ratios_of_Flex_Items_Along_the_Main_Ax


(1) Отрицательное свободное пространство : у нас есть отрицательное свободное пространство, когда естественный размер элементов увеличивается на больше, чем доступное пространство в гибком контейнере.

0 голосов
/ 22 мая 2018

Вам нужно использовать flex-grow: 1 вместо width: 100%.

Также здесь width: fit-content; бесполезно:

.header {
    background: #ccc; 
    display: flex;
    justify-content: space-between;
}

.center{
  flex-grow: 1;
  background: lightblue;
  text-align: center;
}

div a{
  background: tomato;
}
<div class="header">
<h1>Title</h1>
<div class="center">
  <h1>
    TEST TEXT
  </h1>
</div>
<div class="nav">
    <a>A Link</a>
    <a>Another Link</a>
    <a>A Third Link</a>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...