когда я устанавливаю переполнение стиля div — прокрутка, выравнивание содержимого — гибкий запуск, перенос макета flex неверен

#css #flexbox #overflow

#css #flexbox #переполнение

Вопрос:

Если я установлю #main.overflow равно none, я получу то, что хочу.

И если я установлю #main.overflow — прокрутка, а это не то, что я хочу, последний элемент будет поврежден по ошибке.

Почему полосы прокрутки вызывают ошибки гибкой компоновки?

правильный результат

   * {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
  }
  #main {
    overflow: none;
    width: 200px;
    background-color: #321;
    display: flex;
    flex-direction: row;
    padding: 10px;
    flex-wrap: wrap;
    justify-content: flex-start;
  }
  .el {
    width: 50px;
    height: 50px;
    background-color: red;
    margin: 5px;
  }  
 <div id="main">
  <div class="el"></div>
  <div class="el"></div>
  <div class="el"></div>
</div>  

неверный результат

   * {
    padding: 0;
    margin: 0;
    box-sizing: border-box;
  }
  #main {
    overflow: scroll;
    width: 200px;
    background-color: #321;
    display: flex;
    flex-direction: row;
    padding: 10px;
    flex-wrap: wrap;
    justify-content: flex-start;
  }
  .el {
    width: 50px;
    height: 50px;
    background-color: red;
    margin: 5px;
  }  
 <div id="main">
  <div class="el"></div>
  <div class="el"></div>
  <div class="el"></div>
</div>  

Ответ №1:

Простой ответ: полосы прокрутки занимают место внутри div. Если вы заставляете их отображать с помощью настройки overflow: scroll , вы занимаете часть пространства внутри flexbox, а flex: wrap свойство вызывает перенос содержимого.

Ваш main flexbox может обрабатывать содержимое шириной 180 пикселей *.

Ширина содержимого также составляет ровно 180 пикселей**

Это не оставляет места для полос прокрутки, и содержимое переносится на следующую строку.

Существует устаревшее свойство: overflow: overlay из-за которого полосы прокрутки не занимают места, но оно имеет очень ограниченную поддержку и устарело, поэтому я бы не рекомендовал его использовать.


* Потому что ширина установлена на 200 пикселей, что включает в себя отступы по 10 пикселей с каждой стороны. box-sizing: border-box Свойство делает так, чтобы отступы включались в расчет высоты и ширины

** Каждый el имеет ширину 60 пикселей, включая поля с обеих сторон.

Комментарии:

1. Мне нужна рамка. На самом деле, я использовал его в приложении Electron. План 1 действительно прост в использовании. Спасибо. Я продолжаю проверять, будет ли electron упаковываться в браузере. Если это так, эта схема идеальна.