Flexbox: элементы переменной / динамической высоты с переносом столбцов - PullRequest
0 голосов
/ 09 октября 2019

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

Ниже приведена основная задача, где левый макет предназначен для мобильных устройств, а правый - для настольных ПК:

enter image description here

Содержание синего, фиолетового и желтого div может варьироваться , поэтому высота регулируется. Фиолетовый и желтый блок всегда должны быть на стороне серого + синего блока на рабочем столе.

Сейчас у меня это работает только для 3 столбцов, но «динамическая» высота дублируется на все столбцы: Bootstrap 4: боковая панель между столбцами на мобильном устройстве. Столбцы под макетом друг друга

Чтобы дать вам четкое представление о возможностях, вот несколько вариантов рабочего стола: enter image description here

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

Я нехотите использовать какой-нибудь сбойный JavaScript или неподдерживаемый grid-css.

Ждем идей / предложений! Приветствия.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Вы должны иметь возможность заставить этот макет работать с комбинацией столбцов CSS (не сетки CSS) на «рабочем столе» и flexbox на «мобильном».

<div class="container">
    <div class="d-flex d-md-columns flex-column min-vh-100">
        <div class="d-md-inline-block light order-0">
            light
        </div>
        <div class="d-md-inline-block blue order-2">
            blue
        </div>
        <div class="d-md-inline-block purple order-1">
            purple
        </div>
        <div class="d-md-inline-block yellow order-3">
            yellow
        </div>
    </div>
</div>

Единственный дополнительный CSS, который выВам понадобится медиа-запрос для столбцов с большей (md) шириной рабочего стола. Заказ на flexbox вступит в силу на мобильном телефоне.

@media (min-width: 768px) {
    .d-md-columns {
        display: inline-block !important;
        column-count: 2;
        -webkit-column-gap: 0
        -moz-column-gap: 0;
        column-gap: 0;
    }
}

https://www.codeply.com/go/QWIlredUTk

Это работает специально для этой 4-колоночной разметки. Однако, вообще говоря, столбцы flexbox НЕ совмещаются по вертикали, как макет «кирпичной кладки»: Возможно ли гибкое выравнивание элементов к элементам над ними?

1 голос
/ 10 октября 2019

Я думаю, что для этого не существует чистого решения CSS (по крайней мере, без использования CSS-grid или display: contents ). Каждый CSS-способ, который, как я думал, имел ошибки: простой float и столбец flexbox не работают в данном конкретном случае.

Колонка flexbox не может правильно обернуть элемент, если мы работаем с контентом без фиксированной высоты, а float не может создатьмакет « кладка ». Также Bootstrap card-columns не является решением, потому что ваша основная цель - выровнять левую и правую колонку по высоте.

Я знаю, вы не хотите блестящий javascript , но я думаю, что необходимо создать свой макет. Итак, я отправляю вам свое решение ( решение jquery ) без использования какого-либо класса d-none для предотвращения дублирования проблем HTML и SEO.

Более того, вы используете Bootstrap, и эта среда делает обширнойиспользование jQuery, так что, думаю, не проблема попросить jQuery о небольшой помощи. Эта справка:

  function move(){
    if($(".main .col-lg-8").css('display')=='block'){
      $('.purple').insertAfter('.gray');
    } else {
      $('.purple').insertBefore('.yellow'); 
    }
  }

  $(window).resize(function(){move()})
  $(document).ready(function(){move()})

Чтобы переместить наш фиолетовый div во вторую позицию, когда .col-lg-8 имеют display:block

Это весь код в действии:

function move(){
  if($(".main .col-lg-8").css('display')=='block'){
    $('.purple').insertAfter('.gray');
  } else {
    $('.purple').insertBefore('.yellow'); 
  }
}

$(window).resize(function(){move()})
$(document).ready(function(){move()})
.gray{
  background-color: gray;
}

.blue{
  background-color: blue;
}

.purple{
  background-color: purple;
}

.yellow{
  background-color: yellow;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>

<div class="container mt-5">
  <div class="row main">
      <div class="col-lg-4 d-lg-flex flex-lg-column">
        <div class="gray mb-4">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sodales finibus faucibus. Morbi blandit neque a diam laoreet pellentesque. Vivamus in orci sed turpis posuere iaculis quis sed augue. Curabitur lorem magna, bibendum vitae vestibulum nec faucibus. Morbi blandit neque a diam laoreet pellentesque. Vivamus in orci sed turpis posuere iaculis quis sed augue. Curabitur lorem magna, bibendum vitae vestibulum nec, feugiat eget justo. Ut aliquam quis velit non euismod. Ut vehicula, sem quis cursus pretium, purus libero tincidunt eros, vitae hendrerit nisi mi vitae erat. Curabitur augue purus, sagittis tempor volutpat quis, congue sed mi. Sed gravida odio sed orci iaculis tincidunt. Etiam ac mauris sit amet turpis consequat fermentum ut vitae sem. Aliquam tincidunt convallis sem.</div> 
        <div class="blue flex-fill mb-4 mb-lg-0">
        Lorem ipsum dolor sit amet, consectetur.Quisque sodales finibus </div>
      </div>
      <div class="col-lg-8 d-lg-flex flex-lg-column">
        <div class="purple mb-4">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. faucibus. Morbi blandit neque a diam laoreet pellentesque. Vivamus in orci sed turpis posuere iaculis quis sed augue. Curabitur lorem magna, bibendum vitae vestibulum nec, feugiat eget justo. Ut aliquam quis velit non euismod. Ut vehicula, sem quis cursus pretium, purus libero tincidunt eros, vitae hendrerit nisi mi vitae erat. Curabitur augue purus, sagittis tempor volutpat quis, congue sed mi. Sed gravida odio sed orci iaculis tincidunt. Etiam ac mauris sit amet turpis consequat fermentum ut vitae sem. Aliquam tincidunt convallis sem. </div>
        <div class="yellow flex-fill">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit.</div>
      </div>
  </div>
</div>

В ожидании чистого решения CSS, это может быть путь.

...