css flex столбец авто высота - PullRequest
0 голосов
/ 25 декабря 2018

Я создаю мега-меню, стараясь соответствовать современным стандартам;CSS, jquery, bootstrap.

Google Images - Мега-меню

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

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

.container {
  width: 800px;
  height: 100px;
  display: flex;
  flex: 1 1 auto;
}

.container .wrap {
  display: flex;
  flex: 1 1 auto;
  flex-flow: column wrap;
  align-content: flex-start;
}

.container .wrap .item {
  width: 150px;
}
<div class="container">
  <div class="wrap">
    <div class="item">Item 1<br>a<br>b</div>
    <div class="item">Item 2<br>a</div>
    <div class="item">Item 3<br>a<br>b<br>c<br>d</div>
    <div class="item">Item 4<br>a</div>
    <div class="item">Item 5<br>a</div>
  </div>
</div>

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

Теперь я пытаюсь увеличить высотукаждое подменю по мере необходимости.Лучшее решение состоит в том, чтобы обнаружить переполнение ширины и увеличить высоту для компенсации.

Я пробовал нативные JS и jQuery, я, кажется, застреваю, запуская их в функцию.Я могу обнаружить переполнение и увеличить высоту, как мой код ниже.Я хочу, чтобы операторы if были в цикле и выходили, когда больше не было переполнения, и заканчивались идеальной подгонкой.

EDIT Текущее рабочее решение

$(function () {
    $(".container").each( function( index, element ){
        var my_height = $(element).outerHeight();

        if( $(element).prop('scrollWidth') > $(element).outerWidth() ) {
            while( $(element).prop('scrollWidth') > $(element).outerWidth() )
            {
                my_height += 100;
                $(element).css('height', my_height + "px");
            }
        }
    });
});

Работает точно так, как задумано.

РЕДАКТИРОВАТЬ

Обновлен вопрос.Есть ли лучшее решение?Что-то, что не связано с циклом над каждым элементом на каждой странице.Чистый CSS был бы хорош, но пока не думаю, что это возможно.

Решил мою проблему перехода.При попытке обновить высоту в цикле, как указано выше, переход CSS вмешивается и создает бесконечный цикл.Это было легко исправить, я добавил новый класс в .container .transition и добавил $(element).removeClass("transition"); в начало или цикл и $(element).addClass("transition"); в конец.Это удаляет переход CSS из внутреннего цикла и добавляет его обратно в конце.

FINAL EDIT

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

Ref https://developer.mozilla.org/en-US/docs/Web/CSS/columns

1 Ответ

0 голосов
/ 28 декабря 2018

Существует способ сделать это, используя чистый CSS, используя column Свойства CSS:

Базовый CSS:

.container {
    width: 800px;
}
.container .wrap {}
.container .wrap .item {
    width: 150px;
}

Чтобы иметь столбцыфиксированная ширина:

.container .wrap {
    column-width: 125px;
}

Иметь заданное количество столбцов:

.container .wrap {
    column-count: 5;
}

JSFiddle

Другой ответ, содержащий подробную информацию оподдержка браузера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...