Оберните ВСЕ flex-элементы (например, flex-direction: column), если какой-либо один flex-элемент слишком широк для flex-контейнера - PullRequest
0 голосов
/ 04 марта 2020

Вариант использования для этого - адаптивная форма с переключателями. На большом экране P C все переключатели обычно помещаются в одну строку на экране (как элементы flex в негибкой упаковке flex с flex-direction: row). На телефоне не все переключатели обычно помещаются на одной линии. Если какая-то одна радио-кнопка не подходит, я хочу, чтобы все они отображали по одной в строке (например, флекс-элементы в гибком контейнере с flex-direction: column).

Это было бы легко, если бы я знал, как долго будет работать мое радио метки кнопок должны были быть, но я нет (они приходят из настраиваемой клиентом базы данных). enter image description here

Итак, что я хочу, это так:

<html>
  <head>
    <title>Responsive Radio Button</title>
    <style type="text/css">
      @media (min-width: 652px) {
        .flexContainer {
          display:flex;
          flex-direction: row;
        }
      }
      @media (max-width: 652px) {
        .flexContainer {
          display:flex;
          flex-direction: column;
        }
      }
      </style>
  </head>
  <body>
    <div class='flexContainer'>
      <div>Medium Length div</div>
      <div>Short div</div>
      <div>Longest div in this entire html page!</div>
      </div>
    </div>
  </body>
</html>

, где я не знаю, прежде чем это будет точка останова @media (min-width: /max-width:).

То, что я пробовал

Это код моей работы

<html>
  <head>
    <title>Responsive Radio Button</title>
    <style type="text/css">
      .flexContainer {
        display: flex;
        flex-wrap: wrap;
        justify-content:stretch;
        /** border so I can see what is going on */
        border: 1px dotted lightblue;
      }
      .flexItem {
        /** white-space and min-width stop text wrapping */
        white-space: nowrap; 
        min-width: max-content;
        /** next three lines could be shortened to flex: 1 0 0px; (grow shrink basis) */
        flex-basis: 0;
        flex-grow: 1;
        flex-shrink: 0;
        /** border and margin so I can see what is going on */
        border: 1px solid black;
        margin: 2px;
      }
      </style>
  </head>
  <body>
    <div class='flexContainer'>
      <div class='flexItem'>Medium Length div</div>
      <div class='flexItem'>Short div</div>
      <div class='flexItem'>Short div</div>
      <div class='flexItem'>Short div</div>
      <div class='flexItem'>Longest div in this entire html page!</div>
      </div>
    </div>
  </body>
</html>

flex: 1 0 0 Используется для того, чтобы все элементы flex были равны в размер главной оси. Но когда начинается смещение, равенство размеров главной оси уменьшается. Если бы все flex-элементы оставались одинакового размера, все они были бы слишком длинными для родительского flex-контейнера в одно и то же время, так что все переносились бы. Однако этого не происходит, так как минимальный размер каждого изгибаемых элементов различен, поэтому, хотя изгибаемые элементы никогда не уменьшаются, все они начинают расти, заполняя оставшееся пространство, начиная с другого размера.

Как будто я хочу flex-basis: largest-sibling, под которым я подразумеваю, что самый маленький изгибаемый элемент начинался бы с того же размера, что и самый большой изгибаемый элемент, и никогда не становился бы меньше, чем самый большой изгибаемый элемент.

Ответы [ 3 ]

0 голосов
/ 04 марта 2020

Я думаю, что сетка CSS может дать самый точный ответ на ваши потребности

.flexContainer {
  display: grid;
  grid-template-columns: repeat(auto-fit,minmax(600px,1fr))
}
<div class='flexContainer'>
      <div>Medium Length div</div>
      <div>Short div</div>
      <div>Longest div in this entire html page!</div>
  </div>

Авторазмер столбцов в CSS сетка

Вы можете прочитать больше об этом здесь и настроить его, чтобы соответствовать ваши потребности

0 голосов
/ 06 марта 2020

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

1) Эта проблема является двумерной задачей .

Двумерная задача: решить с помощью display: grid;

Проблемы одного измерения: решить с помощью display: flex;

Я рассматривал эту проблему как проблему одного измерения, потому что я хотел, чтобы мои переключатели в одном случае были горизонтальными, а в другом - вертикальными - оба в одном измерении. Я был неправ, потому что он предполагает переход между вертикальным и горизонтальным, так что это двумерная проблема.

2) grid-auto-flow: column ;

Я также должен был выбрать произвольную ширину порта вида для перемещения от вертикального к горизонтальному и использовать оператор @media.

Этот ответ не идеален, он не одинаково изменяет размеры вариантов, когда они не находятся в одном линия horozontal, но она достигает того, что я искал:

<html>
  <head>
    <title>Responsive Radio Button</title>
    <style type="text/css">
      @media(max-width: 600px) {
        .resize {
          grid-template-columns: 600px;
        }
      }
      @media(min-width: 600px) {
        .resize {
          grid-auto-flow: column;
          grid-auto-columns: 1fr;
        }
      }
      .gridContainer {
        display: grid;

        /** border so I can see what is going on */
        border: 1px dotted lightblue;
      }
      .gridItem {
        /** white-space and min-width stop text wrapping **/
        white-space: nowrap; 
        min-width: max-content;
        /** border and margin so I can see what is going on */
        border: 1px solid black;
        margin: 2px;

      }
      </style>
  </head>
  <body>
    <div class='gridContainer resize'>
      <div class='gridItem'>Medium Length div</div>
      <div class='gridItem'>Short div</div>
      <div class='gridItem'>Short div</div>
      <div class='gridItem'>Short div</div>
      <div class='gridItem'>Longest div in this entire html page!</div>
      </div>
    </div>
  </body>
</html>
0 голосов
/ 04 марта 2020

Это то, что я сделал из твоего кода. Посмотрите, поможет ли это вам

<html>
  <head>
    <title>Responsive Radio Button</title>
    <style type="text/css">
      .flexContainer {
        display: flex;
        flex-wrap: wrap;
        justify-content:stretch;
        /** border so I can see what is going on */
        border: 1px dotted lightblue;
      }
      .flexItem {
        /** white-space and min-width stop text wrapping */
        white-space: nowrap; 
        min-width: max-content;
        /** next three lines could be shortened to flex: 1 0 0px; (grow shrink basis) */
        flex-basis: 0;
        flex-grow: 1;
        flex-shrink: 0;
        /** border and margin so I can see what is going on */
        border: 1px solid black;
        margin: 2px;
      }
      @media only screen and (max-width: 600px) {
        .flexContainer {
          flex-flow: column;
        }
      }

      </style>
  </head>
  <body>
    <div class='flexContainer'>
      <div class='flexItem'>Medium Length div</div>
      <div class='flexItem'>Short div</div>
      <div class='flexItem'>Short div</div>
      <div class='flexItem'>Short div</div>
      <div class='flexItem'>Longest div in this entire html page!</div>
      </div>
    </div>
  </body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...