CSS: преобразовать сетку в гибкий макет с различными дочерними элементами - PullRequest
0 голосов
/ 21 февраля 2019

В настоящее время я пытаюсь создать гибкий макет, который должен иметь 3 возможных дочерних элемента:

enter image description here

  • Если у оболочки есть только одинкнопка, она должна иметь полную ширину обертки.
  • Если у обертки есть два дочерних элемента, последняя должна иметь максимальную ширину 75 пикселей, а первая должна заполнять доступное пространство.
  • Если у оболочки есть все три дочерних элемента, первая строка должна быть такой же, как в предыдущем примере, но последний дочерний элемент должен быть в следующей строке с шириной 100%.

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

.wrapper {
    width: 60%;
    display: grid;
    display: -ms-grid;
    grid-template-columns: 1fr 75px;
    text-align: center;
    position: relative;
    margin-bottom: 20px;
}

.wrapper div+div {
    margin-left: 6px;
}

.wrapper div {
    background-color: yellow;
    padding: .6em 1em;
    text-align: center;
}

.wrapper div.show.single-button {
  grid-column: 1/span 2;
}

.wrapper div.cancel {
    grid-column: 1/span 2;
    -ms-grid-row: 2;
    -ms-grid-column-span: 2;
    margin-top: 6px;
    margin-left: 0;
}
<div class="wrapper">
  <div class="show single-button">Show</div>
</div>

<div class="wrapper">
  <div class="show">Show</div>
  <div class="invoice">Invoice</div>
</div>

<div class="wrapper">
  <div class="show">Show</div>
  <div class="invoice">Invoice</div>
  <div class="cancel">Cancel</div>
</div>

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Вы можете использовать flex-based, чтобы указать начальную ширину элементов, и flex-grow, чтобы указать, должны ли они занимать больше места, и выполнить flex-wrap, чтобы он не вынуждает их помещаться в одну строку, например:

.wrapper {
  display: flex;
  flex-wrap: wrap; // make it multiline
  margin-bottom: 1rem;
}

.wrapper div {
  background: yellow;
  margin: .2rem;
  padding: .2rem;
  text-align: center;
}

.invoice {
  flex-basis: 75px; // make it have 75px
  flex-grow: 0; // can't grow
  flex-shrink: 0; // can't shrink
}

.show {
  flex-grow: 1; // no basis width, just grow and take the space left from .invoice
}

.cancel {
  flex-basis: 100%; // takes the whole width so it must go on a single row
}

https://codepen.io/anon/pen/KJLqVj

0 голосов
/ 21 февраля 2019

Flexbox предлагает все необходимое для этого.Не нужно взламывать, смешивая flexbox с коробочной моделью или width свойствами:

.wrapper {
  height: 100px;
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 10px;
}

.wrapper > div {
  flex: 1;
  border: 1px dotted #999;
  background-color: aliceblue;
}

.wrapper > div:nth-child(2) {
  flex-shrink: 0;
  flex-grow: 0;
  flex-basis: 75px;
  -webkit-flex-basis: 75px;
}

.wrapper > div:nth-child(3) {
  flex-shrink: 0;
  flex-grow: 0;
  flex-basis: 100%;
  -webkit-flex-basis: 100%;
}
<div class="wrapper">
  <div>1</div>
</div>

<div class="wrapper">
  <div>1</div>
  <div>2</div>
</div>

<div class="wrapper">
  <div>1</div>
  <div>2</div>
  <div>3</div>
</div>
0 голосов
/ 21 февраля 2019

Разумное использование flex:1 и flex-wrap, кажется, работает.

* {
  box-sizing: border-box;
}

.wrapper {
  width: 60%;
  margin: auto;
  display: flex;
  flex-wrap: wrap;
  margin-bottom: 20px;
  justify-content: space-between;
  border: 1px solid green;
}

.wrapper div {
  background-color: lightblue;
  padding: .6em 1em;
  text-align: center;
  margin: 6px;
}

.wrapper div.show {
  flex: 1;
}

.wrapper div.invoice {
  flex: 1;
  max-width: 75px;
}

.wrapper div.cancel {
  flex: 1 1 100%;
}
<div class="wrapper">
  <div class="show single-button">Show</div>
</div>

<div class="wrapper">
  <div class="show">Show</div>
  <div class="invoice">Invoice</div>
</div>

<div class="wrapper">
  <div class="show">Show</div>
  <div class="invoice">Invoice</div>
  <div class="cancel">Cancel</div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...